tklustig
(Kipp Thomas)
November 1, 2017, 5:35pm
1
Hi guys,
following var_dump will give me back an empty array,unless array should have some values being in database. I use to render two models in Controller, but in anonymous function, I just can respond one model.
[list=1][]Is it possible to respond several models in anonymous function[ ]If yes,how it is possible[/list]
this will give me values as expected:
'value' => function($model) {
$model::find()->where(['id' => 1])->one();
var_dump($model);
die();
This will give me empty array:
'value' => function($model_ekontakt) {
$model_ekontakt=new EKontakt();
$model_ekontakt::find()->where(['id' => 1])->one();
var_dump($model_ekontakt);
die();
i use to show up two models in one GridView implemented in Controller like this:
.
.
.
return $this->render('create', [
'model_ekontakt' => $model_ekontakt,
'model' => $model
]);
I want to use this method with second model in anonymous function,not with first one,which doesn’t have ForeignKey id_person
public static function getNamen($model) {
try {
return Person::find()
->leftJoin('e_kontakt', 'person.id=e_kontakt.id_person')
->where(['e_kontakt.id_person' => $model::findOne([$model->id])->id_person])->all();
} catch (\Exception $error) {
return;
}
}
Yes it is possible. You can use a closures in closures thought references.
function ($model) use ($model_ekontakt){
}
PHP Closures
tklustig
(Kipp Thomas)
November 1, 2017, 7:28pm
3
This will give me an Syntaxerror. Obviously, yii doesn’t accept use, as u suggested
Error:
ParseError[
syntax error, unexpected 'use' (T_USE), expecting ']'
P.S.: I use anonymous function in GridView like this:
$gridColumn = [
[
'class' => 'kartik\grid\ExpandRowColumn',
'width' => '50px',
'value' => function ($model, $key, $index, $column) {
return GridView::ROW_COLLAPSED;
},
'detail' => function ($model, $key, $index, $column) {
return Yii::$app->controller->renderPartial('_expand', ['model' => $model]);
},
'headerOptions' => ['class' => 'kartik-sheet-style'],
'expandOneOnly' => true
],
[
'attribute' => $wird_dargestellt_fuer,
'label' => Yii::t('app', 'gehört zu'),
'format' => 'html',
'value' => ($model) use ($model_ekontakt){ //this will throw out parse error
.
.
.
]
@tklustig Your usage is incorrect. [color="#1C2837 "][size="2"]Closures [/size][/color]are not a Yii thing they are a built into PHP. Gridview accepts anonymous function and those are closures. You can use [color="#1C2837 "][size="2"]closures [/size][/color]in closures [color="#1C2837 "][size="2"] thought references[/size][/color]. Please refer to the PHP documentation link I posted.
[
'attribute' => $wird_dargestellt_fuer,
'label' => Yii::t('app', 'gehört zu'),
'format' => 'html',
'value' => ($model) use ($model_ekontakt){ //this will throw out parse error
]
should be
[
'attribute' => $wird_dargestellt_fuer,
'label' => Yii::t('app', 'gehört zu'),
'format' => 'html',
'content' => function ($model) use ($model_ekontakt){
}
]
tklustig
(Kipp Thomas)
November 2, 2017, 7:42am
5
Doesn’t help,too. I get no syntax error any more, but array of $model_ekontakt is empty
I assume, that dataProvider in Controller is faulty, but how to render dataProvider twice?
This is, how I render models in index.php
public function actionIndex() {
$model_ekontakt=new \common\modules\erweiterung\models\EKontaktSearch();
$searchModel = new KontaktAdresseSearch();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
$searchModel_telefon = new KontaktTelefonSearch();
$dataProvider_telefon = $searchModel_telefon->search(Yii::$app->request->queryParams);
$searchModel_ekontakt = new EKontaktSearch();
$dataProvider_ekontakt = $searchModel_ekontakt->search(Yii::$app->request->queryParams);
return $this->render('index', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
'dataProvider_telefon' => $dataProvider_telefon,
'searchModel_telefon' => $searchModel_telefon,
'dataProvider_ekontakt'=>$dataProvider_ekontakt,
'searchModel_ekontakt' => $searchModel_ekontakt,
]);
}
It’s absolutely necessary, that $model_ekontakt will be given as parameter for method, not $model !
[
'attribute' => $wird_dargestellt_fuer,
'label' => Yii::t('app', 'gehört zu'),
'format' => 'html',
'content' => function ($model) use ($model_ekontakt) {
var_dump($model_ekontakt); // array is empty here,but var_dump($model) is not !
die();
$namen = "";
$eKontakte = EKontakt::getNames($model_ekontakt);
foreach ($eKontakte as $kontakte) {
$namen .= "<div id=''><ul><li><span class='glyphicon glyphicon-earphone'></span>" . $kontakte->vorname . "," . $kontakte->nachname;
}
$namen .= "</div></ul></li>";
return $namen;
}
],
Here is GridView
<?=
GridView::widget([
'dataProvider' => $dataProvider, //how could i render $dataProvider_ekontakt here??
'filterModel' => $searchModel,
'columns' => $gridColumn,
.
.
It doesn’t look like your passing $model_ekontakt to the view so it can be used.
return $this->render('index', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
'dataProvider_telefon' => $dataProvider_telefon,
'searchModel_telefon' => $searchModel_telefon,
'dataProvider_ekontakt'=>$dataProvider_ekontakt,
'searchModel_ekontakt' => $searchModel_ekontakt,
'model_ekontakt'=>$model_ekontakt //<---this isn't being passed to the view
]);
tklustig
(Kipp Thomas)
November 2, 2017, 5:15pm
7
skworden:
It doesn’t look like your passing $model_ekontakt to the view so it can be used.
return $this->render('index', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
'dataProvider_telefon' => $dataProvider_telefon,
'searchModel_telefon' => $searchModel_telefon,
'dataProvider_ekontakt'=>$dataProvider_ekontakt,
'searchModel_ekontakt' => $searchModel_ekontakt,
'model_ekontakt'=>$model_ekontakt //<---this isn't being passed to the view
]);
Thx for ur efforts. Thread can be finished, 'cause I did solution in another way. I created relations in model an used them. I gave U reputation points for Ur help!
jkofsky
(Jkofsky)
November 2, 2017, 7:11pm
8
Isn’t $model_ekontakt=new EKontakt(); assigning a new instance to $model_ekontakt and not using the passed in instance?
Also shouldn’t it be $model_ekontakt->find()->where(…) instead?