web-dev-qa-db-ja.com

Yii2 GridViewは条件付きで列を非表示にします

Yii2 GridViewウィジェットにいくつかの列を表示していますが、「エグゼクティブ名」はその1つですが、エグゼクティブがログインしているときではなく、スーパーバイザーがログインしているときにのみ表示されます。

私がゼロに見えるようにハードコーディングしているとき、それは次のように表示されません:

[
    'label' => 'Executive Name',
    'attribute' => 'cs.first_name',
    'visible' => '0',
],

しかし、条件付きで次のようなものを表示したいと思います。

[
    'label' => 'Executive Name',
    'attribute' => 'cs.first_name',
    'visible' => function ($data) {
        if ($data->hc_customersupport->is_supervisor) {
            return '1'; // or return true;
        } else {
            return '0'; // or return false;
        }
    },
],

このアプローチが正しいかどうか教えてください。

12
K Arun Singh

yii\grid\DataColumnは、 visible プロパティを持つyii\grid\Columnから拡張されています。ドキュメントからわかるように、ブール値のみを受け入れますが、ブール値を返す式を渡すことにより、それらを動的に計算できます。 RBACの例:

use Yii;

...

'visible' => Yii::$app->user->can('supervisor'),

Callableを渡すことは許可されておらず、意味がありません。これについて論理的に考えてください-なぜ列全体の可視性が具体的な行(モデル)に依存しているのですか?

P.S。整数や文字列ではなく、ブール値を返す必要があります。また、あなたの表現はこれだけに減らすことができます:

return $data->hc_customersupport->is_supervisor;

しかし、is_supervisorチェックは間違いなく間違っています。このように(モデルを介して)呼び出すことはできません。代わりにRBACを使用することをお勧めします。

16
arogachev

これはうまくいきます

_[
    'label' => 'Executive Name',
    'attribute' => 'cs.first_name',
    'visible' => 'Condition' ? true : false
],
_

このパラメーターが適切に機能する場合は、テキスト_'Condition'_を自分の条件に置き換えることができます。たとえば、Yii::$app->user->can('supervisor')と言います。

2
Angelus Roman

私にとってはうまくいき、$ rowvisible = 1と同じビューのレンダーでもう1つのアクションを実行します。モデル

class SomeClass extends \yii\db\ActiveRecord
{
    public $rowvisible;
...

コントローラ

public function actionIndex()
    {
        $rowvisible = 0;
        $searchModel = new PostSearch();
        $dataProvider = $searchModel->search(Yii::$app->request->queryParams);

        return $this->render('index', [
            'searchModel' => $searchModel,
            'dataProvider' => $dataProvider,
            'rowvisible'=>$rowvisible,
        ]);
    }

見る

[ 'attribute'=>'SomeAttribute',
  'visible' => ($rowvisible==1) ,
  'header' => 'Some Header',  
  'contentOptions' => ['style' => 'width: 4%; background-color:#f3d8d8;'],
  'headerOptions' => ['style'=>'font-weight: normal; font-size: 8pt;'],  
  'value'=>    function ($model) {some arithmetic}
],