我正在使用Symfony2来生成表单,或者实际上是使用Symfony函数的Twig,所以视图看起来像这样:
{{ form_start(form) }}
{{ form_widget(form) }}
{{ form_end(form) }}
这会生成没有任何换行符或缩进的HTML代码。当我查看HTML源代码时,这是不可读的。
有没有办法强制Symfony / Twig格式化生成的HTML?
答案 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的confirm
和alert
函数不会将其转换回UTF-8,它们会按原样显示字符串。
谢谢大家,但我认为我还不够清楚:)我并不是指用css格式化或者通常会改变呈现页面的样子,而是改变HTML 来源代码。
无论如何,通过这两篇文章,我终于设法做了我想要的事情:
How do you format DOM structures in PHP?
第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 }