LeafCMS GitHub 开始安装
Docs

系统里的说明

下面和后台「说明」是同一套:怎么用、后台每一栏、主题、模板标签,以及环境和安装。

这里是主题里的 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。

怎么加一套自己的

  1. 主题页「复制一套」,或上传 zip(包内要有 index/index.blade.php),或把文件夹直接放到 themes/ 下。
  2. 命令也可以:php artisan cms:theme-make brand --from=enterprise --name=品牌站。
  3. 改 Blade 和 CSS。需要的模型、空栏目写在 theme.json,点「用于本站」时只补缺的,不改已有字段。
  4. 预览图放 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,避免一次几百封邮件。不要为「发布时做什么」去改核心文件。

飞机群 @sanpang