【发布时间】:2015-04-29 23:18:52
【问题描述】:
编辑:这个问题指的是 Symfony 2.7,对于 Symfony 2.8+,请参阅下面 Ogi 的回答。
composer.json 中的 require 部分如下所示:
"require": {
"php": ">=5.3.3",
"symfony/symfony": "2.3.*",
"doctrine/orm": "~2.2,>=2.2.3,<2.5",
"doctrine/dbal": "<2.5",
"doctrine/doctrine-bundle": "~1.2",
"twig/extensions": "1.0.*",
"symfony/assetic-bundle": "~2.3",
"symfony/swiftmailer-bundle": "~2.3",
"symfony/monolog-bundle": "~2.4",
"sensio/distribution-bundle": "~2.3",
"sensio/framework-extra-bundle": "~3.0,>=3.0.2",
"sensio/generator-bundle": "~2.3",
"incenteev/composer-parameter-handler": "~2.0",
"braincrafted/bootstrap-bundle": "~2.0",
"twbs/bootstrap": "3.2.*",
"jquery/jquery": "1.11.*",
"stof/doctrine-extensions-bundle": "~1.1@dev"
},
注意:最后四个包是在 Symfony2 标准版之上添加的。
按照Symfony 2 Forms docs 一章,我正在尝试创建一个搜索表单。所以,我创建了一个实体类:
<?php
namespace AppBundle\Entity;
use Symfony\Component\Validator\Constraints as Assert;
class SearchQuery
{
/**
* @Assert\NotBlank()
* @Assert\Type(type="string", message="form.search.query.validation.type")
* @Assert\Length(
* min = 3,
* max = 50,
* minMessage = "form.search.query.validation.min",
* maxMessage = "form.search.query.validation.max"
* )
*/
protected $query;
public function __construct($query = '')
{
$this->setQuery($query);
}
public function getQuery()
{
return $this->query;
}
public function setQuery($query)
{
$this->query = $query;
}
}
还有一个表单类型类:
<?php
namespace AppBundle\Form\Type;
use
Symfony\Component\OptionsResolver\OptionsResolverInterface,
Symfony\Component\Form\AbstractType,
Symfony\Component\Form\FormBuilderInterface
;
class SearchType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('query', 'text', array(
'label' => '',
'attr' => array(
),
))
->add('save', 'submit', array(
'label' => '',
));
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle\Entity\SearchQuery',
'attr' => array(
'id' => 'search-form'
)
));
}
public function getName()
{
return 'search';
}
}
渲染输出:
<form name="search" method="post" action="/app_dev.php/search" id="search-form" role="form">
<input type="search" id="search" name="search" required="required" class="form-control" value="">
<div class="form-group">
<label class="control-label required" for="search_query">Query</label>
<input type="text" id="search_query" name="search[query]" required="required" class="form-control">
</div>
<div class="form-group">
<button type="submit" id="search_save" name="search[save]" class="btn btn-primary">Save</button>
</div>
<input type="hidden" id="search__token" name="search[_token]" class="form-control" value="5f0e9c4a9d4e251fc62e25686cf810eaa0ff4331">
</form>
问题在于 Symfony 2 Forms、BraincraftedBootstrapBundle 和 Twig 之间的某些东西试图巧妙地发挥作用并添加了这个不需要的字段:
<input type="search" id="search" name="search" required="required" class="form-control" value="">
我注意到只有当SearchType::getName() 方法返回'search' 时才会发生这种情况。如果我将其更改为:
class SearchType extends AbstractType
{
[...]
public function getName()
{
return 'search_foo';
}
[...]
}
一切都按预期工作,呈现的输出是:
<form name="search_foo" method="post" action="/app_dev.php/cautare" id="search-form" role="form">
<div id="search_foo">
<div class="form-group">
<label class="control-label required" for="search_foo_query">Query</label>
<input type="text" id="search_foo_query" name="search_foo[query]" required="required" class="form-control">
</div>
<div class="form-group">
<button type="submit" id="search_foo_save" name="search_foo[save]" class="btn btn-primary">Save</button>
</div>
<input type="hidden" id="search_foo__token" name="search_foo[_token]" class="form-control" value="68ee88cb3adef211b993806029ba3fa989322c80">
</div>
</form>
当然,我可以将名称更改为其他名称并继续前进,但这样做就像是在我的头上钉了一颗钉子,却不了解窗帘后面到底发生了什么。
我什至尝试将 field type 设置为 search 而不是 text 希望如果它看到有一个搜索字段会让我一个人呆着,不会试图猜测我的意图是什么,但不,它仍然会打印不需要的字段。
【问题讨论】:
-
我在 Symfony 2.8 和 3.0 上遇到了同样的问题。很奇怪的行为。或许社区里有人会有时间去挖掘它github.com/symfony/symfony/issues/16899
标签: php forms symfony search render