web-dev-qa-db-ja.com

yii2のgridViewでカスタムActionColumnを作成する方法は?

GridViewがあり、必要なデータを含めることができましたが、次に行う必要があるのは、has_facebookとhas_Twitterの2つのボタンを含む列を作成することです。

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

名前| cm_name |プラットフォーム

アカウント1 |ジャック| btn1 btn2

ここで、btn1とbtn2はFacebookとTwitterを指します。

変形したテーブルをごめんなさい。

12
tareq

独自の列クラスを作成する必要はありません。単純なraw列を作成して、必要なものを表示できます。

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

コールバック関数に名前を付けます。コアメソッドがあります CComponentのevaluateExpression

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 を実行し、モデルに渡します。

29
Alex

ヒント:複雑なデータをレンダリングしている場合、これは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) ?>
3
amit bakle