GridView

             

数据网格或者说 GridView 小部件是Yii中最强大的部件之一。如果你需要快速建立系统的管理后台, GridView 非常有用。它从数据提供者 data provider 中取得数据并使用 yii\grid\GridView::columns 属性的一组列配置,在一个表格中渲染每一行数据。

表中的每一行代表一个数据项的数据,并且一列通常表示该项的属性(某些列可以对应于属性或静态文本的复杂表达式)。

使用GridView的最少代码如下:

<code class="language-php hljs"><span class="hljs-keyword">use</span> <span class="hljs-title">yii</span>\<span class="hljs-title">grid</span>\<span class="hljs-title">GridView</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">yii</span>\<span class="hljs-title">data</span>\<span class="hljs-title">ActiveDataProvider</span>;

<span class="hljs-variable">$dataProvider</span> = <span class="hljs-keyword">new</span> ActiveDataProvider([
    <span class="hljs-string">'query'</span> => Post::find(),
    <span class="hljs-string">'pagination'</span> => [
        <span class="hljs-string">'pageSize'</span> => <span class="hljs-number">20</span>,
    ],
]);
<span class="hljs-keyword">echo</span> GridView::widget([
    <span class="hljs-string">'dataProvider'</span> => <span class="hljs-variable">$dataProvider</span>,
]);
</code>

上面的代码首先创建了一个数据提供者,然后使用GridView显示每一行的每个属性,每一行的数据是从数据提供者取来的。 展现出来的表格封装了排序以及分页功能。

表格列

表格的列是通过 yii\grid\Column 类来配置的,这个类是通过 GridView 配置项中的 yii\grid\GridView::columns 属性配置的。根据列的类别和设置的不同,各列能够以不同方式展示数据。 默认的列类是 yii\grid\DataColumn,用于展现模型的某个属性, 并且可以排序和过滤。

<code class="language-php hljs"><span class="hljs-keyword">echo</span> GridView::widget([
    <span class="hljs-string">'dataProvider'</span> => <span class="hljs-variable">$dataProvider</span>,
    <span class="hljs-string">'columns'</span> => [
        [<span class="hljs-string">'class'</span> => <span class="hljs-string">'yii\grid\SerialColumn'</span>],
        <span class="hljs-comment">// 数据提供者中所含数据所定义的简单的列</span>
        <span class="hljs-comment">// 使用的是模型的列的数据</span>
        <span class="hljs-string">'id'</span>,
        <span class="hljs-string">'username'</span>,
        <span class="hljs-comment">// 更复杂的列数据</span>
        [
            <span class="hljs-string">'class'</span> => <span class="hljs-string">'yii\grid\DataColumn'</span>, <span class="hljs-comment">//由于是默认类型,可以省略 </span>
            <span class="hljs-string">'value'</span> => <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-params">(<span class="hljs-variable">$data</span>)</span> </span>{
                <span class="hljs-keyword">return</span> <span class="hljs-variable">$data</span>->name; <span class="hljs-comment">// 如果是数组数据则为 $data['name'] ,例如,使用 SqlDataProvider 的情形。</span>
            },
        ],
    ],
]);
</code>

请注意,假如配置中没有指定 yii\grid\GridView::columns 属性,那么Yii会试图显示数据提供者的模型中所有可能的列。

列类

通过使用不同类,网格列可以自定义:

<code class="language-php hljs"><span class="hljs-keyword">echo</span> GridView::widget([
    <span class="hljs-string">'dataProvider'</span> => <span class="hljs-variable">$dataProvider</span>,
    <span class="hljs-string">'columns'</span> => [
        [
            <span class="hljs-string">'class'</span> => <span class="hljs-string">'yii\grid\SerialColumn'</span>, <span class="hljs-comment">// <-- 这里</span>
            <span class="hljs-comment">// 你还可以在此配置其他属性</span>
        ],
</code>

除了我们下面将要展开讨论的Yii自带的列类,你还可以创建你自己的列类。

每个列类是从 yii\grid\Column 扩展而来, 从而在配置网格列的时候,你可以设置一些公共的选项。

  • yii\grid\Column::header 允许为头部行设置内容。
  • yii\grid\Column::footer 允许为尾部行设置内容。
  • yii\grid\Column::visible 定义某个列是否可见
  • yii\grid\Column::content 允许你传递一个有效的PHP回调来为一行返回数据,格式如下:
    <code class="language-php hljs"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-params">(<span class="hljs-variable">$model</span>, <span class="hljs-variable">$key</span>, <span class="hljs-variable">$index</span>, <span class="hljs-variable">$column</span>)</span> </span>{
        <span class="hljs-keyword">return</span> <span class="hljs-string">'a string'</span>;
    }
    </code>

你可以传递数组来指定各种容器式的HTML选项:

  • yii\grid\Column::headerOptions
  • yii\grid\Column::footerOptions
  • yii\grid\Column::filterOptions
  • yii\grid\Column::contentOptions

数据列

yii\grid\DataColumn 用于显示和排序数据。这是默认的列的类型, 所以在使用 DataColumn 为列类时,可省略类的指定(译者注:不需要'class'选项的意思)。

数据列的主要配置项是 yii\grid\DataColumn::format 属性。它的值对应于 formatter application component 应用组件里面的一些方法, 默认是使用 \yii\i18n\Formatter 应用组件:

<code class="language-php hljs"><span class="hljs-keyword">echo</span> GridView::widget([
    <span class="hljs-string">'columns'</span> => [
        [
            <span class="hljs-string">'attribute'</span> => <span class="hljs-string">'name'</span>,
            <span class="hljs-string">'format'</span> => <span class="hljs-string">'text'</span>
        ],
        [
            <span class="hljs-string">'attribute'</span> => <span class="hljs-string">'birthday'</span>,
            <span class="hljs-string">'format'</span> => [<span class="hljs-string">'date'</span>, <span class="hljs-string">'php:Y-m-d'</span>]
        ],
    ],
]); 
</code>

在上面的代码中,text 对应于 \yii\i18n\Formatter::asText()。列的值作为第一个参数传递。在第二列的定义中,<code>date 对应于 \yii\i18n\Formatter::asDate()。 同样地,列值也是通过第一个参数传递的,而 'php:Y-m-d' 用作第二个参数的值。

可用的格式化方法列表,请参照 section about Data Formatting。

数据列配置,还有一个”快捷格式化串”的方法,详情见API文档 yii\grid\GridView::columns。 (译者注:举例说明, "name:text:Name" 快捷格式化串,表示列名为 <code>name 格式为 <code>text 显示标签是 <code>Name)

动作列

yii\grid\ActionColumn 用于显示一些动作按钮,如每一行的更新、删除操作。

<code class="language-php hljs"><span class="hljs-keyword">echo</span> GridView::widget([
    <span class="hljs-string">'dataProvider'</span> => <span class="hljs-variable">$dataProvider</span>,
    <span class="hljs-string">'columns'</span> => [
        [
            <span class="hljs-string">'class'</span> => <span class="hljs-string">'yii\grid\ActionColumn'</span>,
            <span class="hljs-comment">// you may configure additional properties here</span>
        ],
</code>

可配置的属性如下:

  • yii\grid\ActionColumn::controller 是应该执行这些动作的控制器ID。 如果没有设置,它将使用当前控制器。
  • yii\grid\ActionColumn::template 定义在动作列中使用的构建每个单元格的模板。 在大括号内括起来的的令牌被当做是控制器的 action 方法ID (在动作列的上下文中也称作按钮名称)。 它们将会被 yii\grid\ActionColumn::$buttons 中指定的对应按钮的关联的渲染回调函数替代。 例如,令牌 {view} 将被 <code>buttons['view'] 关联的渲染回调函数的返回结果所替换。 如果没有找到回调函数,令牌将被替换成一个空串。默认的令牌有 {view} {update} {delete}
  • yii\grid\ActionColumn::buttons 是一个按钮的渲染回调数数组。数组中的键是按钮的名字(没有花括号),并且值是对应的按钮渲染回调函数。 这些回调函数须使用下面这种原型:
    <code class="language-php hljs"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-params">(<span class="hljs-variable">$url</span>, <span class="hljs-variable">$model</span>, <span class="hljs-variable">$key</span>)</span> </span>{
        <span class="hljs-comment">// return the button HTML code</span>
    }
    </code>
    在上面的代码中,$url 是列为按钮创建的URL,<code>$model是当前要渲染的模型对象,并且 <code>$key 是在数据提供者数组中模型的键。
  • yii\grid\ActionColumn::urlCreator 是使用指定的模型信息来创建一个按钮URL的回调函数。 该回调的原型和 yii\grid\ActionColumn::createUrl() 是一样的。 假如这个属性没有设置,按钮的URL将使用 yii\grid\ActionColumn::createUrl() 来创建。

复选框列

yii\grid\CheckboxColumn 显示一个复选框列。

想要添加一个复选框到网格视图中,将它添加到 yii\grid\GridView::$columns 的配置中,如下所示:

<code class="language-php hljs"><span class="hljs-keyword">echo</span> GridView::widget([
    <span class="hljs-string">'dataProvider'</span> => <span class="hljs-variable">$dataProvider</span>,
    <span class="hljs-string">'columns'</span> => [
        <span class="hljs-comment">// ...</span>
        [
            <span class="hljs-string">'class'</span> => <span class="hljs-string">'yii\grid\CheckboxColumn'</span>,
            <span class="hljs-comment">// 你可以在这配置更多的属性</span>
        ],
    ],
</code>

用户可点击复选框来选择网格中的一些行。被选择的行可通过调用下面的JavaScript代码来获得:

<code class="language-javascript hljs"><span class="hljs-keyword">var</span> keys = $(<span class="hljs-string">'#grid'</span>).yiiGridView(<span class="hljs-string">'getSelectedRows'</span>);
<span class="hljs-comment">// keys 为一个由与被选行相关联的键组成的数组</span>
</code>

序号列

yii\grid\SerialColumn 渲染行号,以 1 起始并自动增长。

使用方法和下面的例子一样简单:

<code class="language-php hljs"><span class="hljs-keyword">echo</span> GridView::widget([
    <span class="hljs-string">'dataProvider'</span> => <span class="hljs-variable">$dataProvider</span>,
    <span class="hljs-string">'columns'</span> => [
        [<span class="hljs-string">'class'</span> => <span class="hljs-string">'yii\grid\SerialColumn'</span>], <span class="hljs-comment">// <-- here</span>
        <span class="hljs-comment">// ...</span>
</code>

数据过滤

为了过滤数据的 GridView 需要一个模型 model 来 从过滤表单接收数据,以及调整数据提供者的查询对象,以满足搜索条件。 使用活动记录 active records 时,通常的做法是 创建一个能够提供所需功能的搜索模型类(可以使用 Gii 来生成)。 这个类为搜索定义了验证规则并且提供了一个将会返回数据提供者对象的 search() 方法。</p><p>为了给 <code>Post 模型增加搜索能力,我们可以像下面的例子一样创建 <code>PostSearch 模型:

<code class="language-php hljs"><span class="hljs-preprocessor"><?php</span>

<span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">models</span>;

<span class="hljs-keyword">use</span> <span class="hljs-title">Yii</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">yii</span>\<span class="hljs-title">base</span>\<span class="hljs-title">Model</span>;
<span class="hljs-keyword">use</span> <span class="hljs-title">yii</span>\<span class="hljs-title">data</span>\<span class="hljs-title">ActiveDataProvider</span>;

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">PostSearch</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Post</span>
</span>{
    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">rules</span><span class="hljs-params">()</span>
    </span>{
        <span class="hljs-comment">// 只有在 rules() 函数中声明的字段才可以搜索</span>
        <span class="hljs-keyword">return</span> [
            [[<span class="hljs-string">'id'</span>], <span class="hljs-string">'integer'</span>],
            [[<span class="hljs-string">'title'</span>, <span class="hljs-string">'creation_date'</span>], <span class="hljs-string">'safe'</span>],
        ];
    }

    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">scenarios</span><span class="hljs-params">()</span>
    </span>{
        <span class="hljs-comment">// 旁路在父类中实现的 scenarios() 函数</span>
        <span class="hljs-keyword">return</span> Model::scenarios();
    }

    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">search</span><span class="hljs-params">(<span class="hljs-variable">$params</span>)</span>
    </span>{
        <span class="hljs-variable">$query</span> = Post::find();

        <span class="hljs-variable">$dataProvider</span> = <span class="hljs-keyword">new</span> ActiveDataProvider([
            <span class="hljs-string">'query'</span> => <span class="hljs-variable">$query</span>,
        ]);

        <span class="hljs-comment">// 从参数的数据中加载过滤条件,并验证</span>
        <span class="hljs-keyword">if</span> (!(<span class="hljs-variable">$this</span>->load(<span class="hljs-variable">$params</span>) && <span class="hljs-variable">$this</span>->validate())) {
            <span class="hljs-keyword">return</span> <span class="hljs-variable">$dataProvider</span>;
        }

        <span class="hljs-comment">// 增加过滤条件来调整查询对象</span>
        <span class="hljs-variable">$query</span>->andFilterWhere([<span class="hljs-string">'id'</span> => <span class="hljs-variable">$this</span>->id]);
        <span class="hljs-variable">$query</span>->andFilterWhere([<span class="hljs-string">'like'</span>, <span class="hljs-string">'title'</span>, <span class="hljs-variable">$this</span>->title])
              ->andFilterWhere([<span class="hljs-string">'like'</span>, <span class="hljs-string">'creation_date'</span>, <span class="hljs-variable">$this</span>->creation_date]);

        <span class="hljs-keyword">return</span> <span class="hljs-variable">$dataProvider</span>;
    }
}

</code>

你可以在控制器中使用如下方法为网格视图获取数据提供者:

<code class="language-php hljs"><span class="hljs-variable">$searchModel</span> = <span class="hljs-keyword">new</span> PostSearch();
<span class="hljs-variable">$dataProvider</span> = <span class="hljs-variable">$searchModel</span>->search(Yii::<span class="hljs-variable">$app</span>->request->get());

<span class="hljs-keyword">return</span> <span class="hljs-variable">$this</span>->render(<span class="hljs-string">'myview'</span>, [
    <span class="hljs-string">'dataProvider'</span> => <span class="hljs-variable">$dataProvider</span>,
    <span class="hljs-string">'searchModel'</span> => <span class="hljs-variable">$searchModel</span>,
]);
</code>

然后你在视图中将 $dataProvider 和 <code>$searchModel 对象分派给 GridView 小部件:

<code class="language-php hljs"><span class="hljs-keyword">echo</span> GridView::widget([
    <span class="hljs-string">'dataProvider'</span> => <span class="hljs-variable">$dataProvider</span>,
    <span class="hljs-string">'filterModel'</span> => <span class="hljs-variable">$searchModel</span>,
    <span class="hljs-string">'columns'</span> => [
        <span class="hljs-comment">// ...</span>
    ],
]);
</code>

处理关系型模型

当我们在一个网格视图中显示活动数据的时候,你可能会遇到这种情况,就是显示关联表的列的值,例如:发帖者的名字,而不是显示他的 id。 当 Post 模型有一个关联的属性名(译者注: <code>Post 模型中用 <code>hasOne 定义 <code>getAuthor() 函数) 叫 author 并且作者模型(译者注:本例的作者模型是 <code>users )有一个属性叫 <code>name,那么你可以通过在 yii\grid\GridView::$columns 中定义属性名为 author.name 来处理。这时的网格视图能显示作者名了,但是默认是不支持按作者名排序和过滤的。 你需要调整上个章节介绍的 PostSearch 模型,以添加此功能。

为了使关联列能够排序,你需要连接关系表,以及添加排序规则到数据提供者的排序组件中:

<code class="language-php hljs"><span class="hljs-variable">$query</span> = Post::find();
<span class="hljs-variable">$dataProvider</span> = <span class="hljs-keyword">new</span> ActiveDataProvider([
    <span class="hljs-string">'query'</span> => <span class="hljs-variable">$query</span>,
]);

<span class="hljs-comment">// 连接与 `users` 表相关联的 `author` 表</span>
<span class="hljs-comment">// 并将 `users` 表的别名设为 `author`</span>
<span class="hljs-variable">$query</span>->joinWith([<span class="hljs-string">'author'</span> => <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(<span class="hljs-variable">$query</span>)</span> </span>{ <span class="hljs-variable">$query</span>->from([<span class="hljs-string">'author'</span> => <span class="hljs-string">'users'</span>]); }]);
<span class="hljs-comment">// 使得关联字段可以排序</span>
<span class="hljs-variable">$dataProvider</span>->sort->attributes[<span class="hljs-string">'author.name'</span>] = [
    <span class="hljs-string">'asc'</span> => [<span class="hljs-string">'author.name'</span> => SORT_ASC],
    <span class="hljs-string">'desc'</span> => [<span class="hljs-string">'author.name'</span> => SORT_DESC],
];

<span class="hljs-comment">// ...</span>
</code>

过滤也需要像上面一样调用joinWith方法。你也需要在属性和规则中定义该列,就像下面这样:

<code class="language-php hljs"><span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">attributes</span><span class="hljs-params">()</span>
</span>{
    <span class="hljs-comment">// 添加关联字段到可搜索属性集合</span>
    <span class="hljs-keyword">return</span> array_merge(<span class="hljs-keyword">parent</span>::attributes(), [<span class="hljs-string">'author.name'</span>]);
}

<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">rules</span><span class="hljs-params">()</span>
</span>{
    <span class="hljs-keyword">return</span> [
        [[<span class="hljs-string">'id'</span>], <span class="hljs-string">'integer'</span>],
        [[<span class="hljs-string">'title'</span>, <span class="hljs-string">'creation_date'</span>, <span class="hljs-string">'author.name'</span>], <span class="hljs-string">'safe'</span>],
    ];
}
</code>

然后在 search() 方法中,你仅需要添加一个额外过滤条件:

<code class="language-php hljs"><span class="hljs-variable">$query</span>->andFilterWhere([<span class="hljs-string">'LIKE'</span>, <span class="hljs-string">'author.name'</span>, <span class="hljs-variable">$this</span>->getAttribute(<span class="hljs-string">'author.name'</span>)]);
</code>
信息:在上面的代码中,我们使用相同的字符串作为关联名称和表别名; 然而,当你的表别名和关联名称不相同的时候,你得注意在哪使用你的别名,在哪使用你的关联名称。 一个简单的规则是在每个构建数据库查询的地方使用别名,而在所有其他和定义相关的诸如:attributes() 和 <code>rules() 等地方使用关联名称。
例如,你使用 au 作为作者关系表的别名,那么联查语句就要写成像下面这样:


<code class="language-php hljs"><span class="hljs-variable">$query</span>->joinWith([<span class="hljs-string">'author'</span> => <span class="hljs-function"><span class="hljs-keyword">function</span><span class="hljs-params">(<span class="hljs-variable">$query</span>)</span> </span>{ <span class="hljs-variable">$query</span>->from([<span class="hljs-string">'au'</span> => <span class="hljs-string">'users'</span>]); }]);
</code>
当别名已经在关联函数中定义了时,也可以只调用 $query->joinWith(['author']);
在过滤条件中,别名必须使用,但属性名称保持不变:


<code class="language-php hljs"><span class="hljs-variable">$query</span>->andFilterWhere([<span class="hljs-string">'LIKE'</span>, <span class="hljs-string">'au.name'</span>, <span class="hljs-variable">$this</span>->getAttribute(<span class="hljs-string">'author.name'</span>)]);
</code>
排序定义也同样如此:


<code class="language-php hljs"><span class="hljs-variable">$dataProvider</span>->sort->attributes[<span class="hljs-string">'author.name'</span>] = [
     <span class="hljs-string">'asc'</span> => [<span class="hljs-string">'au.name'</span> => SORT_ASC],
     <span class="hljs-string">'desc'</span> => [<span class="hljs-string">'au.name'</span> => SORT_DESC],
];
</code>
同样,当指定使用 yii\data\Sort::defaultOrder 来排序的时候,你需要使用关联名称替代别名:


<code class="language-php hljs"><span class="hljs-variable">$dataProvider</span>->sort->defaultOrder = [<span class="hljs-string">'author.name'</span> => SORT_ASC];
</code>

SQL视图用于过滤、排序和显示数据

还有另外一种方法可以更快、更有用 - SQL 视图。例如,我们要在 GridView 中显示用户和他们的简介,可以这样创建 SQL 视图:

<code class="language-sql hljs"><span class="hljs-operator"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">OR</span> <span class="hljs-keyword">REPLACE</span> <span class="hljs-keyword">VIEW</span> vw_user_info <span class="hljs-keyword">AS</span>
    SELECT <span class="hljs-keyword">user</span>.*, user_profile.lastname, user_profile.firstname
    <span class="hljs-keyword">FROM</span> <span class="hljs-keyword">user</span>, user_profile
    <span class="hljs-keyword">WHERE</span> <span class="hljs-keyword">user</span>.<span class="hljs-keyword">id</span> = user_profile.user_id
</span></code>

然后你需要创建活动记录模型来代表这个视图:

<code class="language-php hljs">
<span class="hljs-keyword">namespace</span> <span class="hljs-title">app</span>\<span class="hljs-title">models</span>\<span class="hljs-title">views</span>\<span class="hljs-title">grid</span>;

<span class="hljs-keyword">use</span> <span class="hljs-title">yii</span>\<span class="hljs-title">db</span>\<span class="hljs-title">ActiveRecord</span>;

<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">UserView</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">ActiveRecord</span>
</span>{

    <span class="hljs-comment">/**
     * <span class="hljs-doctag">@inheritdoc</span>
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">tableName</span><span class="hljs-params">()</span>
    </span>{
        <span class="hljs-keyword">return</span> <span class="hljs-string">'vw_user_info'</span>;
    }

    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">primaryKey</span><span class="hljs-params">()</span>
    </span>{
        <span class="hljs-keyword">return</span> [<span class="hljs-string">'id'</span>];
    }

    <span class="hljs-comment">/**
     * <span class="hljs-doctag">@inheritdoc</span>
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">rules</span><span class="hljs-params">()</span>
    </span>{
        <span class="hljs-keyword">return</span> [
            <span class="hljs-comment">// 在这定义你的规则</span>
        ];
    }

    <span class="hljs-comment">/**
     * <span class="hljs-doctag">@inheritdoc</span>
     */</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">attributeLabels</span><span class="hljs-params">()</span>
    </span>{
        <span class="hljs-keyword">return</span> [
            <span class="hljs-comment">// 在这定义你的属性标签</span>
        ];
    }


}
</code>

之后你可以使用这个 UserView 活动记录和搜索模型,无需附加的排序和过滤属性的规则。 所有属性都可开箱即用。请注意,这种方法有利有弊:

  • 你不需要指定不同排序和过滤条件,一切都包装好了;
  • 它可以更快,因为数据的大小,SQL查询的执行(对于每个关联数据你都不需要额外的查询)都得到优化;
  • 因为在SQL视图中这仅仅是一个简单的映射UI,所以在你的实体中,它可能缺乏某方面的逻辑,所以,假如你有一些诸如 isActive、<code>isDeleted 或者其他影响到UI的方法, 你也需要在这个类中复制他们。

单个页面多个网格视图部件

你可以在一个单独页面中使用多个网格视图,但是一些额外的配置是必须的,为的就是它们相互之间不干扰。 当使用多个网格视图实例的时候,你必须要为生成的排序和分页对象配置不同的参数名,以便于每个网格视图有它们各自独立的排序和分页。 你可以通过设置 yii\data\Sort::sortParam 和 yii\data\Pagination::pageParam,对应于数据提供者的 yii\data\BaseDataProvider::$sort 和 yii\data\BaseDataProvider::$pagination 实例。

假如我们想要同时显示 Post 和 <code>User 模型,这两个模型已经在 <code>$userProvider 和 <code>$postProvider 这两个数据提供者中准备好, 具体做法如下:

<code class="language-php hljs"><span class="hljs-keyword">use</span> <span class="hljs-title">yii</span>\<span class="hljs-title">grid</span>\<span class="hljs-title">GridView</span>;

<span class="hljs-variable">$userProvider</span>->pagination->pageParam = <span class="hljs-string">'user-page'</span>;
<span class="hljs-variable">$userProvider</span>->sort->sortParam = <span class="hljs-string">'user-sort'</span>;

<span class="hljs-variable">$postProvider</span>->pagination->pageParam = <span class="hljs-string">'post-page'</span>;
<span class="hljs-variable">$postProvider</span>->sort->sortParam = <span class="hljs-string">'post-sort'</span>;

<span class="hljs-keyword">echo</span> <span class="hljs-string">'<h1>Users</h1>'</span>;
<span class="hljs-keyword">echo</span> GridView::widget([
    <span class="hljs-string">'dataProvider'</span> => <span class="hljs-variable">$userProvider</span>,
]);

<span class="hljs-keyword">echo</span> <span class="hljs-string">'<h1>Posts</h1>'</span>;
<span class="hljs-keyword">echo</span> GridView::widget([
    <span class="hljs-string">'dataProvider'</span> => <span class="hljs-variable">$postProvider</span>,
]);
</code>


发表评论 请登录再评论
  • 文章分类
回到顶部