lexxpavlov / pagebundle
Symfony2 页面包,包含元数据、预定义表单类型和 Sonata Admin 服务
Requires
- php: >=5.3.2
- stof/doctrine-extensions-bundle: >=1.1
- symfony/symfony: >=2.1
Suggests
- egeloen/ckeditor-bundle: Allow use CKEditor in the content field
This package is auto-updated.
Last update: 2024-09-23 02:54:31 UTC
README
此包帮助您在 Symfony2 项目中管理静态页面。
包包含一个页面实体,具有以下字段
- title - 页面标题
- content - HTML 内容。可以使用 ckeditor 进行内容的易于 wysiwyg 编辑
- slug - 用作页面 URL。可以基于标题自动生成
- published - 启用或禁用页面
- publishedAt, createdAt, updatedAt - 包含页面实际信息的日期时间字段
- meta: keywords and description - SEO 信息
如果您使用 SonataAdminBundle,则此包会自动将其添加到其中。
安装
Composer
将 LexxpavlovPageBundle 及其依赖项下载到 vendor 目录。该包需要 StofDoctrineExtensionsBundle 作为必需依赖项,以及 IvoryCKEditorBundle 作为可选依赖项。
您可以使用 Composer 自动化此过程
$ php composer.phar require lexxpavlov/pagebundle
或将包链接手动添加到您的 composer.json
中,并运行 $ php composer.phar update
{ "require" : { "lexxpavlov/pagebundle": "~1.0" }, }
Composer 将将包安装到 vendor/lexxpavlov
目录。如果之前未安装,StofDoctrineExtensionsBundle 将自动安装。
将包添加到您的应用程序内核
// app/AppKernel.php public function registerBundles() { $bundles = array( // ... new Stof\DoctrineExtensionsBundle\StofDoctrineExtensionsBundle(), new Lexxpavlov\PageBundle\LexxpavlovPageBundle(), // ... ); }
如果您已经在您的 AppKernel
中有 StofDoctrineExtensionsBundle
,则不需要重复添加。
配置
首先,您必须创建自己的页面实体类。通过从包中的基本页面扩展来实现这一点很容易。
<?php namespace App\YourBundle\Entity; use Doctrine\ORM\Mapping as ORM; use Lexxpavlov\PageBundle\Entity\Page as BasePage; /** * @ORM\Entity() */ class Page extends BasePage { // Be free to add your fields here }
以下是包的默认配置
stof_doctrine_extensions: default_locale: %locale% orm: default: timestampable: true lexxpavlov_page: entity_class: App\YourBundle\Entity\Page
这将激活 doctrine Timestampable 扩展。您还可以激活 Sluggable 和 Blameable 扩展(见下文)。有关 doctrine 扩展的更多信息,请参阅 文档。
现在您需要在您的数据库中创建表
$ php app/console doctrine:schema:update --dump-sql
这将显示用于在数据库中创建表的 SQL 查询。您可以手动运行此查询。
注意。 您还可以执行
php app/console doctrine:schema:update --force
命令,然后 Doctrine 将为您创建所需的表。但我强烈建议您首先执行--dump-sql
,并检查 Doctrine 将执行的 SQL。
使用
如果您使用 SonataAdminBundle,那么您已经有了用于创建新页面的管理工具。否则,您需要编写自己的创建工具,您可以在此处使用预定义的表单。
$form = $this->createForm('lexxpavlov_page');
以下是一个显示页面、控制器类和 twig 模板的示例代码。有三个不同的动作代码版本,它们执行相同的操作 - 从数据库获取页面并在 twig 模板中显示它。选择一个或编写您自己的代码。
控制器
{# src/App/YourBundle/Controller/DefaultController.php #} namespace App\YourBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template; use App\YourBundle\Entity\Page; class DefaultController extends Controller { /** * @Route("/page/{id}.html") * @Template() */ public function pageAction(Page $page) { } // or find by slug: /** * @Route("/page/{slug}") * @Template("AppYourBundle:Default:page.html.twig") */ public function slugAction(Page $page) { } // or find from repository /** * @Route("/page-find/{id}") * @Template("AppYourBundle:Default:page.html.twig") */ public function findAction($id) { $repository = $this->getDoctrine()->getRepository('AppYourBundle:Page'); if (is_numeric($id)) { $page = $repository->find($id); } else { $page = $repository->findOneBySlug($id); } return array('page' => $page); } }
以及模板
{# src/App/YourBundle/Resources/views/Default/page.html.twig #} {% extends '::layout.html.twig'%} {% block meta %} {% if page.metaKeywords is defined %} <meta name="Keywords" content="{{ page.metaKeywords }}"> {% endif %} {% if page.metaDescription is defined %} <meta name="Description" content="{{ page.metaDescription }}"> {% endif %} {% endblock %} {% block body %} <div class="page"> <h1 class="page-title">{{ page.title }}</h1> <div class="page-info">Created at {{ page.createdAt|date('d.m.Y') }} by {{ page.createdBy.username }}</div> <div class="page-content">{{ page.content|raw }}</div> </div> {% endblock %}
注意。 不要忘记在
layout.html.twig
的<head>
部分添加一个meta
块。
控制器将使用以下 URL 显示 id=1 且 slug=test 的页面
- /page/1.html
- /page/test
- /page-find/1
- /page-find/test
高级配置
完整配置
lexxpavlov_page: entity_class: App\SiteBundle\Entity\Page admin_class: Lexxpavlov\PageBundle\Admin\PageAdmin # or false to disable registering of sonata admin service content_type: ckeditor # use your form type for content field, e.g. textarea or ckeditor
ckeditor
表单类型由 IvoryCKEditorBundle 添加。
激活 slug 字段的自动生成
LexxpavlovPageBundle 将 slug
字段标记为 @Gedmo\Slug
。您需要在 StofDoctrineExtensionsBundle 配置中激活其监听器
stof_doctrine_extensions: # ... orm: default: sluggable: true # ...
StofDoctrineExtensionsBundle 提供了一个从任何本地字符串构建拉丁字符串(urlizer)的工具。Urlizer 接收任何 UTF-8 字符串,将其转换为url化形式,并保存到 slug 字段。要在创建或更新页面时自动填充,您必须在创建或更新时将 slug 字段留空。如果 slug 字段不为空,则 Sluggable 不会工作。
遗憾的是,这个自动工具产生的结果并不完美,您可能需要为您自己的语言编写自己的 urlizer 并设置 Sluggable 扩展以使用该 urlizer。您可以查看 扩展文档 以及本捆绑包中的 监听器代码。
此捆绑包提供了针对俄语的示例 urlizer。
stof_doctrine_extensions: class: sluggable: Lexxpavlov\PageBundle\Listener\RuSluggableListener # ...
附加自动更新用户字段
您可以将 createdBy
和 updatedBy
字段添加到您的实体中,并使用 Blameable doctrine 扩展。对您的页面实体类进行以下更改
<?php namespace App\YourBundle\Entity; use Doctrine\ORM\Mapping as ORM; use Gedmo\Mapping\Annotation as Gedmo; use Lexxpavlov\PageBundle\Entity\Page as BasePage; use App\YourBundle\Entity\User; /** * @ORM\Entity() */ class Page extends BasePage { /** * @var User * * @Gedmo\Blameable(on="create") * @ORM\ManyToOne(targetEntity="User") * @ORM\JoinColumn(name="created_by", referencedColumnName="id") */ protected $createdBy; /** * @var User * * @Gedmo\Blameable(on="update") * @ORM\ManyToOne(targetEntity="User") * @ORM\JoinColumn(name="updated_by", referencedColumnName="id") */ protected $updatedBy; /** * Set user, that updated entity * * @param User $updatedBy * @return Page */ public function setUpdatedBy($updatedBy) { $this->updatedBy = $updatedBy; return $this; } /** * Get user, that updated entity * * @return User */ public function getUpdatedBy() { return $this->updatedBy; } /** * Set user, that created entity * * @param User $createdBy * @return Page */ public function setCreatedBy($createdBy) { $this->createdby = $createdBy; return $this; } /** * Get user, that created entity * * @return User */ public function getCreatedBy() { return $this->createdBy; } }
并在 StofDoctrineExtensionsBundle 配置中激活 Blameable 扩展
stof_doctrine_extensions: # ... orm: default: blameable: true # ...