[英]Symfony2: Order form fields
考虑这段代码:
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
除了手动编写表单模板之外,我该如何更改。
今天在表单元素排序方面存在相同的问题。
最后具有将覆盖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.',
];
}
您可以使用https://github.com/egeloen/ivory-ordered-form/包。 也许有一天它将集成到核心中。 目前,symfony表单组件没有任何订购选项。
您希望从您的PHP控制渲染顺序,但是实际上,您的PHP不应了解也不关心信息的渲染方式。 渲染顺序在模板中进行处理,最好通过树枝进行处理,因为处理模板是模板的责任。 这是一个简单的过程,可为您提供足够的控制权。 以下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}}
通过添加额外的参数,很容易将类添加到这些标签和小部件中以进行样式设置。 如果您需要进一步说明,我可以为您提供帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.