How to handle anoymous function using two models

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

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){

        }

]



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

]);



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!

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?