Я бы рекомендовал написать виджет для отображения списка ссылок связанных записей. Он многоразовый, предотвращает генерацию HTML в модели/контроллере, уменьшает количество кода в поле зрения.
<?php
namespace common\widgets;
use yii\base\Widget;
use yii\helpers\Html;
/**
* Widget for display list of links to related models
*/
class RelatedList extends Widget
{
/**
* @var \yii\db\ActiveRecord[] Related models
*/
public $models = [];
/**
* @var string Base to build text content of the link.
* You should specify attribute name. In case of dynamic generation ('getFullName()') you should specify just 'fullName'.
*/
public $linkContentBase = 'name';
/**
* @var string Route to build url to related model
*/
public $viewRoute;
/**
* @inheritdoc
*/
public function run()
{
if (!$this->models) {
return null;
}
$items = [];
foreach ($this->models as $model) {
$items[] = Html::a($model->{$this->linkContentBase}, [$this->viewRoute, 'id' => $model->id]);
}
return Html::ul($items, [
'class' => 'list-unstyled',
'encode' => false,
]);
}
}
Вот некоторые примеры (предполагается, что имя тега хранится в name
колонке).
Использование в GridView
:
[
'attribute' => 'tags',
'format' => 'raw',
'value' => function ($model) {
/* @var $model common\models\Post */
return RelatedList::widget([
'models' => $model->tags,
'viewRoute' => '/tags/view',
]);
},
],
Использование в DetailView
:
/* @var $model common\models\Post */
...
[
'attribute' => 'tags',
'format' => 'raw',
'value' => RelatedList::widget([
'models' => $model->tags,
'viewRoute' => '/tags/view',
]),
],
Не забудьте установить формат raw
, потому что по умолчанию содержание отображается в виде обычного текста для предотвращения XSS атак (HTML специальные символы экранированы).
Вы можете изменить это в соответствии со своими потребностями, это всего лишь пример.
Я нашел проблему. Я не добавил ** joinWith ** к запросу DataProvider –