2016-01-28 20 views
0

得到生成的HTML格式我使用Symfony2的產生形式,或實際嫩枝,它使用的Symfony的功能,所以認爲是這樣的:如何通過Symfony的

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

這將生成HTML代碼沒有任何新行或縮進。當我查看HTML源代碼時,這是不可讀的。

有什麼辦法強制Symfony/Twig格式化生成的HTML?

+2

看它在Firebug或類似的開發工具。 – malcolm

+1

您是否看到[食譜](http://symfony.com/doc/current/cookbook/form/form_customization.html)的食譜? –

+0

@malcom,謝謝,是的,我知道,但您確實知道Firebug/Chrome會顯示正確的源代碼,因此,例如,有一個結束標記丟失,你不會注意到使用上述工具。但無論如何+1 :) –

回答

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和鏈接在這方面都很有用。

+0

謝謝,+1爲一篇不錯的文章(稍後閱讀),但我不是指造型或頁面外觀如何呈現,而是HTML源代碼的外觀如何,我認爲我不是'不夠清楚。 –

+0

即使對於標記,如果您呈現標籤,請在您的代碼中單獨輸入字段,並輸入
標籤,即可獲得乾淨可讀的標記。 –

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 } 
相關問題