Search code examples
phpgridviewyiiyii2

Yii gridview How to set editable option based on the data


This is my grid view code

<?= GridView::widget([
    'dataProvider' => $dataProvider,
    'filterModel' => $searchModel,
    'toolbar'=> [
        ['content'=>
            Html::a('<i class="glyphicon glyphicon-plus"></i> Add New', ['create'],['class'=>'btn btn-shadow btn-success'])
        ],
        '{toggleData}',
    ],
    'columns' => [
        ['class' => 'kartik\grid\SerialColumn'],
        [
            'attribute'=>'Name',
            'vAlign'=>GridView::ALIGN_MIDDLE,
        ],
        [
            'attribute'=>'Age',
            'vAlign'=>GridView::ALIGN_MIDDLE,
            'value'=>'Age',
            'width'=>'5%',
            'hAlign'=>'center',
        ],
        [
            'attribute'=>'Address',
            'vAlign'=>GridView::ALIGN_MIDDLE,
        ],
        [
            'class' => 'kartik\grid\EditableColumn',
            'attribute'=>'Status',
            'vAlign'=>GridView::ALIGN_MIDDLE,
            'hAlign'=>GridView::ALIGN_CENTER,
            'width'=>'15%',
            'filterType'=>GridView::FILTER_SELECT2,
            'filterWidgetOptions'=>[
                'options' => ['placeholder' => 'Search Status...'],
                'pluginOptions' => [
                    'allowClear' => true
                ],
            ],
            'value'=>function($model){
                return ($model->Status=='0'?'Pending':($model->Status=='1'?'Accepted':'Rejected'));},
            'filter'=>['Pending','Diterima'],
            'label' => 'Status',
            'refreshGrid'=>true,
            'editableOptions'=>[
                'format' => Editable::FORMAT_BUTTON,
                'asPopover' => true,
                'inputType' => Editable::INPUT_DROPDOWN_LIST,
                'data'=>['0'=>'Pending', '1'=>'Accepted', '2'=>'Rejected'],
                'options' => ['class'=>'form-control'],
            ]
        ],
        [
            'class' => 'kartik\grid\ActionColumn',
            'template' => '
                <li>{view}</li>
                <li>{update}</li>
                <li>{delete}</li>',
            'dropdown'=>true,
            'dropdownOptions'=>['class'=>'pull-right'],
            'headerOptions'=>['class'=>'kartik-sheet-style'],
        ],
    ],
    'panel'=>[
        'type'=>GridView::TYPE_DEFAULT,
    ]
]); ?>

Help me with the Status attribute. The result from this gridview is like this :
enter image description here

what i want is like this :
enter image description here

So, it's like when the Status is Pending, the editableOption is on.But when the Status is Accepted or Rejected, the editableOption is disable. Is that possible ?


Solution

  • You need Change value option of Status Attribute.

    Change in value option of Status Attribute.

    [
            'class' => 'kartik\grid\EditableColumn',
            'attribute'=>'Status',
              // ------- your code ------------
            'format'=>'raw',
            'value'=>function($model){
                  if($model->Status=='0')
                  {
                    // if status =0 than create button and append with string
                    $btn='<button type="button" id='.$model->id.' class="btn btn-default ><i class="fa fa-pencil-square-o"></i></button>';
                    return 'Pending'.$btn;
                  }
                  else
                  {
                    return($model->Status=='1'?'Accepted':'Rejected');
                  }
                },
            // ------- your code ------------
    
        ],