orbitale/cms-bundle

为 Symfony 开发的简单轻量级 CMS 插件

资助包维护!
pierstoval

安装次数: 42,433

依赖关系: 0

建议者: 0

安全: 0

星级: 60

关注者: 7

分支: 14

开放问题: 4

类型:symfony-bundle

v4.1.0 2021-12-15 13:59 UTC

README

SensioLabsInsight Coverage Status Build Status Scrutinizer Code Quality

⚠️ 您正在查看 4.x 分支的文档。
如果您需要关于 3.x 的信息,请访问 这里。如果您需要关于 2.x 的信息,请访问 这里。如果您需要关于 1.x 的信息,请访问 这里

索引

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(),
    ];
}

导入必要的路由文件。

警告:由于存在 "树状" 路由管理,PageCategory 控制器必须在它们的路由路径中 "独立"。如果您将前缀设置为 "/" 或任何其他路径,请确保将 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.comwww.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_cssassets_js
    任何需要发送给 Twig asset() 函数的资产。CSS 在 stylesheets 块中渲染,js 在 javascripts 块中。
  • host:
    您想要布局与之匹配的确切域名。
  • pattern:
    您想要与此布局匹配的路径的正则表达式。如果您想为类别和页面使用不同的布局,这会很方便。例如,您可以指定 ^/page/ 模式的布局,并为 ^/category/ 指定另一个布局。如果您指定一个非常深的模式,甚至可以更改单个页面的布局!

如果您需要获取原型默认值,请重新查看 配置参考

⚠️ 警告! 将使用与路由相同的方式,首先匹配到的布局将被使用,因此请确保以正确的顺序进行配置!
空值将不被考虑。

更改“面包屑”外观

design 选项下,有一些可以用来优化面包屑渲染的选项。

基本上,它看起来像这样

首页 > 父页面 > 当前页面

注意: 面包屑包装器在其标签上已经具有 id="breadcrumbs"

  • breadcrumbs_class:
    更改面包屑包装器的类。
  • breadcrumbs_link_class:
    更改面包屑中任何链接的类。
  • breadcrumbs_current_class:
    更改面包屑中当前页面(不是链接)的类。
  • breadcrumbs_separator (默认:">")
    更改默认分隔符。您可以使用任何内容,但我们在网上最常见的是 >/|*
    注意: 在 twig 中,此字符已被转义,因此请勿使用类似 &larr;& 符号将被替换为 &amp;(以及其他字符)。
  • 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 每个新版本之间的更改!