Symfony 2 - 重新排列表单字段

sni*_*gel 7 symfony-forms symfony symfony-2.1

在我们的Symfony2项目中,我们有一个非常复杂的结构,用于嵌入表单的表单....现在我们需要以特定的顺序带来表单的输出.

这就是问题所在:我们使用form_widget(form),现在我们正在寻找对象中的解决方案(例如通过注释)或formbuilder将特定字段移动到表单的末尾.在symfony 1.4中,它是widget-movefield()函数,我猜...

谢谢...

Raf*_*hms 10

您可以使用此捆绑包重新排序字段:https://github.com/egeloen/IvoryOrderedFormBundle

这允许你做这样的事情:

$builder
->add('g', 'text', array('position' => 'last'))
->add('a', 'text', array('position' => 'first'))
->add('c', 'text')
->add('f', 'text')
->add('e', 'text', array('position' => array('before' => 'f')))
->add('d', 'text', array('position' => array('after' => 'c')))
->add('b', 'text', array('position' => 'first'));
Run Code Online (Sandbox Code Playgroud)

这将是核心,但被拒绝并被捆绑出来.


Pav*_*ton 6

今天和表单元素排序有同样的问题.

结束了将覆盖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);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在类型实现getFieldsOrder方法:

use OrderedTrait;

function getFieldsOrder()
{
    return [
        'first',
        'second',
        'next',
        'etc.',
    ];
}
Run Code Online (Sandbox Code Playgroud)


Jov*_*vic 3

无需“重新排序”字段。您需要做的就是分别为每个字段调用form_label和/或。form_widget例如,假设您使用Twig您可以执行以下操作:

<div>{{ form_label(form.firstName) }}</div>
<div>{{ form_widget(form.firstName) }}</div>

<div>{{ form_label(form.lastName) }}</div>
<div>{{ form_widget(form.lastName) }}</div>
Run Code Online (Sandbox Code Playgroud)