如何将自定义 HTML 放入 Yii2 GridView header?
How to put custom HTML into Yii2 GridView header?
bootstrap 中有这个 <abbr></abbr>
标签,它会自动显示缩写词的弹出窗口。我想将这个标签插入属性名称为 act
的 gridview 中的某个 header。到目前为止,这是我的代码。
[
'attribute'=>'act',
'format'=>'raw',
'label'=>'<abbr title="Area Coordinating Team">ACT</abbr>',
'value'=>function($model){
return '<span class="fa fa-thumbs-up text-green"></span>';
}
],
但输出字面上显示了整个 <abbr title="Area Coordinating Team">ACT</abbr>
我已经回答了。
为此,请使用 header
属性 而不是 label
:
[
'attribute' => 'act',
'format' => 'raw',
'header' => '<abbr title="Area Coordinating Team">ACT</abbr>',
'value' => function ($model) {
return '<span class="fa fa-thumbs-up text-green"></span>';
},
],
这样 HTML 内容将不会被编码。
官方文档:
如果您想拥有自定义 HTML 和原始排序功能,您可以创建自己的 DataColumn(假设在 common/components 中),然后在网格视图中设置 dataColumnClass
:
<?= GridView::widget([
...
'dataColumnClass' => 'common\components\HtmlDataColumn',
'columns' => [
'id',
[
'attribute' => 'title',
'htmlHeader' => 'Some Header<span class="glyphicon glyphicon-ok"></span>',
],
...
我的数据列:
namespace common\components;
use yii\helpers\Html;
/**
* DataColumn that allows HTML in 'header' yet still appends sorting.
*/
class HtmlDataColumn extends \yii\grid\DataColumn
{
public $htmlHeader = null;
/**
* @inheritdoc
*/
protected function renderHeaderCellContent()
{
if ($this->header !== null || $this->label === null && $this->attribute === null) {
return parent::renderHeaderCellContent();
}
if ($this->htmlHeader !== null) {
$label = $this->htmlHeader;
} else {
$label = $this->getHeaderCellLabel();
if ($this->encodeLabel) {
$label = Html::encode($label);
}
}
if ($this->attribute !== null && $this->enableSorting &&
($sort = $this->grid->dataProvider->getSort()) !== false && $sort->hasAttribute($this->attribute)) {
return $sort->link($this->attribute, array_merge($this->sortLinkOptions, ['label' => $label]));
}
return $label;
}
}
希望对您有所帮助。
使用:'encodeLabel' => false,
[
'attribute'=>'act',
'format'=>'raw',
'label'=>'<abbr title="Area Coordinating Team">ACT</abbr>',
'encodeLabel' => false,
'value'=>function($model){
return '<span class="fa fa-thumbs-up text-green"></span>';
}
],
bootstrap 中有这个 <abbr></abbr>
标签,它会自动显示缩写词的弹出窗口。我想将这个标签插入属性名称为 act
的 gridview 中的某个 header。到目前为止,这是我的代码。
[
'attribute'=>'act',
'format'=>'raw',
'label'=>'<abbr title="Area Coordinating Team">ACT</abbr>',
'value'=>function($model){
return '<span class="fa fa-thumbs-up text-green"></span>';
}
],
但输出字面上显示了整个 <abbr title="Area Coordinating Team">ACT</abbr>
我已经回答了
为此,请使用 header
属性 而不是 label
:
[
'attribute' => 'act',
'format' => 'raw',
'header' => '<abbr title="Area Coordinating Team">ACT</abbr>',
'value' => function ($model) {
return '<span class="fa fa-thumbs-up text-green"></span>';
},
],
这样 HTML 内容将不会被编码。
官方文档:
如果您想拥有自定义 HTML 和原始排序功能,您可以创建自己的 DataColumn(假设在 common/components 中),然后在网格视图中设置 dataColumnClass
:
<?= GridView::widget([
...
'dataColumnClass' => 'common\components\HtmlDataColumn',
'columns' => [
'id',
[
'attribute' => 'title',
'htmlHeader' => 'Some Header<span class="glyphicon glyphicon-ok"></span>',
],
...
我的数据列:
namespace common\components;
use yii\helpers\Html;
/**
* DataColumn that allows HTML in 'header' yet still appends sorting.
*/
class HtmlDataColumn extends \yii\grid\DataColumn
{
public $htmlHeader = null;
/**
* @inheritdoc
*/
protected function renderHeaderCellContent()
{
if ($this->header !== null || $this->label === null && $this->attribute === null) {
return parent::renderHeaderCellContent();
}
if ($this->htmlHeader !== null) {
$label = $this->htmlHeader;
} else {
$label = $this->getHeaderCellLabel();
if ($this->encodeLabel) {
$label = Html::encode($label);
}
}
if ($this->attribute !== null && $this->enableSorting &&
($sort = $this->grid->dataProvider->getSort()) !== false && $sort->hasAttribute($this->attribute)) {
return $sort->link($this->attribute, array_merge($this->sortLinkOptions, ['label' => $label]));
}
return $label;
}
}
希望对您有所帮助。
使用:'encodeLabel' => false,
[
'attribute'=>'act',
'format'=>'raw',
'label'=>'<abbr title="Area Coordinating Team">ACT</abbr>',
'encodeLabel' => false,
'value'=>function($model){
return '<span class="fa fa-thumbs-up text-green"></span>';
}
],