dcat-admin

dcat-admin


树状表格

<h1>树状表格</h1> <p>树状表格支持分页和点击加载功能,特别适合用来展示数据量较大的多层级结构数据。</p> <p>&lt;a href=&quot;<a href="http://103.39.211.179:8080/admin/tree&quot">http://103.39.211.179:8080/admin/tree&quot</a>; target=&quot;_blank&quot;&gt; &lt;img class=&quot;img img-full&quot; src=&quot;{{public}}/assets/img/screenshots/grid-tree.png&quot;&gt; &lt;/a&gt;</p> <h3>表结构和模型</h3> <p>要使用树状表格,要遵守约定的表结构:</p> <p>&gt; {tip} 此表结构和模型可完全兼容 &lt;code&gt;<a href="model-tree.md">模型树</a>&lt;/code&gt; 。</p> <pre><code class="language-sql">CREATE TABLE `demo_categories` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `parent_id` int(11) NOT NULL DEFAULT '0', `order` int(11) NOT NULL DEFAULT '0', // order 字段不是必须的,不设置也可以 `title` varchar(50) COLLATE utf8_unicode_ci NOT NULL, `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci</code></pre> <p>上面的表格结构里面有三个必要的字段<code>parent_id</code>、<code>title</code>,其它字段没有要求。</p> <p>对应的模型为<code>app/Models/Category.php</code>:</p> <p>&gt; {tip} 为了便于阅读,这里不再展示 <code>Repository</code> 代码。</p> <pre><code class="language-php">&amp;lt;?php namespace App\Models\Demo; use Dcat\Admin\Traits\ModelTree; use Illuminate\Database\Eloquent\Model; class Category extends Model { use ModelTree; protected $table = 'demo_categories'; }</code></pre> <p>表结构中的三个字段<code>parent_id</code>、<code>order</code>、<code>title</code>的字段名也是可以修改的:</p> <pre><code class="language-php">&amp;lt;?php namespace App\Models\Demo; use Dcat\Admin\Traits\ModelTree; use Illuminate\Database\Eloquent\Model; class Category extends Model { use ModelTree; protected $table = 'demo_categories'; protected $titleColumn = 'name'; protected $orderColumn = 'sort'; protected $parentColumn = 'pid'; }</code></pre> <p>如果你的数据表不需要 <code>order</code> 字段排序,则在模型中添加如下代码即可</p> <pre><code class="language-php">&amp;lt;?php namespace App\Models\Demo; use Dcat\Admin\Traits\ModelTree; use Illuminate\Database\Eloquent\Model; class Category extends Model { use ModelTree; protected $table = 'demo_categories'; // 返回空值即可禁用 order 字段 public function getOrderColumn() { return null; } }</code></pre> <h3>使用</h3> <p>通过调用 <code>Grid\Column::tree</code> 方法即可开启树状表格功能,开启之后默认只查询最顶级节点的数据,子节点数据需要点击加载</p> <pre><code class="language-php">&amp;lt;?php namespace App\Admin\Controllers\Demo; use App\Models\Category; use Dcat\Admin\Grid; use Dcat\Admin\Controllers\AdminController; class CategoryController extends AdminController { protected function grid() { return Grid::make(new Category(), function (Grid $grid) { $grid-&amp;gt;id('ID')-&amp;gt;bold()-&amp;gt;sortable(); $grid-&amp;gt;title-&amp;gt;tree(); // 开启树状表格功能 $grid-&amp;gt;order; $grid-&amp;gt;created_at; $grid-&amp;gt;updated_at-&amp;gt;sortable(); $grid-&amp;gt;filter(function (Grid\Filter $filter) { $filter-&amp;gt;like('slug'); $filter-&amp;gt;like('name'); $filter-&amp;gt;like('http_path'); }); }); } }</code></pre> <p>上面的代码执行的 <code>sql</code> 如下(默认只查询 <code>parent = 0</code> 的数据):</p> <pre><code class="language-sql">select count(*) as aggregate from `demo_categories` where `parent_id` = 0 select * from `demo_categories` where `parent_id` = 0 order by `order` asc, `id` asc limit 20 offset 0</code></pre> <p><code>Grid\Column::tree</code> 方法参数</p> <ul> <li><code>bool</code> <code>$showAll</code> <code>false</code> 是否一次性展示下一层级的所有节点,默认分页展示</li> <li><code>bool</code> <code>$sortable</code> <code>true</code> 是否开启排序功能</li> </ul> <pre><code class="language-php">// 禁用分页功能,一次性加载所有下一层级节点 $grid-&amp;gt;title-&amp;gt;tree(true); // 不需要 order 字段排序,第二个参数传 false 即可 $grid-&amp;gt;title-&amp;gt;tree(false, false);</code></pre> <h3>orderable排序</h3> <p><code>orderable</code> 排序功能依赖 &lt;a href=&quot;<a href="https://github.com/spatie/eloquent-sortable&quot">https://github.com/spatie/eloquent-sortable&quot</a>; target=&quot;__blank&quot;&gt;spatie/eloquent-sortable&lt;/a&gt; 组件,需要修改模型:</p> <pre><code class="language-php">use Spatie\EloquentSortable\Sortable; class Category extends Model implements Sortable { use ModelTree; // 设置排序字段,默认order protected $orderColumn = 'sort'; }</code></pre> <p>下面是使用示例</p> <pre><code class="language-php">class CategoryController extends AdminController { protected function grid() { return Grid::make(new Category(), function (Grid $grid) { $grid-&amp;gt;id('ID')-&amp;gt;bold()-&amp;gt;sortable(); $grid-&amp;gt;title-&amp;gt;tree(); // 开启树状表格功能 $grid-&amp;gt;order-&amp;gt;orderable(); // 开启排序功能 ...; }); } }</code></pre> <h3>关于数据搜索</h3> <p>如果在树状表格中使用了搜索功能(<code>Grid::filter</code>、<code>Grid\Column::filter</code>、<code>Grid::quickSearch</code>),为了让用户能搜索到想要的数据,则会&lt;b&gt;取消只查最顶级数据的操作&lt;/b&gt;。</p> <p>&gt; {tip} 使用 <a href="model-grid-filters.md">查询过滤</a>、<a href="model-grid-column-filter.md">列过滤器</a>、<a href="model-grid-quick-search.md">快捷搜索</a> 等搜索功能都会&lt;b&gt;取消只查最顶级数据的操作&lt;/b&gt;,只有 <a href="model-grid-selector.md">筛选器</a> 和 <a href="model-grid-filters.md#scope">范围查询scope</a> 等功能例外。</p> <p>例如下面的代码开启了快捷搜索</p> <pre><code class="language-php">class CategoryController extends AdminController { protected function grid() { return Grid::make(new Category(), function (Grid $grid) { $grid-&amp;gt;id('ID')-&amp;gt;bold()-&amp;gt;sortable(); $grid-&amp;gt;title-&amp;gt;tree(); // 开启树状表格功能 $grid-&amp;gt;order-&amp;gt;orderable(); // 开启排序功能 $grid-&amp;gt;quickSearch(['id', 'title']); ...; }); } }</code></pre> <p>且用户在浏览器中使用了快捷搜索,则产生<code>sql</code>如下</p> <pre><code class="language-sql">select count(*) as aggregate from `demo_categories` where `id` like &amp;quot;%xxx%&amp;quot; or `title` like &amp;quot;%xxx%&amp;quot; select * from `demo_categories` where `id` like &amp;quot;%xxx%&amp;quot; or `title` like &amp;quot;%xxx%&amp;quot; order by `order` asc, `id` asc limit 20 offset 0</code></pre> <h3>与模型树功能的差别</h3> <p><a href="model-tree.md">模型树</a>同样可用于展示多层级结构数据,并且支持用拖拽的方式实现数据的层级、排序等操作,但是不支持分页和点击加载功能,只能一次性加载完所有数据, 因此<a href="model-tree.md">模型树</a>并不适合用来展示数据量较大的数据。</p> <p>而树状表格支持分页和点击加载功能,适合用来展示数据量较大的多层级结构数据,但不支持用拖拽的方式实现数据的层级、排序操作。</p>

页面列表

ITEM_HTML