lexxpavlov/pagebundle

Symfony2 页面包,包含元数据、预定义表单类型和 Sonata Admin 服务

安装: 753

依赖: 0

建议者: 0

安全: 0

星星: 3

关注者: 2

分支: 0

开放问题: 0

类型:symfony-bundle

1.0.1 2015-05-22 07:49 UTC

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
    # ...

附加自动更新用户字段

您可以将 createdByupdatedBy 字段添加到您的实体中,并使用 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
            # ...