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;
}
},
],
このアプローチが正しいかどうか教えてください。
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を使用することをお勧めします。
これはうまくいきます
_[
'label' => 'Executive Name',
'attribute' => 'cs.first_name',
'visible' => 'Condition' ? true : false
],
_
このパラメーターが適切に機能する場合は、テキスト_'Condition'
_を自分の条件に置き換えることができます。たとえば、Yii::$app->user->can('supervisor')
と言います。
私にとってはうまくいき、$ 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}
],