【问题标题】:How to get formatted HTML generated by Symfony如何获取由 Symfony 生成的格式化 HTML
【发布时间】:2016-01-28 14:36:58
【问题描述】:

我使用 Symfony2 生成表单,或者实际上是 Twig,它使用了 Symfony 的功能,所以视图如下所示:

{{ form_start(form) }}
{{ form_widget(form) }}
{{ form_end(form) }}

这会生成没有任何换行符或缩进的 HTML 代码。当我查看 HTML 源代码时,这是不可读的。

有没有办法强制 Symfony/Twig 格式化生成的 HTML?

【问题讨论】:

  • 在firebug或类似的开发工具中查看。
  • 你看到cookbook的食谱了吗?
  • @malcom,谢谢,是的,我知道,但你知道 Firebug/Chrome 显示更正的源代码,所以如果例如缺少结束标签,使用上述工具您不会注意到这一点。但无论如何 +1 :)
  • @Vladimir Kovpak - 谢谢,没关系,虽然我更希望有一个通用的解决方案,而不仅仅是表单。看我自己的答案。但是无论如何+1:)

标签: symfony twig


【解决方案1】:

link 很好地解释了 twig 中的表单自定义。有多种方法可以将 CSS 样式应用于表单元素。例如,如果你有一个带有 name 字段的表单,你可以这样添加一个 css 类:

{# render a widget, but add a "foo" class to it #}
{{ form_widget(form.name, {'attr': {'class': 'foo'}}) }}

或到标签:

{{ form_label(form.name, 'Your Name', {'label_attr': {'class': 'foo'}}) }}

然后您可以使用 css 类根据您的设计呈现表单元素。希望你能明白。答案中提供的docs 和链接在这方面都很有用。

【讨论】:

  • 谢谢,为一篇不错的文章+1(稍后阅读),但我不是指样式或页面呈现的外观,而是 HTML 源代码的外观,我想我是不够清楚。
  • 即使是标记,如果你渲染标签,在你的代码中单独输入字段,比如
    标签,你会得到一个干净、可读的标记。
【解决方案2】:

更新:下面的“解决方案”made me a headache 正是这一行:

$html = mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8');

它将所有非ASCII字符转换为实体,这不是很聪明。 Javascript 的 confirmalert 函数不会将其转换回 UTF-8,它们会按原样显示字符串。


谢谢大家,但我认为我不够清楚:) 我的意思不是通过 css 格式化或通常更改呈现页面的外观,而是更改 HTML source 代码。

不管怎样,有了这两篇文章,我终于做到了我想要的:

How do you format DOM structures in PHP?

http://php-and-symfony.matthiasnoback.nl/2011/10/symfony2-create-a-response-filter-and-set-extra-response-headers/

第 1 步。

所以,首先是响应监听器,在(例如)AppBundle/EventListener/ResponseListener.php 中:

namespace AppBundle\EventListener;

use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\DependencyInjection\ContainerInterface as Container;

class ResponseListener {

    private $container;

    public function __construct(Container $container) {
        $this->container = $container;
    }

    function tidyHtml($html)
    {
        $dom = new \DOMDocument();

        if (libxml_use_internal_errors(true) === true)
        {
            libxml_clear_errors();
        }

        $html = mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8');
        $html = preg_replace(array('~\R~u', '~>[[:space:]]++<~m'), array("\n", '><'), $html);

        if ((empty($html) !== true) && ($dom->loadHTML($html) === true))
        {
            $dom->formatOutput = true;

            if (($html = $dom->saveXML($dom->documentElement, LIBXML_NOEMPTYTAG)) !== false)
            {
                $regex = array
                (
                    '~' . preg_quote('<![CDATA[', '~') . '~' => '',
                    '~' . preg_quote(']]>', '~') . '~' => '',
                    '~></(?:area|base(?:font)?|br|col|command|embed|frame|hr|img|input|keygen|link|meta|param|source|track|wbr)>~' => ' />',
                );

                return '<!DOCTYPE html>' . "\n" . preg_replace(array_keys($regex), $regex, $html);
            }
        }

        return false;
    }   


    public function onKernelResponse(FilterResponseEvent $event) {
        $request = $event->getRequest();
        //only when format == html and environment == dev
        if ($request->getRequestFormat() == 'html' && $this->container->get('kernel')->getEnvironment() == 'dev') {
            $event->getResponse()->setContent($this->tidyHtml($event->getResponse()->getContent()));
        }

    }

}

第 2 步。

在 services.yml 中:

response_listener:
    class: AppBundle\EventListener\ResponseListener
    arguments: ['@service_container']
    tags:
        - { name: kernel.event_listener, event: kernel.response, method : onKernelResponse }

【讨论】:

    猜你喜欢
    • 2023-03-22
    • 1970-01-01
    • 2015-01-06
    • 1970-01-01
    • 1970-01-01
    • 2011-01-27
    • 2013-05-02
    • 2016-03-07
    • 2016-03-05
    相关资源
    最近更新 更多