区块
<h1>区块(section)</h1>
<h2>简介</h2>
<p><code>Dcat Admin</code>提供<code>section</code>功能允许开发者在项目运行时更改页面各个部分的内容,而不需要直接去修改模板。</p>
<p>> {tip} <code>Dcat Admin</code>的<code>section</code>功能参考了<code>Blade</code>模板引擎的<code>@section</code>功能和<code>Wordpress</code>的<code>add_filter</code>功能,如果开发者理解这两者其中之一就能快速上手。</p>
<h2>使用</h2>
<h3>admin_section</h3>
<p>输出<code>section</code>内容,此函数类似于<code>Blade</code>模板中的<code>@yield</code>指令以及<code>WordPress</code>中的<code>apply_filters</code>函数。</p>
<p>参数:</p>
<ul>
<li><code>$section</code> {string} 区块名称</li>
<li><code>$default</code> {string|Closure} 默认值</li>
<li><code>$options</code> {array} 参数,需要注意的是<code>key</code>值必须使用英文字母开头,否则无法被获取到</li>
</ul>
<p>返回值:</p>
<ul>
<li>{string}</li>
</ul>
<pre><code class="language-php">echo admin_section('navigation', null, ['count' =&gt; 4]);</code></pre>
<h3>admin_inject_section</h3>
<p>注入<code>section</code>内容,此函数类似<code>WordPress</code>中的<code>add_filter</code>函数。</p>
<p>参数:</p>
<ul>
<li><code>$section</code> {string} 区块名称</li>
<li><code>$content</code> {string|Illuminate\Contracts\Support\Renderable|Closure} 区块内容</li>
<li><code>$append</code> {bool} 默认<code>true</code>,是否追加到上一个注入的内容后面,如果传<code>false</code>则会替换掉前面注入的内容</li>
<li><code>$priority</code> {int} 默认<code>10</code>,优先级,值越大排序越靠前</li>
</ul>
<p>当第二个参数传入的是匿名函数时,匿名函数接收一个<code>Illuminate\Support\Fluent</code>对象。匿名函数中接收一个<code>Illuminate\Support\Fluent</code>对象,此对象包含有前面注入到此区块的内容,通过<code>previous</code>属性可以获得;如果此<code>section</code>还有其他参数,也可以通过访问属性的方式获得,如下:</p>
<pre><code class="language-php">admin_inject_section('navigation', e(&quot;&lt;navigation&gt;1&lt;/navigation&gt;&quot;));
admin_inject_section('navigation', function ($options) {
// 获取上一个注入此区块的内容
$previous = $options-&gt;previous;
// 获取自定义参数
$count = $options-&gt;count;
return e(&quot;&lt;navigation&gt;count:{$count}&lt;/navigation&gt;&quot;);
}, true, 11);
// 输出
echo admin_section('navigation', null, ['count' =&gt; 4]);
// 最终输出结果为
// &lt;navigation&gt;count:4&lt;/navigation&gt;&lt;navigation&gt;1&lt;/navigation&gt;</code></pre>
<h3>admin_inject_default_section</h3>
<p>注入默认内容,如果调用了<code>admin_inject_section</code>函数注入内容(无论是在前面还是后面都一样),则此函数不生效。</p>
<p>参数:</p>
<ul>
<li><code>$section</code> {string} 区块名称</li>
<li><code>$content</code> {string|Illuminate\Contracts\Support\Renderable|Closure} 区块内容,与<code>admin_inject_section</code>的第二个参数一致</li>
</ul>
<pre><code class="language-php">admin_inject_default_section('navigation', '暂无数据');</code></pre>
<h3>admin_has_section</h3>
<p>判断是否注入过内容到<code>section</code>,此函数返回一个<code>bool</code>类型值。</p>
<pre><code class="language-php">var_dump(admin_has_section('navigation'));</code></pre>
<h3>admin_has_default_section</h3>
<p>判断是否注入过默认内容到<code>section</code>,此函数返回一个<code>bool</code>类型值。</p>
<pre><code class="language-php">var_dump(admin_has_default_section('navigation'));</code></pre>
<h2>系统预定义区块</h2>
<p><code>Dcat Admin</code>预定义了一些区块,开发者可以通过这些区块改变页面内容。</p>
<p>所有的预定义区块名称都定义在<code>Dcat\Admin\Admin::SECTION</code>这个类常量中,通过类常量的方式访问。</p>
<h3>往<head>标签内输入内容</h3>
<p>此通过<code>Admin::SECTION['HEAD']</code>区块可以往<code>&lt;head&gt;</code>标签内输入内容。</p>
<p>在<code>app\Admin\bootstrap.php</code>中加入以下代码:</p>
<pre><code class="language-php">use Dcat\Admin\Admin;
admin_inject_section(Admin::SECTION['HEAD'], function () {
return '&lt;script src=&quot;//oss.maxcdn.com/respond/1.4.2/respond.min.js&quot;&gt;&lt;/script&gt;';
});</code></pre>
<h3>往<body>标签内输入内容</h3>
<p>通过<code>Admin::SECTION['BODY_INNER_BEFORE']</code>区块可以往<code>&lt;body&gt;</code>标签内部的开头位置输入内容。</p>
<p>通过<code>Admin::SECTION['BODY_INNER_AFTER']</code>区块可以往<code>&lt;body&gt;</code>标签内部的结束位置输入内容。</p>
<h3>往<div id="app">标签内输入内容</h3>
<p>通过<code>Admin::SECTION['APP_INNER_BEFORE']</code>区块可以往<code>&lt;div id=&quot;app&quot;&gt;</code>标签内部的开头位置输入内容。</p>
<p>通过<code>Admin::SECTION['APP_INNER_AFTER']</code>区块可以往<code>&lt;div id=&quot;app&quot;&gt;</code>标签内部的结束位置输入内容。</p>
<h3>更改顶部导航栏用户信息面板内容</h3>
<p>通过<code>Admin::SECTION['NAVBAR_USER_PANEL']</code>区块可以更改顶部导航栏的用户信息面板内容。</p>
<pre><code class="language-php">admin_inject_section(Admin::SECTION['NAVBAR_USER_PANEL'], view('admin::partials.navbar-user-panel'));</code></pre>
<h3>更改顶部导航栏前面内容</h3>
<pre><code class="language-php">admin_inject_section(Admin::SECTION['NAVBAR_BEFORE'], view('...'));</code></pre>
<h3>更改顶部导航栏后面内容</h3>
<pre><code class="language-php">admin_inject_section(Admin::SECTION['NAVBAR_AFTER'], view('...'));</code></pre>
<h3>更改顶部导航栏用户信息面板后面内容</h3>
<p>通过<code>Admin::SECTION['NAVBAR_AFTER_USER_PANEL']</code>区块可以更改顶部导航栏的用户信息面板后面的内容。</p>
<pre><code class="language-php">admin_inject_section(Admin::SECTION['NAVBAR_AFTER_USER_PANEL'], function () {
return &lt;&lt;&lt;HTML
&lt;li&gt;
&lt;a href=&quot;#&quot; data-toggle=&quot;control-sidebar&quot;&gt;&lt;i class=&quot;fa fa-gears&quot;&gt;&lt;/i&gt;&lt;/a&gt;
&lt;/li&gt;
HTML;
});</code></pre>
<h3>更改菜单栏用户信息面板内容</h3>
<p>通过<code>Admin::SECTION['LEFT_SIDEBAR_USER_PANEL']</code>区块可以更改菜单栏的用户信息面板的内容。</p>
<pre><code class="language-php"> admin_inject_section(Admin::SECTION['LEFT_SIDEBAR_USER_PANEL'], view('admin::partials.sidebar-user-panel'));</code></pre>
<h3>更改菜单栏</h3>
<p>通过<code>Admin::SECTION['LEFT_SIDEBAR_MENU']</code>可以更改整个菜单栏内容。
> {tip} <code>Dcat Admin</code>的菜单是通过注入默认内容到<code>LEFT_SIDEBAR_MENU</code>区块构建的,开发者可以替换掉系统默认的菜单渲染逻辑。</p>
<pre><code class="language-php">use Dcat\Admin\Support\Helper;
use Dcat\Admin\Admin;
admin_inject_section(Admin::SECTION['LEFT_SIDEBAR_MENU'], function () {
$menuModel = config('admin.database.menu_model');
$builder = Admin::menu();
$html = '';
foreach (Helper::buildNestedArray((new $menuModel())-&gt;allNodes()) as $item) {
$html .= view('admin::partials.menu', ['item' =&gt; $item, 'builder' =&gt; $builder])-&gt;render();
}
return $html;
});</code></pre>