web-dev-qa-db-fra.com

Yii2 GridView masquer la colonne de manière conditionnelle

J'affiche certaines colonnes dans le widget Yii2 GridView, `` Executive Name '' en fait partie, mais il ne devrait s'afficher que lorsqu'un superviseur est connecté et non pas lorsque Executive est connecté.

Lorsque je codage en dur visible à zéro, il ne s'affiche pas comme suit:

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

Mais je veux l'afficher conditionnellement quelque chose comme ceci:

[
    '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;
        }
    },
],

Veuillez indiquer si cette approche est correcte.

12
K Arun Singh

yii\grid\DataColumn est étendu de yii\grid\Column qui a la propriété visible . Comme vous pouvez le voir dans les documents, il accepte uniquement les valeurs booléennes, mais bien sûr, vous pouvez les calculer dynamiquement en passant une expression renvoyant une valeur booléenne. Exemple avec RBAC:

use Yii;

...

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

Passer callable n'est pas autorisé et n'a aucun sens. Pensez logiquement à cela - pourquoi la visibilité de la colonne entière dépend-elle de la ligne de béton (modèle)?

P.S. Vous devez renvoyer un booléen, et non un entier ou une chaîne. Votre expression peut également être réduite à ceci:

return $data->hc_customersupport->is_supervisor;

Mais is_supervisor check est définitivement faux, il ne faut pas l'appeler comme ça (via le modèle). Il vaut mieux utiliser RBAC à la place.

16
arogachev

Celui-ci fonctionne bien

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

Vous pouvez remplacer le texte 'Condition' Par votre condition, disons Yii::$app->user->can('supervisor') si ce paramètre fonctionne bien pour vous.

2
Angelus Roman

Pour moi ça marche, faites une action de plus avec $ rowvisible = 1 et même rendu de vue: Modèle

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

Manette

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,
        ]);
    }

Vue

[ '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}
],