public function columnFormat($attribute, $model)
{
$column = $this->generator->getColumnByAttribute($attribute, $model);
if (!$column) {
return;
}
// handle columns with a primary key, to create links in pivot tables (changed at 0.3-dev; 03.02.2015)
// TODO double check with primary keys not named `id` of non-pivot tables
// TODO Note: condition does not apply in every case
if ($column->isPrimaryKey) {
//return null;
}
$relation = $this->generator->getRelationByColumn($model, $column);
if ($relation) {
if ($relation->multiple) {
return;
}
$title = $this->generator->getModelNameAttribute($relation->modelClass);
$route = $this->generator->createRelationRoute($relation, 'view');
$method = __METHOD__;
$modelClass = $this->generator->modelClass;
$relationGetter = 'get' . (new ModelGenerator())->generateRelationName([$relation], $modelClass::getTableSchema(), $column->name, $relation->multiple) . '()';
$relationModel = new $relation->modelClass();
$pks = $relationModel->primaryKey();
$paramArrayItems = '';
foreach ($pks as $attr) {
$paramArrayItems .= "'{$attr}' => \$rel->{$attr},";
}
$code = <<<EOS
// generated by {$method}
[
'class' => yii\\grid\\DataColumn::className(),
'attribute' => '{$column->name}',
'value' => function (\$model) {
if (\$rel = \$model->{$relationGetter}->one()) {
return Html::a(\$rel->{$title}, ['{$route}', {$paramArrayItems}], ['data-pjax' => 0]);
} else {
return '';
}
},
'format' => 'raw',
]
EOS;
return $code;
}
}