你还没走?你已经学习了基础的Symfony CMF并且你只是想学习,越来越多吗?那你就来阅读这一章吧!这一章将会快速介绍一些其他的CMF bundles。大多数的其他bundle都建立在巨人的肩膀上,像这个KnpMenuBundle 和 SonataAdminBundle.
MenuBundle
让我们开始MenuBundle。如果你访问页面,你能够看到一个很棒的菜单。你能在AcmeDemoBundle的layout视图中找到这个渲染的菜单:
1 2 3 4 5 6 7 8 9 10 |
<!-- src/Acme/DemoBundle/Resources/views/layout.html.twig --> <!-- ... --> <nav class="navbar navbar-inverse page__nav" role="navigation"> <div class="container-fluid"> {{ knp_menu_render('simple', {'template': 'AcmeDemoBundle:Menu:bootstrap.html.twig', 'currentClass': 'active'}) }} <!-- ... --> </div> </nav> |
正如你看到的,这个菜单通过 knp_menu_render标签渲染。
这似乎有点奇怪,我们正在谈论CmfMenuBundle而不是KnpMenuBundle,不是吗? 当然正确,但事实是CmfMenuBundle建立在KnpMenuBundle基础上的bundle。
通常,knp_menu_render()是使用菜单名称作为参数去渲染,但当使用CmfMenuBundle时,他是一个节点id。在这个例子中,这个/cms/simple里菜单包含所有实现NodeInterface的项(因为这个web全路径在标准版里是 /cms)。
除了包括PHPCR菜单提供器,这个CmfMenuBundle还提供了Admin类。看本章关于 Sonata Admin的知识。
CreateBundle
我们已经在第一章看到过这个bundle。这个bundle使用FOSRestBundle结合了CreatePHP库(使用这个Create.js库)到Symfony2。
这个Create.js库使用一个REST层。页面上的所有元素获得RDFa Mappings,就是告诉Create.js如何将元素映射到文件。当你保存页面时,这个新的内容是传入到REST api并保存到数据库。
RDFa mappings呈现内容会非常容易,你能在标准版看到:
1 2 3 4 5 |
{% block main %} {% createphp cmfMainContent as="rdf" %} {{ rdf|raw }} {% endcreatephp %} {% endblock %} |
它将使用< div >元素输出内容对象。你也可以使用createphp_*函数来完全自定义。
BlockBundle
如果你访问这个标准版的主页,你将看到三个块:
这些块可以自己编辑和使用。这些块通过BlockBundle提供,他建立在SonataBlockBundle层之上。它提供实用PHPCR来存储块的能力并增加了一些常用的块。
这三个块在标准版里是自定义块。一个块是通过一个块服务来处理。你能够在Acme\DemoBundle\Block\UnitBlockService类中找到这个服务。自从这个块使用PHPCR持久化以来,他还需要一个块文档,他在Acme\DemoBundle\Document\UnitBlock中。
SeoBundle
还有一个SeoBundle。这个bundle建立在SonataSeoBundle之上。它提供了一种方法来从文档提取SEO信息并使用admin来编辑SEO信息。
标准版集成了这个SeoBundle,你需要composer require symfony-cmf/seo-bundle命令把它包含到你的项目中,然后注册CMF和Sonata Bundle的seo到AppKernel:
1 2 3 4 5 6 7 8 9 10 11 12 |
// app/AppKernel.php // ... public function registerBundles() { $bundles = array( // ... new Sonata\SeoBundle\SonataSeoBundle(), new Symfony\Cmf\Bundle\SeoBundle\CmfSeoBundle(), ); // ... } |
现在,你可以配置一个标准的title。当CmfSeoBundle从一个内容对象中取出这个title,这个title就被使用了:
1 2 3 |
# app/config/config.yml cmf_seo: title: "%%content_title%% | Standard Edition" |
这个%%content_title%%将被从内容对象里获取的title所替换。你最后需要做的事情就是使用这个标题的标题元素。要做到这一点,就在
src/Acme/DemoBundle/Resources/views/layout.html.twig模板中替换<title>标签:
1 |
{% block title %}{{ sonata_seo_title() }}{% endblock %} |
当你访问你的新网站时,你就能看到每个页面的标题了。
一些页面,像登陆页面,不需要使用内容对象。在这个例子中,你能配置默认的title:
1 2 3 4 |
# app/config/config.yml sonata_seo: page: title: Standard Edition |
这个默认的title是配置在sonata_seo扩展下,这个标准版的title被配置在cmf_seo扩展下。
这个title仅仅是SeoBundle的一个特性,它能够开始或者处理更多的seo信息。
Sonata Admin
我们已经解释了你的这个CMF是基于数据库,为了可以不改变代码通过一个admin来编辑。但是我没有告诉你admin如何管理和维护网站。现在是时候该展示怎么做了:使用SonataAdminBundle。CMF bundle定义了一些可编辑的元素也提供了在admin中其他的元素可编辑。
默认,当这个SonataDoctrinePHPCRAdminBundle被安装,在CMF bundle中的所有admin类将被启用。你可以在配置中关掉这个admin类。例如,禁用MenuBundle的admin类,你应该这么做:
1 2 3 4 5 |
# app/config/config.yml cmf_menu: persistence: phpcr: use_sonata_admin: false |
你也能禁用/启用所有的CMF admin类,通过配置这个cmf_core bundle:
1 2 3 4 5 |
# app/config/config.yml cmf_core: persistence: phpcr: use_sonata_admin: false |
当这个admin类被启用,这个admin能够访问/admin(如果你正确安装了SonataAdminBundle)并找到著名的admin dashboard,看到所有需要的:
你看到在左边,admin使用TreeBrowserBundle去显示现有的admin树,在这里这个admin能够去点击节点,去编辑,删除或者移动她们。
总结
你做到了!让我们来总结一下你在快速入门学到了什么:
- symfony的CMF是高度可定制的内容管理系统;
- Symfony CMF团队创建的bundle是一个具有CMS特性的bundle,可以两者一起使用还可独立使用;
- Symfony CMF使用数据库为了让admin做更多编辑的事情,然而配置保存在文件系统去保持部署的简单并支持版本控制;
- PHPCR是建立CMS系统的一个伟大的数据库,但symfony cmf也能使用任何其他的存储系统;
- 相反,结合控制器到路由,路由再绑定内容对象;
- Symfony CMF当心不要重复发明轮子。很多的bundle集合一处俗称symfony2 bundle;
我不能告诉你更多关于体系结构和Symfony CMF Bundle,但仍然可以有很多的探索。看看the book ,开始使用Symfony CMF来做第一个项目。