2016-10-23 6 views
0

Auf meinem System wissen, kann der Benutzer die Spalt mit dem Namen erstellen sie wollen, so ich spare die Spaltennamen in der DatenbankWie die Spaltennamen auf yii2 Gridview

ich auf Spaltenoptionen diesen Code verwende:

foreach((new Field)->listFields as $item){ 

    data = [ 
    'attribute' => $item->name, 
    'value' => function($model){ 
     return $model->$item->name; // the problem is here, $item->name is out of the scope 
    }, 
    ]; 
    array_push($columns, $data); 
} 

return $this->render('index', [ 
    'model' => $model, 
    'dataProvider' => $dataProvider, 
    'columns' => $columns, 
]); 

dies ist meine Indexansicht:

<?= \yii\grid\GridView::widget([ 
    'dataProvider' => $dataProvider, 
    'formatter' => ['class' => 'yii\i18n\Formatter'], 
    'columns' => $columns, 
]); ?> 

ich mag den Wert verwenden, da ich die Daten zu formatieren möchte, wenn die $ item-> Typ X oder Y ist ex:

'value' => function($model){ 
    if($item->type == 'img'){ 
     return Html::img($model->$item->name), 
    else { 
     return $model->$item->name; 
    } 
}, 

die Rückkehr des Listfield ist nur ein Array:

Array 
(
    [0] => stdClass Object 
     (
      [name] => ITEM_1 
      [type] => txt 
     ) 

    [1] => stdClass Object 
     (
      [name] => IMAGE_1 
      [id] => img 
     ) 

    [2] => stdClass Object 
     (
      [name] => IMAGE_2 
      [id] => img 
     ) 
) 

und die Rückkehr des SQL in Datenprovider ist

Array 
(
    [0] => Array 
     (
      [ITEM_1] => Item 1 blablabla 
      [IMAGE_1] => http://url.jpg 
      [IMAGE_2] => http://url2.jpg 
      [id] => 1 
     ) 

) 

Wie ich dynamische Spalte verwendet, kann ich‘ t codieren die Spaltennamen wie $ mode-> IMAGE_1

+0

bitte zeigen Sie Ihr Modell (Field) und der gesamte Code Aktion ist – scaisEdge

+0

, warum Sie haben $ modell in $ this-> render? – scaisEdge

+0

andere Variablen in diesem Gridview nicht wie ein Formular verwendet passieren. – ricardo

Antwort

1

Wie Sie sagten, $item ist außerhalb des Bereichs, und die wie in php doc about anonymous functions (nicht spezifisch für YII):

Verschlüsse kann auch Variablen aus dem übergeordneten Bereich erben. Solche Variablen müssen das use Sprachkonstrukt übergeben werden.

Sie sollten einfach hinzufügen use ($item):

'value' => function($model) use ($item) { 
    return $model->{$item->name}; 
}, 

PS: diese Frage geschlossen werden sollte, da es sich um ein Duplikat

+0

Du hast recht, danke! – ricardo

0

könnte man auf den Wert zugreifen kann dinamic Variablennamen

return $model->{$item->name}; 

oder unter Verwendung eines Array-Zugriffs

'value' => function($data){ 
    return $data[{$item->name}] ; 
    },