Symfony - 是否可以使用网络编辑器编辑树枝模板

时间:2016-03-01 05:49:45

标签: php symfony twig

我们有一个建立在Symfony框架之上的网站,我的任务是允许管理员通过管理面板更改电子邮件模板甚至树枝模板,就像在WordPress中一样,您可以转到编辑器并对文件进行更改。

我知道Symfony不是CMS,我想知道是否允许管理员编辑电子邮件模板和其他模板模板。模板未保存在数据库中,位于正常位置NameBundle/Resources/views ,正如我们所知,生产Symfony使用缓存。

在网上搜索时,我遇到了Ace编辑和CodeMirror,但我仍然坚持如何使用Symfony

如果有人能把我推向正确的方向,我将非常感激。

2 个答案:

答案 0 :(得分:7)

我最近也有同样的需求。

我选择将已编辑的内容放在app/Resources/AcmeBundle/views/Include/menu.html.twig文件中,因为我不想将其放入Bundle中。第一次加载此页面时会加载文件src/AcmeBundle/Resources/views/Include/menu.html.twig,其内容将用作可编辑Twig模板的基础。该文件也可以为空。

控制器的功能:

 /**
 * @Route(
 *      "/edit/menu",
 *      name = "page_edit_menu"
 * )
 */
public function editMenuAction(Request $request)
{
    $this->denyAccessUnlessGranted('ROLE_ADMIN', null, 'Access denied.');

    // Output file.
    $filepath = $this->container->getParameter('kernel.root_dir').
        '/Resources/AcmeBundle/views/Include/menu.html.twig';

    // Dummy object used in the form.
    $file = new \ArrayObject();

    // Check that the output file exists.
    if (file_exists($filepath)) {
        // Load the file content.
        $file->content = file_get_contents($filepath);
    } else {
        // The file is missing, load the file located in the Bundle instead.
        $file->content = file_get_contents(
            $this->container->get('kernel')->locateResource(
            '@AcmeBundle/Resources/views/Include/menu.html.twig')
        );
    }

    // Declare the form.
    $form = $this->createFormBuilder($file)
        // A textarea for the file content.
        ->add('content', 'textarea', array(
            'attr' => array(
                'rows' => 16,
            )
        ))
        ->add('submit', 'submit', array(
            'label' => 'Save'
        ))
        ->getForm();

    $form->handleRequest($request);

    if ($form->isValid())
    {
        // Save the file in app/Resources/...
        file_put_contents($filepath, $file->content);

        // Clear cache (otherwise the changes won't be applied)
        // Be patient, it can take about 15 seconds.
        $console = 'php '.$this->container->getParameter('kernel.root_dir').
            '/console';

        exec($console.' cache:clear --env=prod');
        exec($console.' cache:warmup --env=prod');

        $this->get('session')->getFlashBag()->add('notice',
            'Content saved succesfully.');

        return $this->redirect($this->generateUrl('page_edit_menu'));
    }

    return $this->render('editMenu.html.twig', array(
        'form' => $form->createView(),
    );
}

Twig文件

关联的Twig文件editMenu.html.twig仅包含以下格式:

{{ form(form) }}

用法

以下是您希望显示先前编辑过的文件的可编辑模板的使用方法:

{% include('AcmeBundle:Include:menu.html.twig') %}

感谢templates overriding,将使用app/Resources/AcmeBundle/views/Include/menu.html.twig文件而不是Bundle中的文件。

GIT中

如果您使用git,则必须在.gitignore文件中添加文件路径:

# File that can be edited from the admin:
/app/Resources/AcmeBundle/views/Include/menu.html.twig

如果没有这个,使用git进行更新可能会改变或删除此文件。

HTML编辑器

如果您需要WYSIWYG编辑器,可以安装提供HTML编辑器的TinymceBundle。如果您已经拥有jQuery,这是一个使用它的快速指南。否则请按照文档进行操作。

composer require "stfalcon/tinymce-bundle:dev-master"

要添加到app/config/config.yml的简单配置:

stfalcon_tinymce:
    selector: ".tinymce"
    language: %locale%
    theme:
        simple:
            theme: "modern"
            plugins: "link"
            toolbar1: "undo redo | bold italic | bullist numlist outdent indent | link"

在您的Javascript中'class' => 'tinymce','rows' => 16,之后添加{{ tinymce_init() }}

答案 1 :(得分:3)

Twig允许您使用Apple documentation,您可以将模板存储为字符串而不是文件。其中一个例子可能正是您所需要的。他们正在使用multiple template loaders

我认为这个功能最近发生了变化,因为我记得曾经有strings as templates。看起来它已被1.15删除。

在您的情况下,您将模板存储在数据库中,然后将其添加到过滤器链中,如下所示:Twig_Loader_String class

Symfony配置还有http://twig.sensiolabs.org/doc/api.html#twig-loader-chain标记用于添加新的加载器。