Trying to get property of non-object in action column in yii2 -
i've customized query in framesearch model , build query findbysql. i'm trying customize action column. gridview looks fine except action column. getting error -
framesearch model code -
<?php namespace frontend\modules\framestock\models; use yii; use yii\base\model; use yii\data\activedataprovider; use frontend\modules\framestock\models\frame; use frontend\modules\framestock\models\poitemframe; use yii\db\query; use yii\db\command; /** * framesearch represents model behind search form `frontend\modules\framestock\models\frame`. */ class framesearch extends frame { public $purchase; /** * @inheritdoc */ public function rules() { return [ [['f_id'], 'integer'], [['f_brand', 'f_name','purchase'], 'safe'], ]; } /** * @inheritdoc */ public function scenarios() { // bypass scenarios() implementation in parent class return model::scenarios(); } /** * creates data provider instance search query applied * * @param array $params * * @return activedataprovider */ public function search($params) { $subquery1 = (new query())->select(['poi_framename','sum(poi_qty) purchased'])->from ('poitemframe')->join('left join','frame','frame.f_name = poitemframe.poi_framename')->groupby('poi_framename'); $subquery2 = (new query())->select(['o_frame','count(o_frame) sold'])->from ('orders')->join('left join','frame','frame.f_name = orders.o_frame')->groupby('o_frame'); $query = (new query())->select(['f_brand','f_name','coalesce(pt.purchased,0)as purchased' , 'coalesce(st.sold,0) sold', '(coalesce(pt.purchased,0) - coalesce(st.sold,0)) stock'])->from ('frame')->leftjoin(['pt' => $subquery1],'pt.poi_framename = frame.f_name')->leftjoin(['st' => $subquery2],'st.o_frame = frame.f_name'); // ->joinwith(['purchase']); // $items = $query // ->select([ // 'f_brand', // 'f_name', // 'sum(poitemframe.poi_qty) purchased', // ]) // //->where(['stock.product_id'=>3]) // ->groupby('f_name') // ->all(); // add conditions should apply here $dataprovider = new activedataprovider([ 'query' => $query, ]); $this->load($params); if (!$this->validate()) { // uncomment following line if not want return records when validation fails // $query->where('0=1'); return $dataprovider; } // grid filtering conditions $query->andfilterwhere([ 'f_id' => $this->f_id, ]); $query->andfilterwhere(['like', 'f_brand', $this->f_brand]) ->andfilterwhere(['like', 'f_name', $this->f_name]); return $dataprovider; } }
index.php
<?php use yii\helpers\html; use yii\grid\gridview; use yii\db\query; use yii\db\command; /* @var $this yii\web\view */ /* @var $searchmodel frontend\modules\framestock\models\framesearch */ /* @var $dataprovider yii\data\activedataprovider */ $this->title = 'frames'; $this->params['breadcrumbs'][] = $this->title; ?> <div class="frame-index"> <h1><?= html::encode($this->title) ?></h1> <?php // echo $this->render('_search', ['model' => $searchmodel]); ?> <?= gridview::widget([ 'dataprovider' => $dataprovider, 'filtermodel' => $searchmodel, 'columns' => [ ['class' => 'yii\grid\serialcolumn'], 'f_brand', 'f_name', 'purchased', 'sold', 'stock', [ 'class' => 'yii\grid\actioncolumn', 'template' => '{ledger}', 'buttons' => [ 'ledger' => function ($url, $model) { return html::a( '<span class="glyphicon glyphicon-eye-open"></span>', ['/frame/ledger', 'f_name' => $model->f_name], [ 'title' => 'ledger', 'data-pjax' => '0', ] ); }, ], ], ], ]); ?> </div>
update
please tell me how resolve this. want f_name action column button i'll pass page filter grid.
i recommend use arrayhelper::getvalue .
for example:
arrayhelper::getvalue($model, 'f_name')
will work when $model
object (model
or activerecord
), array or empty (=null
). moreover, has 3nd argument default value:
arrayhelper::getvalue($model, 'f_name', 'value returned when attribute not found in $model')
Comments
Post a Comment