orbitale / cms-bundle
为 Symfony 开发的简单轻量级 CMS 插件
Requires
- php: >=7.3
- doctrine/annotations: ^1.8
- doctrine/doctrine-bundle: ^2.0
- doctrine/orm: ^2.5.1
- symfony/asset: ^5.3|^6.0
- symfony/config: ^5.3|^6.0
- symfony/dependency-injection: ^5.3|^6.0
- symfony/framework-bundle: ^5.3|^6.0
- symfony/http-foundation: ^5.3|^6.0
- symfony/http-kernel: ^5.3|^6.0
- symfony/string: ^5.3|^6.0
- symfony/translation: ^5.3|^6.0
- symfony/twig-bundle: ^5.3|^6.0
- symfony/validator: ^5.3|^6.0
- twig/twig: ^2.7|^3.0
Requires (Dev)
- symfony/browser-kit: ^5.3|^6.0
- symfony/css-selector: ^5.3|^6.0
- symfony/dom-crawler: ^5.3|^6.0
- symfony/phpunit-bridge: ^5.3|^6.0
- symfony/yaml: ^5.3|^6.0
Suggests
- javiereguiluz/easyadmin-bundle: To manage your pages directly inside your CMS (view documentation).
- 4.x-dev
- v4.1.0
- v4.0.1
- v4.0.0
- 3.x-dev
- v3.1.1
- v3.1.0
- v3.0.6
- v3.0.5
- v3.0.4
- v3.0.3
- v3.0.2
- v3.0.1
- v3.0.0
- 2.x-dev
- v2.0.5
- v2.0.4
- v2.0.3
- v2.0.2
- v2.0.1
- v2.0.0
- v2.0.0-beta2
- v2.0.0-beta1
- 1.x-dev
- v1.6.4
- v1.6.3
- v1.6.2
- v1.6.1
- v1.6.0
- v1.5.1
- v1.5.0
- v1.4.1
- v1.4.0
- v1.3.3
- v1.3.2
- v1.3.1
- v1.3.0
- v1.2.3
- v1.2.2
- v1.2.1
- v1.2.0
- v1.1.1
- v1.1.0
- v1.0.0
- v1.0.0-beta
- dev-4.x-layout-issue
This package is auto-updated.
Last update: 2024-09-15 20:20:35 UTC
README
⚠️ 您正在查看 4.x 分支的文档。
如果您需要关于 3.x 的信息,请访问 这里。如果您需要关于 2.x 的信息,请访问 这里。如果您需要关于 1.x 的信息,请访问 这里
索引
- 要求
- 安装
- 设置
- 使用方法
- 管理页面
- 查看页面
- 基于单页生成路由
- 更改主页
- 基于
host
和/或locale
进行页面限制 - 设计
- 使用不同的布局
- 高级布局配置
- 更改 "面包屑" 外观
- 设置 EasyAdminBundle 以在它的后端管理页面和分类
- 配置参考
- 变更日志
Orbitale CMS Bundle
此插件是一个简单的助手,用于创建一个基于经典页面和分类系统的简单 CMS。
要求
- PHP 7.0+
- Symfony 3.0+
- Doctrine ORM
安装
使用 Composer 安装此插件
$ composer require orbitale/cms-bundle
设置
在您的 Kernel 中注册必要的插件
<?php // app/AppKernel.php public function registerBundles() { $bundles = [ // ... new Orbitale\Bundle\CmsBundle\OrbitaleCmsBundle(), ]; }
导入必要的路由文件。
警告:由于存在 "树状" 路由管理,Page
和 Category
控制器必须在它们的路由路径中 "独立"。如果您将前缀设置为 "/" 或任何其他路径,请确保将 OrbitaleCmsBundle
路由加载在您的路由文件 末尾,否则您可能会遇到一些意外的 "404" 或其他错误,具体取决于路由的优先级。
因此,我们建议您 在 PageController
之前加载 CategoryController
,并让两个路由配置成为您的 routing.yml
文件的 最后几个 配置。
注意:在技术术语中,整个 URI 都会被扫描,而不仅仅是简单的一部分,这就是为什么它可以分析非常深的 URI,如 /home/blog/parent-link/child-link/element
,并检查所有页面/分类。
示例
# app/config/routing.yml orbitale_cms_category: resource: "@OrbitaleCmsBundle/Resources/config/routing/categories.yaml" prefix: /category/ orbitale_cms_page: resource: "@OrbitaleCmsBundle/Resources/config/routing/pages.yaml" prefix: /page/
创建您的实体
此插件只支持 Doctrine ORM。
为了使用它,您必须创建自己的实体,并用它们配置插件。
更新您的配置
# app/config/config.yml orbitale_cms: page_class: AppBundle\Entity\Page category_class: AppBundle\Entity\Category
创建 Page
实体并将其添加到您的配置中
<?php namespace AppBundle\Entity; use Orbitale\Bundle\CmsBundle\Entity\Page as BasePage; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity(repositoryClass="Orbitale\Bundle\CmsBundle\Repository\PageRepository") * @ORM\Table(name="orbitale_cms_pages") */ class Page extends BasePage { /** * @var int * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; /** * @return int */ public function getId() { return $this->id; } }
创建 Category
实体并将其添加到您的配置中
<?php namespace AppBundle\Entity; use Orbitale\Bundle\CmsBundle\Entity\Category as BaseCategory; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity(repositoryClass="Orbitale\Bundle\CmsBundle\Repository\CategoryRepository") * @ORM\Table(name="orbitale_cms_categories") */ class Category extends BaseCategory { /** * @var int * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; /** * @return int */ public function getId() { return $this->id; } }
更新您的数据库模式
从您的 Symfony 根目录执行此命令以更新您的数据库
$ php app/console doctrine:schema:update --force
使用方法
管理页面
为了管理您的页面,您应该使用任何后端解决方案,例如 EasyAdmin(我们建议使用)或 SonataAdmin,或任何其他可以进行 CRUD 操作的实体后端解决方案。您必须配置它来管理至少 Orbitale\Bundle\CmsBundle\Entity\Page
实体。
查看页面
PageController
处理一些方法,通过单个 indexAction()
查看页面,而 CategoryController
使用其路由来显示特定 Category
内的所有页面。
两个的URI都简单,为 /{slug}
,其中 slug
是页面或分类的别名。
如果你的页面或分类有一个 父分类
,则URI如下: /{parentSlug}/{slug}
。
你可以注意到,我们在生成的URL中尊重页面的层次结构。
只要你将这些页面或分类视为 父分类
和 子分类
的关系,你就可以导航到一个复杂的页面或分类列表。
这允许你拥有这样的URL,例如: http://www.mysite.com/about/company/team/members
,将只显示 members
页面,但其父页面有一个父页面,以此类推,直到达到“根”父页面。对于分类也是同样的行为。
注意:这是你必须使用特定路由规则的确切原因,否则你可能会遇到许多“404”错误。
基于单页生成路由
注意:此行为也适用于分类。
如果你在视图或控制器中有一个 Page
对象,你可以通过使用 getTree()
方法获取整个树状结构,该方法将遍历所有父级并返回一个基于分隔符参数的字符串(默认为 /
,用于URL)。
让我们用一个这样的树状结构来举个例子
/ - Home (root url)
├─ /welcome - Welcome page (set as "homepage", so "Home" will be the same)
│ ├─ /welcome/our-company - Our company
│ ├─ /welcome/our-company/financial - Financial
│ └─ /welcome/our-company/team - Team
└─ Contact
假设我们想要生成“团队”页面的URL。你在视图/控制器中有这个 Page
对象。
{# Page : "Team" #} {{ path('orbitale_cms_page', {"slugs": page.tree}) }} {# Will show : /welcome/our-company/team #}
或者在控制器中
// Page : "Team" $url = $this->generateUrl('orbitale_cms_page', ['slugs' => $page->getTree()]); // $url === /welcome/our-company/team
有了这个,你就有了CMS的功能性树状系统!
更改主页
首页总是第一个将 homepage
属性设置为true的 Page
对象。确保只有一个元素被定义为首页,否则你可能会得到意外结果。
如果你根据主机和地区添加限制,你可以有多个首页(请参阅下一章)。
基于 host
和/或 locale
的页面限制
如果你在一个多域名平台上托管你的应用程序,你可以在你的页面中使用 host
属性来限制视图只针对指定的主机。
例如,如果你想在不同域名上拥有不同的文章,如 blog.mydomain.com
和 www.mydomain.com
,这会非常有用。
如果你想通过 locale
来限制,你可以在页面上指定地区。最佳联合使用是与路由文件中的前缀路由一起使用
# app/config/routing.yml orbitale_cms_page: resource: "@OrbitaleCmsBundle/Controller/PageController.php" type: annotation # Add the locale to the prefix for if the page's locale is specified and is # not equal to request locale, the app will return a 404 error. prefix: /{_locale}/page/
设计
OrbitaleCmsBundle
提供了一些选项来自定义简单CMS的设计。
大多数情况下,你需要关注 layouts
选项(请参阅下一章),或者 design
选项。
使用不同的布局
显然,默认布局没有样式。
要更改布局,只需更改 OrbitaleCmsBundle 配置以添加你自己的布局
# app/config/config.yml orbitale_cms: layouts: front: { resource: @App/layout.html.twig } # The Twig path to your layout
在不覆盖任何内容的情况下,你可以轻松更改CMS的布局!
查看默认布局以了解哪些Twig块是渲染页面所必需的。
高级布局配置
布局的基本配置是指定一个要扩展的模板。
但如果你查看配置参考,你会看到你可以使用许多其他参数来定义布局
布局配置的原型
- name(用作布局列表键的属性)
你的布局名称。只是为了可读性,也许为了从配置中直接获取(如果你需要的话)。 - resource:
用于渲染所有页面的Twig模板(请参阅上面部分) - assets_css 和 assets_js
任何需要发送给 Twigasset()
函数的资产。CSS 在stylesheets
块中渲染,js 在javascripts
块中。 - host:
您想要布局与之匹配的确切域名。 - pattern:
您想要与此布局匹配的路径的正则表达式。如果您想为类别和页面使用不同的布局,这会很方便。例如,您可以指定^/page/
模式的布局,并为^/category/
指定另一个布局。如果您指定一个非常深的模式,甚至可以更改单个页面的布局!
如果您需要获取原型默认值,请重新查看 配置参考。
⚠️ 警告! 将使用与路由相同的方式,首先匹配到的布局将被使用,因此请确保以正确的顺序进行配置!
空值将不被考虑。
更改“面包屑”外观
在 design
选项下,有一些可以用来优化面包屑渲染的选项。
基本上,它看起来像这样
注意: 面包屑包装器在其标签上已经具有 id="breadcrumbs"
。
- breadcrumbs_class:
更改面包屑包装器的类。 - breadcrumbs_link_class:
更改面包屑中任何链接的类。 - breadcrumbs_current_class:
更改面包屑中当前页面(不是链接)的类。 - breadcrumbs_separator (默认:">")
更改默认分隔符。您可以使用任何内容,但我们在网上最常见的是>
、/
、|
或*
。
注意: 在 twig 中,此字符已被转义,因此请勿使用类似←
或&
符号将被替换为&
(以及其他字符)。 - breadcrumbs_separator_class:
如果您想使用特殊设计或交互,可以指定分隔符(由<span>
标签包装)的类。
缓存
如果您想缓存 CMS 结果,只需通过配置激活即可
cache: enabled: true ttl: 300
它使用 Doctrine 结果缓存,因此您需要激活它
doctrine: orm: result_cache_driver: apcu
您可以在这里了解更多关于 DoctrineCache 的信息。
设置 EasyAdminBundle 以在后端管理页面和类别
此配置允许您直接在 EasyAdminBundle 中管理您的页面和类别。
首先,安装 EasyAdminBundle
,并通过阅读其文档(查看上面的链接)进行设置。
安装后,您可以将此配置添加到 EasyAdmin 中以注入您的新类
# app/config/config.yml easy_admin: entities: Pages: label: admin.cms.pages class: App\Entity\Page show: fields: [ id, parent, title, slug, tree, content, metaDescription, metaTitle, category, host, locale, homepage, enabled ] list: fields: [ id, parent, title, slug, tree, host, locale, { property: homepage, type: boolean }, { property: enabled, type: boolean } ] form: fields: [ title, slug, content, metaDescription, metaTitle, metaKeywords, css, js, category, parent, host, homepage, enabled ] Categories: label: "Cms Categories" class: App\Entity\Category show: fields: [ id, parent, title, slug, tree, content, host, locale, homepage, enabled ] list: fields: [ id, parent, name, slug, description, { property: enabled, type: boolean } ] form: fields: [ name, slug, description, parent, enabled ]
配置参考
# app/config/config.yml orbitale_cms: page_class: ~ # Required, must extend Orbitale Page class category_class: ~ # Required, must extend Orbitale Category class layouts: # Prototype name: name: ~ # Optional, it's automatically set from the key if it's a string resource: ~ # Required, must be a valid twig template assets_css: [] # Injected with the `asset()` twig function assets_js: [] # Injected with the `asset()` twig function pattern: ~ # Regexp host: ~ # Exact value design: breadcrumbs_class: "breadcrumb" # The default value automatically suits to Bootstrap breadcrumbs_link_class: "" breadcrumbs_current_class: "" breadcrumbs_separator: ">" breadcrumbs_separator_class: "breadcrumb-separator" cache: enabled: false ttl: 300
变更日志
前往 发布 页面查看 Orbitale CmsBundle 每个新版本之间的更改!