CGridView条件付き削除ボタン
-
12-11-2019 - |
質問
DELETEボタンは、CGgridView
CButtonColumn
(またはカスタム削除ボタンを作成する)でのみアクティブになっている(またはuser=='admin'
またはstatus=='draft'
の場合)に照らされます。何か案は?ありがとう!
解決
「Visible」パラメータを使用 -
'buttons'=>array
(
'delete' => array
(
'label'=>'Delete',
//other params
'visible'=>!Yii::app()->user->checkAccess('admin'),
),
. 他のヒント
'visible'=>'$data->status=="draft" || Yii::app()->user->checkAccess("admin")'
. PHP>= 5.3 の場合は、匿名関数を使用することもできます。
'visible'=>function($row, $data) {
return Yii::app()->user->checkAccess('admin') || 'draft' == $data->status;
}
. ZUUPSとしてMUKESH POSTでは、一重引用符を使用する必要があります。そして、Statusがモデルインスタンスのプロパティである場合には、user1584901が答えて正しいです。だから、
'visible'=>'$data->status=="draft" || Yii::app()->user->checkAccess("admin")',
.
が正しいです。 (下部の説明)
私はあなたができるいくつかの興味深いものを追加したいです。 たとえば、資産を持つユーザーを検討してください。この場合、削除ボタンをアセットがないユーザーにのみ追加します。
この場合は、などのユーザーモデルに関係を作成できます。
'haveAssets' = array(self::STAT,'Asset', 'asset_id','select'=>'1')
.
ユーザーが資産がある場合は1を返します。
可視パラメータをとして定義します。
'visible' => '!$data->haveAssets',
.
これが(0x7FFFFFFFFの依頼されているとおり)このうち(0x7FFFFFFFFFで尋ねる)は、ボタン(RenderButton)をレンダリングする関数内でevaluateExpression関数に適用するように定義されている文字列を使用するためです。
から: https:// github.com/yiisoft/yii/blob/1.1.14/framework/zii/widgets/grid/cbuttoncolumn.php 337
protected function renderButton($id,$button,$row,$data)
{
if (isset($button['visible']) && !$this->evaluateExpression($button['visible'],array('row'=>$row,'data'=>$data)))
return;
.
componentクラスで定義されている: https://github.com/yiisoft/yii/blob. /1.1.14/framework/base/ccomponent.php 行607
public function evaluateExpression($_expression_,$_data_=array())
{
if(is_string($_expression_))
{
extract($_data_);
return eval('return '.$_expression_.';');
}
else
{
$_data_[]=$this;
return call_user_func_array($_expression_, $_data_);
}
}
.
基本的に、evaluateExpression関数が変数$データ(問題の行のモデルインスタンスである)と$ ROW(extract関数を使用することによってすべてのもの)を使用可能にし、PHPとして文字列式を評価することです。コード。そのため、$ DATAまたは$ ROWへの言及は、このスコープのEvaluteExpression関数によって既に設定されている変数を使用します。 そのため、それぞれの行のそれぞれのモデルインスタンス($ data-> status、または$ Data-> EvaueSets)のそれぞれのモデルインスタンスを使用することができます。 文字列は、ボタンの可視性を判断するためのブール値を返す式であるべきです。
文字列を一重引用符で囲む必要がある理由は、二重引用符を使用している間、PHPは$で始まる文字列が変数であり、それをその変数値と置き換えるようにします。範囲では$ DATA変数が意味がない(または定義されている可能性がある)ので、エラーをスローしたり、誤って交換したりします。この動作をするのを防ぐための一重引用符を使用する。