dcat-admin

dcat-admin


列的显示和扩展

<h1>列的显示和扩展</h1> <p>数据表格内置了很多对于列的操作方法,可以通过这些方法很灵活的操作列数据。</p> <h2>根据条件显示不同的组件</h2> <p>有些情况我们需要根据某个条件去判断是否使用列的某个显示功能: &gt; {tip} 需要注意的是,<code>Grid\Column::if</code>只对列的显示相关功能有效,其他方法如表头的相关操作都不能使用此方法!</p> <pre><code class="language-php">$grid-&amp;gt;column('config') -&amp;gt;if(function ($column) { // 获取当前行其他字段值 $username = $this-&amp;gt;username; // $column-&amp;gt;getValue() 是当前字段的值 return $column-&amp;gt;getValue(); }) -&amp;gt;display($view) -&amp;gt;copyable() -&amp;gt;else() -&amp;gt;display('');</code></pre> <p>上面写法等同于</p> <pre><code class="language-php">$grid-&amp;gt;column('config') -&amp;gt;if(function ($column) { return $column-&amp;gt;getValue(); }) -&amp;gt;then(function (Grid\Column $column) { $column-&amp;gt;display($view)-&amp;gt;copyable(); }) -&amp;gt;else(function (Grid\Column $column) { $column-&amp;gt;display(''); });</code></pre> <p>支持多个<code>if</code></p> <pre><code class="language-php">$grid-&amp;gt;column('config') -&amp;gt;if(...) -&amp;gt;then(...) -&amp;gt;else(...) -&amp;gt;if(...) -&amp;gt;then(...) -&amp;gt;else(...);</code></pre> <p>终结条件判断<code>end</code></p> <pre><code class="language-php">$grid-&amp;gt;column('status') -&amp;gt;if(...) // 条件1 -&amp;gt;display(...) -&amp;gt;display(...) -&amp;gt;if(...) // 条件2 -&amp;gt;display(...) -&amp;gt;display(...) -&amp;gt;end() // 终结前面的条件判断 -&amp;gt;display(...); // 所有条件都能生效</code></pre> <h2>列显示</h2> <p><code>model-grid</code>内置了若干方法来帮助你扩展列功能</p> <h3>display</h3> <p><code>Dcat\Admin\Grid\Column</code>对象内置了<code>display()</code>方法来通过传入的回调函数来处理当前列的值,</p> <pre><code class="language-php">$grid-&amp;gt;column('title')-&amp;gt;display(function ($title) { return &amp;quot;&amp;lt;span style='color:blue'&amp;gt;$title&amp;lt;/span&amp;gt;&amp;quot;; });</code></pre> <p>在传入的匿名函数中可以通过任何方式对数据进行处理,另外匿名函数绑定了当前列的数据作为父对象,可以在函数中调用当前行的数据:</p> <pre><code class="language-php">$grid-&amp;gt;column('first_name'); $grid-&amp;gt;column('last_name'); // 不存在的`full_name`字段 $grid-&amp;gt;column('full_name')-&amp;gt;display(function () { return $this-&amp;gt;first_name . ' ' . $this-&amp;gt;last_name; });</code></pre> <h3>设置列的HTML属性</h3> <p>设列的<code>html</code>属性</p> <pre><code class="language-php">$grid-&amp;gt;column('name')-&amp;gt;setAttributes(['style' =&amp;gt; 'font-size:14px']);</code></pre> <h3>列视图</h3> <p><code>view</code>方法可以引入一个视图文件。</p> <pre><code class="language-php">$grid-&amp;gt;column('content')-&amp;gt;view('admin.fields.content');</code></pre> <p>默认会传入视图的三个变量:</p> <ul> <li><code>$model</code> 当前行数据</li> <li><code>$name</code> 字段名称</li> <li><code>$value</code> 为当前列的值</li> </ul> <p>模板代码如下:</p> <pre><code class="language-blade">&amp;lt;label&amp;gt;名称:{{ $name }}&amp;lt;/label&amp;gt; &amp;lt;label&amp;gt;值:{{ $value }}&amp;lt;/label&amp;gt; &amp;lt;label&amp;gt;其他字段:{{ $model-&amp;gt;title }}&amp;lt;/label&amp;gt;</code></pre> <h3>图片</h3> <pre><code class="language-php">$grid-&amp;gt;column('picture')-&amp;gt;image(); //设置服务器和宽高 $grid-&amp;gt;column('picture')-&amp;gt;image('http://xxx.com', 100, 100); // 显示多图 $grid-&amp;gt;column('pictures')-&amp;gt;display(function ($pictures) { return json_decode($pictures, true); })-&amp;gt;image('http://xxx.com', 100, 100);</code></pre> <h3>显示label标签</h3> <p>支持<code>Dcat\Admin\Color</code>类中内置的所有颜色</p> <pre><code class="language-php">use Dcat\Admin\Admin; $grid-&amp;gt;column('name')-&amp;gt;label(); // 设置颜色,直接传别名 $grid-&amp;gt;column('name')-&amp;gt;label('danger'); // 也可以这样使用 $grid-&amp;gt;column('name')-&amp;gt;label(Admin::color()-&amp;gt;danger()); // 也可以直接传颜色代码 $grid-&amp;gt;column('name')-&amp;gt;label('#222');</code></pre> <p>给不同的值设置不同的颜色</p> <pre><code class="language-php">use Dcat\Admin\Admin; $grid-&amp;gt;column('state')-&amp;gt;using([1 =&amp;gt; '未处理', 2 =&amp;gt; '已处理', ...])-&amp;gt;label([ 'default' =&amp;gt; 'primary', // 设置默认颜色,不设置则默认为 default 1 =&amp;gt; 'primary', 2 =&amp;gt; 'danger', 3 =&amp;gt; 'success', 4 =&amp;gt; Admin::color()-&amp;gt;info(), ]);</code></pre> <h3>显示badge标签</h3> <p>支持<code>Dcat\Admin\Color</code>类中内置的所有颜色</p> <pre><code class="language-php">$grid-&amp;gt;column('name')-&amp;gt;badge(); // 设置颜色,直接传别名 $grid-&amp;gt;column('name')-&amp;gt;badge('danger'); // 也可以这样使用 $grid-&amp;gt;column('name')-&amp;gt;badge(Admin::color()-&amp;gt;danger()); // 也可以直接传颜色代码 $grid-&amp;gt;column('name')-&amp;gt;badge('#222');</code></pre> <p>给不同的值设置不同的颜色</p> <pre><code class="language-php">use Dcat\Admin\Admin; $grid-&amp;gt;state-&amp;gt;using([1 =&amp;gt; '未处理', 2 =&amp;gt; '已处理', ...])-&amp;gt;badge([ 'default' =&amp;gt; 'primary', // 设置默认颜色,不设置则默认为 default 1 =&amp;gt; 'primary', 2 =&amp;gt; 'danger', 3 =&amp;gt; 'success', 4 =&amp;gt; Admin::color()-&amp;gt;info(), ]);</code></pre> <p>&lt;a name=&quot;bool&quot;&gt;&lt;/a&gt;</p> <h3>布尔值显示 (bool)</h3> <p>将这一列转为<code>bool</code>值之后显示为<code>✓</code>和<code>✗</code>。</p> <pre><code class="language-php">$grid-&amp;gt;column('approved')-&amp;gt;bool();</code></pre> <p>你也可以按照这一列的值指定显示,比如字段的值为<code>Y</code>和<code>N</code>表示<code>true</code>和<code>false</code></p> <pre><code class="language-php">$grid-&amp;gt;column('approved')-&amp;gt;bool(['Y' =&amp;gt; true, 'N' =&amp;gt; false]);</code></pre> <p>效果 <img src="https://cdn.learnku.com/uploads/images/202007/12/38389/U0OSrJwzyt.png!large" alt="" /></p> <h3>圆点前缀 (dot)</h3> <p>通过<code>dot</code>方法可以在列文字前面加上一个带颜色的圆点</p> <pre><code class="language-php">use Dcat\Admin\Admin; $grid-&amp;gt;column('state') -&amp;gt;using([1 =&amp;gt; '未处理', 2 =&amp;gt; '已处理', ...]) -&amp;gt;dot( [ 1 =&amp;gt; 'primary', 2 =&amp;gt; 'danger', 3 =&amp;gt; 'success', 4 =&amp;gt; Admin::color()-&amp;gt;info(), ], 'primary' // 第二个参数为默认值 );</code></pre> <p>效果 <img src="https://cdn.learnku.com/uploads/images/202004/30/38389/ByUqo6bZc8.png!large" alt="" /></p> <p>&lt;a name=&quot;expand&quot;&gt;&lt;/a&gt;</p> <h3>列展开 (expand)</h3> <p><code>expand</code>方法可以把内容隐藏,点击按钮的时候显示在表格下一行</p> <pre><code class="language-php">$grid-&amp;gt;column('content') -&amp;gt;display('详情') // 设置按钮名称 -&amp;gt;expand(function () { // 返回显示的详情 // 这里返回 content 字段内容,并用 Card 包裹起来 $card = new Card(null, $this-&amp;gt;content); return &amp;quot;&amp;lt;div style='padding:10px 10px 0'&amp;gt;$card&amp;lt;/div&amp;gt;&amp;quot;; });</code></pre> <p>也可以通过以下方式设置按钮</p> <pre><code class="language-php">$grid-&amp;gt;column('content')-&amp;gt;expand(function (Grid\Displayers\Expand $expand) { // 设置按钮名称 $expand-&amp;gt;button('详情'); // 返回显示的详情 // 这里返回 content 字段内容,并用 Card 包裹起来 $card = new Card(null, $this-&amp;gt;content); return &amp;quot;&amp;lt;div style='padding:10px 10px 0'&amp;gt;$card&amp;lt;/div&amp;gt;&amp;quot;; });</code></pre> <h4>异步加载</h4> <p>&gt; {tip} 更多用法请参考文档<a href="lazy.md">异步加载</a></p> <p>定义渲染类,继承<code>Dcat\Admin\Support\LazyRenderable</code></p> <pre><code class="language-php">use App\Models\Post as PostModel; use Dcat\Admin\Support\LazyRenderable; use Dcat\Admin\Widgets\Table; class Post extends LazyRenderable { public function render() { // 获取ID $id = $this-&amp;gt;key; // 获取其他自定义参数 $type = $this-&amp;gt;post_type; $data = PostModel::where('user_id', $id) -&amp;gt;where('type', $type) -&amp;gt;get(['title', 'body', 'body', 'created_at']) -&amp;gt;toArray(); $titles = [ 'User ID', 'Title', 'Body', 'Created At', ]; return Table::make($titles, $data); } }</code></pre> <p>使用</p> <pre><code class="language-php">$grid-&amp;gt;post-&amp;gt;display('View')-&amp;gt;expand(Post::make(['post_type' =&amp;gt; 1])); // 可以在闭包内返回异步加载类的实例 $grid-&amp;gt;post-&amp;gt;expand(function () { // 允许在比包内返回异步加载类的实例 return Post::make(['title' =&amp;gt; $this-&amp;gt;title]); });</code></pre> <p>效果</p> <p><img src="https://cdn.learnku.com/uploads/images/202006/14/38389/KMHagem4OZ.gif!large" alt="" /></p> <h4>异步加载工具表单</h4> <p>定义<a href="widgets-form.md">工具表单</a>类如下</p> <p>&gt; {tip} 更多用法请参考<a href="lazy.md">异步加载</a></p> <pre><code class="language-php">&amp;lt;?php namespace App\Admin\Forms; use Dcat\Admin\Contracts\LazyRenderable; use Dcat\Admin\Traits\LazyWidget; use Dcat\Admin\Widgets\Form; class UserProfile extends Form implements LazyRenderable { use LazyWidget; public function handle(array $input) { // 接收外部传递参数 $type = $this-&amp;gt;payload['type'] ?? null; return $this-&amp;gt;response()-&amp;gt;success('保存成功'); } public function form() { // 接收外部传递参数 $type = $this-&amp;gt;payload['type'] ?? null; $this-&amp;gt;text('name', trans('admin.name'))-&amp;gt;required()-&amp;gt;help('用户昵称'); $this-&amp;gt;image('avatar', trans('admin.avatar'))-&amp;gt;autoUpload(); $this-&amp;gt;password('old_password', trans('admin.old_password')); $this-&amp;gt;password('password', trans('admin.password')) -&amp;gt;minLength(5) -&amp;gt;maxLength(20) -&amp;gt;customFormat(function ($v) { if ($v == $this-&amp;gt;password) { return; } return $v; }) -&amp;gt;help('请输入5-20个字符'); $this-&amp;gt;password('password_confirmation', trans('admin.password_confirmation')) -&amp;gt;same('password') -&amp;gt;help('请输入确认密码'); } }</code></pre> <p>使用</p> <pre><code class="language-php">$grid-&amp;gt;user-&amp;gt;display('View')-&amp;gt;expand(UserProfile::make(['type' =&amp;gt; 1]));</code></pre> <p>&lt;a name=&quot;modal&quot;&gt;&lt;/a&gt;</p> <h3>弹出模态框 (modal)</h3> <p><code>modal</code>方法可以把内容隐藏,点击按钮的时候显示在表格下一行</p> <pre><code class="language-php">$grid-&amp;gt;column('content') -&amp;gt;display('查看') // 设置按钮名称 -&amp;gt;modal(function ($modal) { // 设置弹窗标题 $modal-&amp;gt;title('标题 '.$this-&amp;gt;username); // 自定义图标 $modal-&amp;gt;icon('feather icon-x'); $card = new Card(null, $this-&amp;gt;content); return &amp;quot;&amp;lt;div style='padding:10px 10px 0'&amp;gt;$card&amp;lt;/div&amp;gt;&amp;quot;; }); // 也可以通过这种方式设置弹窗标题 $grid-&amp;gt;column('content') -&amp;gt;display('查看') // 设置按钮名称 -&amp;gt;modal('弹窗标题', ...);</code></pre> <h4>异步加载</h4> <p>&gt; {tip} 关于异步加载的更具体用法,请参考文档<a href="lazy.md">异步加载</a> </p> <p>定义渲染类,继承<code>Dcat\Admin\Support\LazyRenderable</code></p> <pre><code class="language-php">use App\Models\Post as PostModel; use Dcat\Admin\Support\LazyRenderable; use Dcat\Admin\Widgets\Table; class Post extends LazyRenderable { public function render() { // 获取ID $id = $this-&amp;gt;key; // 获取其他自定义参数 $type = $this-&amp;gt;post_type; $data = PostModel::where('user_id', $id) -&amp;gt;where('type', $type) -&amp;gt;get(['title', 'body', 'body', 'created_at']) -&amp;gt;toArray(); $titles = [ 'User ID', 'Title', 'Body', 'Created At', ]; return Table::make($titles, $data); } }</code></pre> <p>使用</p> <pre><code class="language-php">$grid-&amp;gt;post-&amp;gt;display('View')-&amp;gt;modal('Post', Post::make(['post_type' =&amp;gt; 2])); // 可以在闭包内返回异步加载类的实例 $grid-&amp;gt;post-&amp;gt;modal(function ($modal) { $modal-&amp;gt;title('自定义弹窗标题'); // 允许在比包内返回异步加载类的实例 return Post::make(['title' =&amp;gt; $this-&amp;gt;title]); });</code></pre> <p>效果 <img src="https://cdn.learnku.com/uploads/images/202006/14/38389/DvvyZUTXpG.gif!large" alt="" /></p> <h4>异步加载工具表单</h4> <p>定义<a href="widgets-form.md">工具表单</a>类如下</p> <p>&gt; {tip} 更多用法请参考<a href="lazy.md">异步加载</a></p> <pre><code class="language-php">&amp;lt;?php namespace App\Admin\Forms; use Dcat\Admin\Contracts\LazyRenderable; use Dcat\Admin\Traits\LazyWidget; use Dcat\Admin\Widgets\Form; class UserProfile extends Form implements LazyRenderable { use LazyWidget; public function handle(array $input) { // 接收外部传递参数 $type = $this-&amp;gt;payload['type'] ?? null; return $this-&amp;gt;response()-&amp;gt;success('保存成功'); } public function form() { // 接收外部传递参数 $type = $this-&amp;gt;payload['type'] ?? null; $this-&amp;gt;text('name', trans('admin.name'))-&amp;gt;required()-&amp;gt;help('用户昵称'); $this-&amp;gt;image('avatar', trans('admin.avatar'))-&amp;gt;autoUpload(); $this-&amp;gt;password('old_password', trans('admin.old_password')); $this-&amp;gt;password('password', trans('admin.password')) -&amp;gt;minLength(5) -&amp;gt;maxLength(20) -&amp;gt;customFormat(function ($v) { if ($v == $this-&amp;gt;password) { return; } return $v; }) -&amp;gt;help('请输入5-20个字符'); $this-&amp;gt;password('password_confirmation', trans('admin.password_confirmation')) -&amp;gt;same('password') -&amp;gt;help('请输入确认密码'); } }</code></pre> <p>使用</p> <pre><code class="language-php">$grid-&amp;gt;user-&amp;gt;display('View')-&amp;gt;modal(UserProfile::make(['type' =&amp;gt; 1]));</code></pre> <h3>进度条 (progressBar)</h3> <p><code>progressBar</code>进度条</p> <pre><code class="language-php">$grid-&amp;gt;rate-&amp;gt;progressBar(); //设置颜色,默认`primary`,可选`danger`、`warning`、`info`、`primary`、`success` $grid-&amp;gt;rate-&amp;gt;progressBar('success'); // 设置进度条尺寸和最大值 $grid-&amp;gt;rate-&amp;gt;progressBar('success', 'sm', 100);</code></pre> <h3>showTreeInDialog</h3> <p><code>showTreeInDialog</code>方法可以把一个带有层级关系的数组呈现为树形弹窗,比如权限就可以用此方法展示</p> <pre><code class="language-php">// 查出所有的权限数据 $nodes = (new $permissionModel)-&amp;gt;allNodes(); // 传入二维数组(未分层级) $grid-&amp;gt;permissions-&amp;gt;showTreeInDialog($nodes); // 也可以传入闭包 $grid-&amp;gt;permissions-&amp;gt;showTreeInDialog(function (Grid\Displayers\DialogTree $tree) use (&amp;amp;$nodes, $roleModel) { // 设置所有节点 $tree-&amp;gt;nodes($nodes); // 设置节点数据字段名称,默认&amp;quot;id&amp;quot;,&amp;quot;name&amp;quot;,&amp;quot;parent_id&amp;quot; $tree-&amp;gt;setIdColumn('id'); $tree-&amp;gt;setTitleColumn('title'); $tree-&amp;gt;setParentColumn('parent_id'); // $this-&amp;gt;roles 可以获取当前行的字段值 foreach (array_column($this-&amp;gt;roles, 'slug') as $slug) { if ($roleModel::isAdministrator($slug)) { // 选中所有节点 $tree-&amp;gt;checkAll(); } } });</code></pre> <p><img src="https://cdn.learnku.com/uploads/images/202004/26/38389/s1htW08Iko.png!large" alt="" /></p> <h3>内容映射 (using)</h3> <pre><code class="language-php">$grid-&amp;gt;status-&amp;gt;using([0 =&amp;gt; '未激活', 1 =&amp;gt; '正常']); // 第二个参数为默认值 $grid-&amp;gt;gender-&amp;gt;using([1 =&amp;gt; '男', 2 =&amp;gt; '女'], '未知');</code></pre> <h3>字符串分割为数组</h3> <p><code>explode</code>方法可以把字符串分割为数组。</p> <pre><code class="language-php">$grid-&amp;gt;tag-&amp;gt;explode()-&amp;gt;label(); // 可以指定分隔符,默认&amp;quot;,&amp;quot; $grid-&amp;gt;tag-&amp;gt;explode('|')-&amp;gt;label();</code></pre> <h3>prepend</h3> <p><code>prepend</code> 方法用于给 <code>string</code> 或 <code>array</code> 类型的值前面插入内容。</p> <pre><code class="language-php">// 当字段值是一个字符串 $grid-&amp;gt;email-&amp;gt;prepend('mailto:'); // 当字段值是一个数组 $grid-&amp;gt;arr-&amp;gt;prepend('first item');</code></pre> <p><code>prepend</code>方法允许传入闭包参数</p> <pre><code class="language-php">$grid-&amp;gt;email-&amp;gt;prepend(function ($value, $original) { // $value 是当前字段值 // $original 是当前字段从数据库中查询出来的原始值 // 获取其他字段值 $username = $this-&amp;gt;username; return &amp;quot;[{$username}]&amp;quot;; });</code></pre> <h3>append</h3> <p><code>append</code> 方法用于给 <code>string</code> 或 <code>array</code> 类型的值后面插入内容。</p> <pre><code class="language-php">// 当字段值是一个字符串 $grid-&amp;gt;email-&amp;gt;append('@gmail.com'); // 当字段值是一个数组 $grid-&amp;gt;arr-&amp;gt;append('last item');</code></pre> <p><code>append</code>方法允许传入闭包参数</p> <pre><code class="language-php">$grid-&amp;gt;email-&amp;gt;append(function ($value, $original) { // $value 是当前字段值 // $original 是当前字段从数据库中查询出来的原始值 // 获取其他字段值 $username = $this-&amp;gt;username; return &amp;quot;[{$username}]&amp;quot;; });</code></pre> <h3>字符串或数组截取 (limit)</h3> <pre><code class="language-php">// 最多显示50个字符 $grid-&amp;gt;column('content')-&amp;gt;limit(50, '...'); // 如果字段值是数组也支持 $grid-&amp;gt;tags-&amp;gt;limit(3);</code></pre> <h3>列二维码 (qrcode)</h3> <pre><code class="language-php">$grid-&amp;gt;website-&amp;gt;qrcode(function () { return $this-&amp;gt;url; }, 200, 200);</code></pre> <h3>可复制 (copyable)</h3> <pre><code class="language-php">$grid-&amp;gt;website-&amp;gt;copyable();</code></pre> <h3>可排序 (orderable)</h3> <p>通过<code>Column::orderable</code>可以开启字段可排序功能,此功能需要在你的模型类中<code>use ModelTree</code>或<code>use SortableTrait</code>,并且需要继承<code>Spatie\EloquentSortable\Sortable</code>接口。</p> <h4>SortableTrait</h4> <p>如果你的数据不是层级结构数据,可以直接使用<code>use SortableTrait</code>,更多用法可参考<a href="https://github.com/spatie/eloquent-sortable">eloquent-sortable</a>。</p> <p>模型</p> <pre><code class="language-php">&amp;lt;?php namespace App\Models; use Illuminate\Database\Eloquent\Model; use Spatie\EloquentSortable\Sortable; use Spatie\EloquentSortable\SortableTrait; class MyModel extends Model implements Sortable { use SortableTrait; protected $sortable = [ // 设置排序字段名称 'order_column_name' =&amp;gt; 'order', // 是否在创建时自动排序,此参数建议设置为true 'sort_when_creating' =&amp;gt; true, ]; }</code></pre> <p>使用</p> <pre><code class="language-php">$grid-&amp;gt;model()-&amp;gt;orderBy('order'); $grid-&amp;gt;order-&amp;gt;orderable();</code></pre> <h4>ModelTree</h4> <p>如果你的数据是层级结构数据,可以直接使用<code>use Model</code>,下面以权限模型为例来演示用法</p> <p>&gt; {tip} <code>ModelTree</code>实际上也是继承了<a href="https://github.com/spatie/eloquent-sortable">eloquent-sortable</a>的功能。</p> <pre><code class="language-php">&amp;lt;?php namespace Dcat\Admin\Models; use Dcat\Admin\Traits\HasDateTimeFormatter; use Dcat\Admin\Traits\ModelTree; use Spatie\EloquentSortable\Sortable; class Permission extends Model implements Sortable { use HasDateTimeFormatter, ModelTree { ModelTree::boot as treeBoot; } ... } </code></pre> <p>使用</p> <pre><code class="language-php">$grid-&amp;gt;order-&amp;gt;orderable();</code></pre> <h3>链接 (link)</h3> <p>将字段显示为一个链接。</p> <pre><code class="language-php">// link方法不传参数时,链接的`href`和`text`都是当前列的值 $grid-&amp;gt;column('homepage')-&amp;gt;link(); // 传入闭包 $grid-&amp;gt;column('homepage')-&amp;gt;link(function ($value) { return admin_url('users/'.$value); });</code></pre> <p>&lt;a name=&quot;action&quot;&gt;&lt;/a&gt;</p> <h3>行操作 (action)</h3> <p>&gt; {tip} 在使用这个方法之前,请先阅读<a href="model-grid-actions.md">自定义操作-行操作</a></p> <p>这个功能可以将某一列显示为一个<strong>行操作</strong>的按钮,比如下面所示是一个标星和取消标星的列操作, 点击这一列的星标图标之后, 后台会切换字段的状态,页面图标也跟着切换,具体实现代码如下:</p> <pre><code class="language-php">&amp;lt;?php namespace App\Admin\Extensions\Grid\RowAction; use Dcat\Admin\Grid\RowAction; use Illuminate\Http\Request; class Star extends RowAction { protected function html() { $icon = ($this-&amp;gt;row-&amp;gt;{$this-&amp;gt;getColumnName()}) ? 'fa-star' : 'fa-star-o'; return &amp;lt;&amp;lt;&amp;lt;HTML &amp;lt;i class=&amp;quot;{$this-&amp;gt;getElementClass()} fa {$icon}&amp;quot;&amp;gt;&amp;lt;/i&amp;gt; HTML; } public function handle(Request $request) { try { $class = $request-&amp;gt;class; $column = $request-&amp;gt;column; $id = $this-&amp;gt;getKey(); $model = $class::find($id); $model-&amp;gt;{$column} = (int) !$model-&amp;gt;{$column}; $model-&amp;gt;save(); return $this-&amp;gt;response()-&amp;gt;success(&amp;quot;success&amp;quot;)-&amp;gt;refresh(); } catch (\Exception $e) { return $this-&amp;gt;response()-&amp;gt;error($e-&amp;gt;getMessage()); } } public function parameters() { return [ 'class' =&amp;gt; $this-&amp;gt;modelClass(), 'column' =&amp;gt; $this-&amp;gt;getColumnName(), ]; } public function getColumnName() { return $this-&amp;gt;column-&amp;gt;getName(); } public function modelClass() { return get_class($this-&amp;gt;parent-&amp;gt;model()-&amp;gt;repository()-&amp;gt;model()); } }</code></pre> <p>使用</p> <pre><code class="language-php">protected function grid() { $grid = new Grid(new $this-&amp;gt;model()); $grid-&amp;gt;column('star', '-')-&amp;gt;action(Star::class); // here $grid-&amp;gt;column('id', 'ID')-&amp;gt;sortable()-&amp;gt;bold(); return $grid; }</code></pre> <p>效果</p> <p><img src="https://cdn.learnku.com/uploads/images/202005/17/38389/g8F7p8gnsE.png!large" alt="" /></p> <h2>帮助方法</h2> <h3>字符串操作</h3> <p>如果当前里的输出数据为字符串,那么可以通过链式方法调用<code>Illuminate\Support\Str</code>的方法。</p> <p>比如有如下一列,显示<code>title</code>字段的字符串值:</p> <pre><code class="language-php">$grid-&amp;gt;title();</code></pre> <p>在<code>title</code>列输出的字符串基础上调用<code>Str::title()</code>方法</p> <pre><code class="language-php">$grid-&amp;gt;title()-&amp;gt;title();</code></pre> <p>调用方法之后输出的还是字符串,所以可以继续调用<code>Illuminate\Support\Str</code>的方法:</p> <pre><code class="language-php">$grid-&amp;gt;title()-&amp;gt;title()-&amp;gt;ucfirst(); $grid-&amp;gt;title()-&amp;gt;title()-&amp;gt;ucfirst()-&amp;gt;substr(1, 10); </code></pre> <h3>数组操作</h3> <p>如果当前列输出的是数组,可以直接链式调用<code>Illuminate\Support\Collection</code>方法。</p> <p>比如<code>tags</code>列是从一对多关系取出来的数组数据:</p> <pre><code class="language-php">$grid-&amp;gt;tags(); array ( 0 =&amp;gt; array ( 'id' =&amp;gt; '16', 'name' =&amp;gt; 'php', 'created_at' =&amp;gt; '2016-11-13 14:03:03', 'updated_at' =&amp;gt; '2016-12-25 04:29:35', ), 1 =&amp;gt; array ( 'id' =&amp;gt; '17', 'name' =&amp;gt; 'python', 'created_at' =&amp;gt; '2016-11-13 14:03:09', 'updated_at' =&amp;gt; '2016-12-25 04:30:27', ), ) </code></pre> <p>调用<code>Collection::pluck()</code>方法取出数组的中的<code>name</code>列</p> <pre><code class="language-php">$grid-&amp;gt;tags()-&amp;gt;pluck('name'); array ( 0 =&amp;gt; 'php', 1 =&amp;gt; 'python', ), </code></pre> <p>取出<code>name</code>列之后输出的还是数组,还能继续调用用<code>Illuminate\Support\Collection</code>的方法</p> <pre><code class="language-php">$grid-&amp;gt;tags()-&amp;gt;pluck('name')-&amp;gt;map('ucwords'); array ( 0 =&amp;gt; 'Php', 1 =&amp;gt; 'Python', ),</code></pre> <p>将数组输出为字符串</p> <pre><code class="language-php">$grid-&amp;gt;tags()-&amp;gt;pluck('name')-&amp;gt;map('ucwords')-&amp;gt;implode('-'); &amp;quot;Php-Python&amp;quot;</code></pre> <h3>混合使用</h3> <p>在上面两种类型的方法调用中,只要上一步输出的是确定类型的值,便可以调用类型对应的方法,所以可以很灵活的混合使用。</p> <p>比如<code>images</code>字段是存储多图片地址数组的JSON格式字符串类型:</p> <pre><code class="language-php"> $grid-&amp;gt;images(); // &amp;quot;['foo.jpg', 'bar.png']&amp;quot; // 链式方法调用来显示多图 $grid-&amp;gt;images()-&amp;gt;display(function ($images) { return json_decode($images, true); })-&amp;gt;map(function ($path) { return 'http://localhost/images/'. $path; })-&amp;gt;image(); </code></pre> <h2>扩展列的显示功能</h2> <p>可以通过两种方式扩展列功能,第一种是通过匿名函数的方式。 &gt;扩展列功能方法后IDE默认是不会自动补全的,这时候可以通过<code>php artisan admin:ide-helper</code>生成IDE提示文件。</p> <h3>匿名函数</h3> <p>在<code>app/Admin/bootstrap.php</code>加入以下代码:</p> <pre><code class="language-php">use Dcat\Admin\Grid\Column; // 第二个参数是自定义参数 Column::extend('color', function ($value, $color) { return &amp;quot;&amp;lt;span style='color: $color'&amp;gt;$value&amp;lt;/span&amp;gt;&amp;quot;; });</code></pre> <p>然后在<code>model-grid</code>中使用这个扩展:</p> <pre><code class="language-php">$grid-&amp;gt;title()-&amp;gt;color('#ccc');</code></pre> <h3>扩展类</h3> <p>如果列显示逻辑比较复杂,可以通过扩展类来实现。</p> <p>扩展类<code>app/Admin/Extensions/Popover.php</code>:</p> <pre><code class="language-php">&amp;lt;?php namespace App\Admin\Extensions; use Dcat\Admin\Admin; use Dcat\Admin\Grid\Displayers\AbstractDisplayer; class Popover extends AbstractDisplayer { public function display($placement = 'left') { Admin::script(&amp;quot;$('[data-toggle=\&amp;quot;popover\&amp;quot;]').popover()&amp;quot;); return &amp;lt;&amp;lt;&amp;lt;EOT &amp;lt;button type=&amp;quot;button&amp;quot; class=&amp;quot;btn btn-secondary&amp;quot; title=&amp;quot;popover&amp;quot; data-container=&amp;quot;body&amp;quot; data-toggle=&amp;quot;popover&amp;quot; data-placement=&amp;quot;$placement&amp;quot; data-content=&amp;quot;{$this-&amp;gt;value}&amp;quot; &amp;gt; 弹出提示 &amp;lt;/button&amp;gt; EOT; } }</code></pre> <p>然后在<code>app/Admin/bootstrap.php</code>注册扩展类:</p> <pre><code class="language-php">use Dcat\Admin\Grid\Column; use App\Admin\Extensions\Popover; Column::extend('popover', Popover::class);</code></pre> <p>然后就能在<code>model-grid</code>中使用了:</p> <pre><code class="language-php">$grid-&amp;gt;desciption()-&amp;gt;popover('right');</code></pre> <h3>指定列名</h3> <p>出了上述两种方式扩展列功能,我们还可以通过指定列名称的方式扩展列功能</p> <p>在<code>app/Admin/bootstrap.php</code>加入以下代码:</p> <pre><code class="language-php">use Dcat\Admin\Grid\Column; // 这个扩展方法等同于 // $grid-&amp;gt;title()-&amp;gt;display(function ($value) { // return &amp;quot;&amp;lt;span style='color:red'&amp;gt;$value&amp;lt;/span&amp;gt;&amp;quot; // }); Column::define('title', function ($value) { return &amp;quot;&amp;lt;span style='color:red'&amp;gt;$value&amp;lt;/span&amp;gt;&amp;quot; }); // 这个扩展方法等同于 // $grid-&amp;gt;status()-&amp;gt;switch(); Column::define('status', Dcat\Admin\Grid\Displayers\SwitchDisplay::class);</code></pre> <p>然后在<code>model-grid</code>中<code>title</code>和<code>status</code>字段会自动使用以上扩展:</p> <pre><code class="language-php">$grid-&amp;gt;title(); $grid-&amp;gt;status();</code></pre>

页面列表

ITEM_HTML