Symfony2:订单表单字段

时间:2014-06-30 07:05:11

标签: php symfony symfony-2.5

考虑这段代码:

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

除了手工编写表单模板外,我该如何更改呢?

3 个答案:

答案 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}}

通过添加额外的参数,可以轻松地将类添加到这些标签和小部件以进行样式设置。如果您需要进一步澄清,我可以提供帮助。