10

削除ボタンを特定の条件でのみアクティブにしたいCGgridView CButtonColumn(またはカスタム削除ボタンを作成したい)。たとえば、user=='admin'またはstatus=='draft'。何か案は?ありがとう!

4

4 に答える 4

19

「visible」パラメータを使用 -

 'buttons'=>array
    (
        'delete' => array
        (
            'label'=>'Delete',
            //other params
            'visible'=>!Yii::app()->user->checkAccess('admin'),
        ),
于 2012-02-24T16:02:30.647 に答える
9
'visible'=>'$data->status=="draft" || Yii::app()->user->checkAccess("admin")'
于 2012-08-08T08:43:02.000 に答える
6

PHP >= 5.3 の場合、無名関数も使用できます。

'visible'=>function($row, $data) {
    return Yii::app()->user->checkAccess('admin') || 'draft' == $data->status;
}
于 2012-02-24T23:24:37.573 に答える
3

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 変数は無意味 (または定義可能) であるため、エラーがスローされるか、誤解を招くように置き換えられます。一重引用符を使用すると、この動作を防ぐことができます。

于 2013-12-19T17:05:55.890 に答える