削除ボタンを特定の条件でのみアクティブにしたいCGgridView
CButtonColumn
(またはカスタム削除ボタンを作成したい)。たとえば、user=='admin'
またはstatus=='draft'
。何か案は?ありがとう!
4 に答える
「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;
}
Mukesh の投稿で zuups が述べているように、一重引用符を使用する必要があります。ステータスがモデルインスタンスのプロパティである場合、user1584901は答えが正しいです。そう、
'visible'=>'$data->status=="draft" || Yii::app()->user->checkAccess("admin")',
正しい。(一番下に説明あり)
あなたができる面白いこともいくつか追加したいと思います。たとえば、資産を持つユーザーを考えてみましょう。この場合、アセットを持っていないユーザーにのみ削除ボタンを追加したいと思います。
この場合、次のようなユーザー モデルでリレーションを作成できます。
'haveAssets' = array(self::STAT,'Asset', 'asset_id','select'=>'1')
ユーザーがアセットを持っている場合は 1 を返し、そうでない場合は 0 を返します。そして、visible パラメータを次のように定義します。
'visible' => '!$data->haveAssets',
これがすべて機能する理由 (0x7fffffff の質問による) は、Yii が visible で定義された文字列を使用して、ボタン (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;
これは CComponent クラスで定義されています: 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 関数が変数 $data (問題の行のモデル インスタンス) と $row (これらはすべて extract 関数を使用して) を利用可能にし、文字列式を PHP コードとして評価します。したがって、$data または $row への言及は、このスコープ内の evaluteExpression 関数によって既に設定されている変数を使用します。そのため、それぞれの行のそれぞれのモデル インスタンスを使用できます (例の $data->status または $data->haveAssets として)。文字列は、ボタンの可視性を決定するブール値を返す式である必要があることに注意してください。
文字列を一重引用符で囲む必要がある理由は、二重引用符を使用している間、php は $ で始まるすべての文字列を変数と見なし、その変数値に置き換えようとするからです。スコープ内では $data 変数は無意味 (または定義可能) であるため、エラーがスローされるか、誤解を招くように置き換えられます。一重引用符を使用すると、この動作を防ぐことができます。