系统里的说明
下面和后台「说明」是同一套:怎么用、后台每一栏、主题、模板标签,以及环境和安装。
这里是主题里的 Blade 怎么写。在后台换哪一套、复制、上传,见「主题」。也可以在主题页点「编辑模板」直接改(自带主题请先复制一套)。取文章和栏目用 @cms*,见「标签」。不要在主题里写数据库查询。
目录长什么样
resources/views/themes/enterprise/
theme.json
preview.png
index/index.blade.php 首页(必须有,才能「用于本站」)
list/list.blade.php 栏目列表
list/list_product.blade.php 产品列表(可选)
show/show.blade.php 文章详情
show/show_product.blade.php 产品详情(可选)
category/category.blade.php 栏目封面/频道页
search.blade.php
tag.blade.php
sitemap.blade.php
sitemap-page.blade.php 访客可读的站点地图(/sitemap)
partials/layout.blade.php 公共头尾
partials/paginate.blade.php
member/login.blade.php 以及 register、profile 等
缺某个文件时,会去企业主题或 resources/views/cms/ 找一份凑上,不会整站空白。
系统怎么选模板
列表页:栏目自己的列表模板 → 模型上的 list_tpl → 默认 list.list。详情页:文档扩展字段 show_tpl → 栏目 → 模型 → 默认 show.show。名字按点号对应目录,例如 list.list_product 就是 list/list_product.blade.php。
布局优先 partials/layout.blade.php,没有再用主题根目录的 layout.blade.php。
页面骨架
@extends('themes.enterprise.partials.layout')
@section('content')
@cmsBreadcrumb
<h1>{{ $category->t('title') }}</h1>
@cmsContent(['page' => true])
<a href="{{ $item->url }}">{{ $item->t('title') }}</a>
@endcmsContent
@cmsPaginate
@endsection
公共头里放 @cmsSeo。导航用 @include('cms.partials.header-nav') 或自己写 @cmsMenu。
模板里能用的变量
| 变量 | 什么时候有 | 常用写法 |
|---|---|---|
$site | 几乎所有前台页 | 站名、Logo、主色等设置 |
$category | 栏目、列表 | $category->t('title')、frontUrl()、page_size |
$entry | 详情 | $entry->t('title')、t('content')、url、cover、views |
$item | 标签循环里 | 默认循环变量,嵌套时用 'as' => 'cat' 改名 |
多语言文案用 t('title'),不要直接 ->title。模型扩展字段用 $item->attr('price')。图片地址用 cms_media($item->cover),会走站点里配的 CDN。
怎么加一套自己的
- 主题页「复制一套」,或上传 zip(包内要有
index/index.blade.php),或把文件夹直接放到themes/下。 - 命令也可以:
php artisan cms:theme-make brand --from=enterprise --name=品牌站。 - 改 Blade 和 CSS。需要的模型、空栏目写在
theme.json,点「用于本站」时只补缺的,不改已有字段。 - 预览图放
preview.png(或 jpg / svg)。
{
"name": "品牌站",
"description": "公司官网",
"i18n": true,
"responsive": true,
"models": ["article", "page", "product"],
"config": {
"home_notice": {"title": "首页公告", "type": "textarea", "value": ""}
},
"categories": [
{"slug": "news", "title": {"zh_cn": "新闻中心", "en": "News"}, "model": "article", "type": "list", "menu": true}
]
}
zip 里不要带可执行 PHP。自己主题的模型 JSON 也可放在 models/标识.json,格式和后台「导出模型」一样。栏目标题写成对象后,「用于本站」会按语言写入;公共头请留 viewport、语言切换和 cms_ui()。
二次开发用事件,不要改核心
内容保存、评论、表单、换主题、改设置会发出 Laravel 事件。在 app/Providers/AppServiceProvider.php 里 Event::listen 即可,不必改控制器。仓库 CONTRIBUTING.md 有同样一份表。
| 事件 | 什么时候 |
|---|---|
App\Events\EntrySaved | 保存一篇内容。$created 是否新建;$publishedNow 是否这次变成已发布(会员投稿不会标成刚发布) |
App\Events\CommentSubmitted | 前台提交评论(含待审) |
App\Events\CommentModerated | 后台通过 / 拒绝 / 标垃圾 |
App\Events\FormSubmitted | 前台表单提交成功 |
App\Events\ThemeActivated | 当前站换了主题($slug / $previous) |
App\Events\SettingSaved | 设置写入($keys 是改过的键) |
use App\Events\EntrySaved;
use Illuminate\Support\Facades\Event;
Event::listen(EntrySaved::class, function (EntrySaved $e) {
if ($e->publishedNow) {
// 通知搜索引擎、写日志等
}
});
列表里批量改文章状态不发 EntrySaved,避免一次几百封邮件。不要为「发布时做什么」去改核心文件。