Как создать собственный ActionColumn в gridView yii2?

У меня есть gridView, и мне удалось заставить его содержать нужные мне данные, но дальше мне нужно создать столбец, содержащий две кнопки для has_facebook и has_twitter.

<?=
 GridView::widget([
     'dataProvider'=>$dataProvider,
     'filterModel' =>$searchModel,
     'columns'     =>[
         ['class'=>'yii\grid\SerialColumn'],
         'name',
         'cm_name',
         'has_facebook',
         'has_twitter',             
         ['class'=>'yii\grid\ActionColumn'],
     ],
 ]);
?>

имя | см_имя | платформы

аккаунт1 | Джек | бтн1 бтн2

где btn1 и btn2 относятся к facebook и twitter.

извините за изуродованный стол.


person tareq    schedule 28.04.2014    source источник


Ответы (2)


Вам не нужно создавать собственный класс столбца. Вы можете создать простую необработанную колонку и показывать там все, что хотите:

[
    'attribute' => 'some_title',
    'format' => 'raw',
    'value' => function ($model) {                      
            return '<div>'.$model->id.' and other html-code</div>';
    },
],

Эта функция

function ($model) {                      
    return '<div>'.$model->id.' and other html-code</div>';
}

функция обратного вызова имен. Существует основной метод evaluateExpression в CComponent. :

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_);
    }
}

в нашем случае выражение не является строкой, это функция, поэтому она запускает php-метод call_user_func_array и передать в него свою модель.

person Alex    schedule 28.04.2014
comment
большое спасибо, это не первый раз, когда вы мне помогаете, вы очень помогли мне и остальной команде. @Alex Алекс, только одно, как функция может видеть модель $? где он определен, я пытался определить новый, но не сработал. - person tareq; 29.04.2014
comment
не говоря уже о моем комментарии, я сначала не понял, что $model представляет текущий экземпляр обрабатываемой модели, еще раз спасибо: D @Alex - person tareq; 29.04.2014
comment
вернуть '‹div›'. Html::encode($model-›id).' и другой html-код‹/div›'; - person amit bakle; 08.08.2015

Просто совет: если вы визуализируете сложные данные, это было бы полезно в Yii2..

echo yii\grid\GridView::widget([
  'dataProvider' => $dataProvider,
  'columns' => [
    'id',
    [
      'attribute' => 'Details',
      'format' => 'raw',
      'value' => function ($model) {
        return $this->render('//path/to/view.php', ['model' => $model]);
      },
    ]
  ]
]);

или вы можете использовать

echo \yii\widgets\ListView::widget([
    'dataProvider' => $dataProvider,
    'itemView' => '//path/to/view.php',
]);

и частичное представление может быть чем-то вроде

<?= Html::img('@web/user/images' . $model->id . '.jpeg', ['alt' => 'Profile Picture', 'class' => 'img img-rounded']); ?>
<?= Html::encode($model->firstName) ?> <?= Html::encode($model->lastName) ?>,
living in <?= Html::encode($model->city) ?> <?= Html::encode($model->country) ?>
person amit bakle    schedule 08.08.2015