0

考虑这段代码:

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

除了手动编写表单模板外,我还能如何更改它。

4

3 回答 3

4

今天与表单元素排序有同样的问题。

最终得到了一个 trait,它将覆盖 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.',
    ];
}
于 2014-07-08T13:30:29.957 回答
2

您可以使用https://github.com/egeloen/ivory-ordered-form/捆绑包。也许有一天它会被集成到核心中。目前,symfony Form 组件没有任何排序选项。

于 2014-06-30T07:17:18.153 回答
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}}

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

于 2014-06-30T10:11:21.470 回答