我将在我的Yii2项目中使用第一个规范化表格,所以我已经添加了这样的表格 | id | post_id | tag_id |
当我发布模型时,我已经写了这个:
public function getTags()
{
return $this->hasMany(PostTags::className(), ['post_id' => 'id']);
}
在视图小部件中,我添加了' tags.tag_id',但它没有显示任何数据。
有没有办法在 DetailView 和 GridView 小部件中显示此标记?
可能是,我可以写" group_concat"某处?
答案 0 :(得分:1)
我建议编写一个小部件来显示相关记录的链接列表。它是可重用的,可以防止模型/控制器中的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特殊字符被转义)。
您可以根据自己的需要进行修改,这只是一个例子。