视图与自定义页面

视图

Dcat Admin中我们可以用admin_view函数渲染视图,这个功能借鉴了vue的设计思想,可以把HTMLCSSJS代码写在同一个模板文件中,让代码分层更清晰更简洁易读,如

  1. <div class="my-class">...</div>
  2. <style>
  3. .my-class {
  4. color: blue;
  5. }
  6. </style>
  7. <script require="@test1,@test2" init=".my-class">
  8. $this.css({background: 'red'})
  9. </script>

php中渲染这个视图

  1. public function index(Content $content)
  2. {
  3. return $content->body(admin_view('...'));
  4. }

示例解析

上面示例中的代码,其实相当于下面的代码

  1. <div class="my-class">...</div>
  1. public function index(Content $content)
  2. {
  3. admin_require_assets(['@test1', '@test2']);
  4. admin_style('.my-class {
  5. color: blue;
  6. }');
  7. admin_script(
  8. <<<JS
  9. Dcat.init('.my-class', function (\$this, id) {
  10. \$this.css({background: 'red'})
  11. });
  12. JS
  13. );
  14. return $content->body(view('...'));
  15. }

很显然,使用admin_view渲染视图会让你的代码更简洁易读,关于Dcat.init以及script标签中的initrequire属性的用法,请参考文档静态资源以及动态监听元素生成 (init)章节。

自定义页面

Dcat Admin中构建自定义页面非常简单,可以参考如下两个例子

示例1

{tip} Dcat Admin构建的是一个单页应用,加载的JS脚本只会执行一次,所以初始化操作不能直接放在JS脚本中,应该使用Admin::script方法载入。

  1. <?php
  2. namespace App\Admin\Pages;
  3. use Illuminate\Contracts\Support\Renderable;
  4. class MyPage implements Renderable
  5. {
  6. public function render()
  7. {
  8. return admin_view('admin.pages.my-page');
  9. }
  10. }

视图admin.pages.my-page,注意视图代码里面不要包含<body><html>等标签

  1. <div class="my-class">
  2. <h3>自定义页面演示</h3>
  3. </div>
  4. <!--
  5. 引入页面所需的静态资源,这里会按需加载
  6. js脚本不能直接包含初始化操作,否则页面刷新后无效
  7. -->
  8. {!! admin_js(['xxx/js/page.min.js']) !!}
  9. {!! admin_css(['xxx/js/page.min.css']) !!}
  10. <script init=".my-class">
  11. // js代码也可以放在模板里面
  12. console.log('所有JS脚本都加载完了!!!');
  13. $this.on('click', function () {
  14. ...
  15. });
  16. </script>

使用

  1. public function index(Content $content)
  2. {
  3. return $content->body(new MyPage());
  4. }

示例2

后台的仪表盘页面/admin,也可以看做是一个自定义页面,代码实现如下

  1. public function index(Content $content)
  2. {
  3. return $content
  4. ->header('Dashboard')
  5. ->description('Description...')
  6. ->body(function (Row $row) {
  7. $row->column(6, function (Column $column) {
  8. $column->row(Dashboard::title());
  9. $column->row(new Examples\Tickets());
  10. });
  11. $row->column(6, function (Column $column) {
  12. $column->row(function (Row $row) {
  13. $row->column(6, new Examples\NewUsers());
  14. $row->column(6, new Examples\NewDevices());
  15. });
  16. $column->row(new Examples\Sessions());
  17. $column->row(new Examples\ProductOrders());
  18. });
  19. });
  20. }