考虑这段代码:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name', 'text')
->add('description', 'textarea')
->add('status', 'choice', array('choices' => array('online' => 'online', 'offline' => 'offline')))
->add('save', 'submit');
}
但是当我渲染这个表格时,我按顺序
description
name
status
除了手工编写表单模板外,我该如何更改呢?
答案 0 :(得分:4)
今天我遇到了与表单元素排序相同的问题。
使用将覆盖finishView方法的特征并重新排序FormView的children属性中的项目:
trait OrderedTrait
{
abstract function getFieldsOrder();
public function finishView(FormView $view, FormInterface $form, array $options)
{
/** @var FormView[] $fields */
$fields = [];
foreach ($this->getFieldsOrder() as $field) {
if ($view->offsetExists($field)) {
$fields[$field] = $view->offsetGet($field);
$view->offsetUnset($field);
}
}
$view->children = $fields + $view->children;
parent::finishView($view, $form, $options);
}
}
然后在类型实现getFieldsOrder方法:
use OrderedTrait;
function getFieldsOrder()
{
return [
'first',
'second',
'next',
'etc.',
];
}
答案 1 :(得分:2)
您可以使用https://github.com/egeloen/ivory-ordered-form/捆绑包。也许有一天它会融入核心。目前,symfony Form组件没有任何订单选项。
答案 2 :(得分:0)
您希望从PHP控制渲染顺序,但实际上,您的PHP不应该知道,也不关心如何呈现信息。渲染的顺序在模板中处理,最好是通过twig处理,因为模板有责任处理这个问题。这是一个简单的过程,并为您提供充分的控制。以下Twig模板应该修复您的订单:
{{form_start(nameOfFormVariablePassedFromController}}
{{form_label(nameOfFormVariablePassedFromController.name)}}
{{form_widget(nameOfFormVariablePassedFromController.name)}}
{{form_label(nameOfFormVariablePassedFromController.description)}}
{{form_widget(nameOfFormVariablePassedFromController.description)}}
{{form_label(nameOfFormVariablePassedFromController.status)}}
{{form_widget(nameOfFormVariablePassedFromController.status)}}
{{form_widget(nameOfFormVariablePassedFromController.save)}}
{{form_end(nameOfFormVariablePassedFromController}}
通过添加额外的参数,可以轻松地将类添加到这些标签和小部件以进行样式设置。如果您需要进一步澄清,我可以提供帮助。