strix/sonata-cms-bundle

此包已被废弃,不再维护。未建议替代包。

基于Sonata Admin项目的cms包

dev-master 2014-06-03 22:48 UTC

This package is not auto-updated.

Last update: 2016-03-08 07:32:25 UTC


README

简单的CMS,基于sonata-admin包构建;主要思想是拥有一个几乎可以立即使用的CMS。换句话说,用symfony你有砖块,用sonata-admin包你有墙壁,而这个CMS将涵盖所有剩下的细节。

主要功能

  • 多语言CMS,具有易于使用的翻译系统;
  • 易于实现复杂的目录系统
  • 易于扩展的CMS

安装

简单的composer安装

{
    "strix/sonata-cms-bundle": "dev-master"
}
<?php
    new Strix\SonataCmsBundle\StrixSonataCmsBundle(),

该包本身不需要任何其他包,因此您可以自己选择依赖版本,但以下为推荐方法

A2Lix翻译包 - 适用于翻译

一个稍微过时的版本,实际上与Stof的doctrine扩展一起工作

composer

{
    "a2lix/translation-form-bundle": "1.*@dev",
}

kernel

<?php
    new A2lix\TranslationFormBundle\A2lixTranslationFormBundle(),

在config.yml中覆盖A2Lix表单模板

a2lix_translation_form:
    locales: [en, ru, lv]
    default_required: true
    manager_registry: doctrine
    templating: "StrixSonataCmsBundle::a2lix_v1x.html.twig"

Stof的doctrine扩展包 - 适用于几乎所有内容

{
        "stof/doctrine-extensions-bundle": "~1.1@dev"
}

kernel

<?php
    new Stof\DoctrineExtensionsBundle\StofDoctrineExtensionsBundle(),

确保 Doctrine扩展在A2LixTranslations之前包含。

config.yml中添加Doctrine扩展的映射

    orm:
        auto_generate_proxy_classes: "%kernel.debug%"
        #doctrine extensions
        entity_managers:
            default:
                auto_mapping: true
                mappings:
                    gedmo_translatable:
                        type: annotation
                        prefix: Gedmo\Translatable\Entity
                        dir: "%kernel.root_dir%/../vendor/gedmo/doctrine-extensions/lib/Gedmo/Translatable/Entity"
                        alias: GedmoTranslatable # this one is optional and will default to the name set for the mapping
                        is_bundle: false
                    gedmo_translator:
                        type: annotation
                        prefix: Gedmo\Translator\Entity
                        dir: "%kernel.root_dir%/../vendor/gedmo/doctrine-extensions/lib/Gedmo/Translator/Entity"
                        alias: GedmoTranslator # this one is optional and will default to the name set for the mapping
                        is_bundle: false
                    gedmo_loggable:
                        type: annotation
                        prefix: Gedmo\Loggable\Entity
                        dir: "%kernel.root_dir%/../vendor/gedmo/doctrine-extensions/lib/Gedmo/Loggable/Entity"
                        alias: GedmoLoggable # this one is optional and will default to the name set for the mapping
                        is_bundle: false
                    gedmo_tree:
                        type: annotation
                        prefix: Gedmo\Tree\Entity
                        dir: "%kernel.root_dir%/../vendor/gedmo/doctrine-extensions/lib/Gedmo/Tree/Entity"
                        alias: GedmoTree # this one is optional and will default to the name set for the mapping
                        is_bundle: false

配置Stof包

stof_doctrine_extensions:
    default_locale: en_US
    orm:
        default:
            tree: true
            translatable: true
            sluggable: true

CMS

本节介绍了如何将此包用作CMS系统。酷,不是吗?

CMS树

这是CMS系统的核心和灵魂。一个分类树统治一切 - 这不是开发者的梦想吗?但首先,让我们深入了解概念

  • 上下文。上下文是单独定义的。可能的上下文有“顶部菜单”、“左侧菜单”、“页脚”等等。你明白我的意思。您必须将上下文应用于节点,以在应用程序中分离不同的分类树
  • 别名。默认情况下,别名是可翻译的,并为应用程序形成路由
  • 模板和控制器。每个路由都有一个控制器和一个模板。您以后可以添加自定义控制器。
  • 内容块。这是模板中的基本文本块 - 文本块、横幅块等等

由于很难使用继承/映射超类制作可翻译的实体(您可以稍后扩展),所以我们为您准备了实体占位符。然而,这种行为可能会稍后改变,包括生成实体和/或必需的接口。

主要实体

<?php
TODO HERE

翻译

<?php
TODO HERE

存储库类

<?php
TODO HERE

除了这些实体之外,您应该扩展AbstractTemplateEntity、AbstractControllerEntity、AbstractCmsContextEntity以及相应的管理员 - 看看下面的语言示例。

Twig函数

待办事项

语言

添加您的语言实体

<?php
/**
 * @ORM\Entity(repositoryClass="Gedmo\Sortable\Entity\Repository\SortableRepository")
 * @ORM\Table(name="languages")
 */
class Language extends AbstractLanguageEntity
{
}

为语言实体创建管理员

<?php
class LanguageAdmin extends AbstractLanguageAdmin
{
}

并配置包使用此实体作为语言

strix_sonata_cms:
    language_entity: AwesomeSiteBundle:Language

就这样。现在StrixSonataCmsBundle知道在哪里获取语言列表。

AbstractStrixSonataCmsAdmin功能

所有实例都需要调用setContainer。对此表示歉意。

处理 Gedmo\Sortable 字段
<?php
class Admin extends AbstractStrixSonataCmsAdmin
{
    protected $sortableField = 'position';
    protected $isSortable = true;
    protected function configureListFields(ListMapper $list)
    {
        $this->addSortableControls($list);
    }
}
处理布尔字段
<?php
class Admin extends AbstractStrixSonataCmsAdmin
{
    protected function configureListFields(ListMapper $list)
    {
        $this->addBooleanControls($list, 'enabled');
    }
}

顺便说一下,您可以通过向此调用传递额外的参数来确保只有一个实体可以具有'开启'值,如下所示

<?php
$this->addBooleanControls($list, 'default', true);

处理'default'字段的好方法,对吧?

当前区域设置列表(用于管理员中的翻译)

它使您能够获取默认语言和当前语言列表,请参阅 CMS -> 语言部分。

<?php
    $this->getCmsLanguages($fetchDisabled = false); //retuns array of entities
    $this->getDefaultCmsLanguage(); //returns one entity or null

请随意在您的管理员类中使用它

<?php
    ->add('translations', 'a2lix_translations_gedmo', array(
        'locales' => array_map(function ($obj) { return $obj->getCode(); }, $this->getCmsLanguages()),

此包依赖于嵌套集合树,因此请准备您的EntityRepository

<?php
class CategoryRepository extends NestedTreeRepository
{

}

准备您的实体

<?php
/**
 * @Gedmo\Tree(type="nested")
 * @ORM\Entity(repositoryClass="CategoryRepository")
 */
class Category extends AbstractStrixCmsTreeNode
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     * @var integer
     */
    protected $id;

    /**
     * @ORM\Column(type="string", length=128)
     * @var string
     */
    protected $title;

    /**
    * @Gedmo\TreeLeft
    * @ORM\Column(type="integer", name="tree_left")
    */
    protected $left;

    /**
     * @Gedmo\TreeRight
     * @ORM\Column(type="integer", name="tree_right")
     */
    protected $right;

    /**
     * @Gedmo\TreeParent
     * @ORM\ManyToOne(targetEntity="HydroCategory", inversedBy="children")
     * @ORM\JoinColumn(name="parent_id", referencedColumnName="id", onDelete="CASCADE")
     */
    protected $parent;

    /**
     * @Gedmo\TreeRoot
     * @ORM\Column(type="integer", nullable=true, name="tree_root")
     */
    protected $root;

    /**
     * @Gedmo\TreeLevel
     * @ORM\Column(name="tree_level", type="integer")
     */
    protected $level;

    /**
     * @ORM\OneToMany(targetEntity="HydroCategory", mappedBy="parent")
     * @ORM\OrderBy({"left" = "ASC"})
     */
    protected $children;

请确保您扩展AbstractStrixCmsTreeNode并实现getTitleFieldName。同时,不要忘记为$children添加@ORM\OrderBy({"left" = "ASC"})注解。

接下来,在您的管理员类中,执行以下操作

<?php
use Strix\SonataCmsBundle\Admin\AbstractTreeAdmin;

class TreeAdmin extends AbstractTreeAdmin
{
    protected $titleField = 'title';
}

哇,很简单。只是别忘了在您的管理员定义中添加setContainer调用,这样上下方法就可以使用了

    awasome.tree.admin:
        class: Awesome\TreeAdmin
        tags:
            - { name: sonata.admin, manager_type: orm, group: "Awesome demo", label: "Tree" }
        arguments:
            - ~
            - Awesome\Entity\Category
            - ~
        calls:
            - [ setRequest, [ @service_container ] ]

翻译

管理员中的翻译基于StofDoctrineExtensionsBundle和A2LixTranslationFormBundle,版本有点旧,不是最新版本。

按照以下方式将翻译添加到管理员中

<?php
    ->add('translations', 'a2lix_translations_gedmo', array(
        'fields' => array(
            'title' => array(
                'required' => false
            ),
            'subtitle' => array(
                'required' => false
            ),
            'description' => array(
                'required' => false,
                'attr' => array('style' => 'width: 800px; height: 100px;')
            ),
            'standardEquipment' => array(
                'required' => false,
                'attr' => array('style' => 'width: 800px; height: 300px;')
            )
        )
    ));

请注意!为了使翻译工作,您需要在管理员类中更新对象,如下所示

<?php
    public function preUpdate($object)
    {
        foreach ($object->getTranslations() as $translation) {
            $translation->setObject($object);
    }
    public function prePersist($object)
    {
        foreach ($object->getTranslations() as $translation) {
            $translation->setObject($object);
    }

别忘了为嵌入式OneToMany集合做同样的事情!

至少,定义您的实体如下所示

主实体

<?php
/**
 * @ORM\Entity
 * @Gedmo\TranslationEntity(class="ProductTranslation")
 */
class Product
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     * @ORM\Column(type="integer")
     * @var integer
     */
    protected $id;

    /**
     * @Gedmo\Translatable
     * @ORM\Column(type="string", length=128, nullable=true)
     * @var string
     */
    protected $title;

    /**
     * @ORM\OneToMany(
     *   targetEntity="ProductTranslation",
     *   mappedBy="object",
     *   cascade={"persist", "remove"}
     * )
     */
    private $translations;
}

实体翻译

<?php
/**
 * @ORM\Entity
 * @ORM\Table(name="product_translations",
 *     uniqueConstraints={@ORM\UniqueConstraint(name="lookup_unique_idx", columns={
 *         "locale", "object_id", "field"
 *     })}
 * )
 */
class ProductTranslation extends AbstractPersonalTranslation
{
    /**
     * @ORM\ManyToOne(targetEntity="Product", inversedBy="translations")
     * @ORM\JoinColumn(name="object_id", referencedColumnName="id", onDelete="CASCADE")
     */
    protected $object;
}

不要添加Gedmo提供的“方便”构造函数!