strix / sonata-cms-bundle
基于Sonata Admin项目的cms包
Requires
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提供的“方便”构造函数!