如何获取Symfony生成的格式化HTML

时间:2016-01-28 14:36:58

标签: symfony twig

我正在使用Symfony2来生成表单,或者实际上是使用Symfony函数的Twig,所以视图看起来像这样:

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

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

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

2 个答案:

答案 0 :(得分:1)

这个link精美地解释了树枝中的自定义形式。有许多方法可以将css样式应用于表单元素。例如,如果您的表单包含字段名称,则可以通过以下方式添加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 :(得分:0)

更新:以下"解决方案" made me a headache正是这一行:

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

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

谢谢大家,但我认为我还不够清楚:)我并不是指用css格式化或者通常会改变呈现页面的样子,而是改变HTML 来源代码。

无论如何,通过这两篇文章,我终于设法做了我想要的事情:

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 }