をここにありますソリューション私は思い付いた。
私のタイプが拡張するクラスを作成しました。
namespace WF\CORE\CoreBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
class WfBaseForm extends AbstractType
{
protected function useFields(FormBuilderInterface $builder, $fields)
{
foreach ($builder->all() as $field) {
if (!in_array($field->getName(), $fields))
$builder->remove($field->getName());
}
}
public function reorder(FormBuilderInterface $builder, $keys = array())
{
$fields = $builder->all();
$ordered_fields = array_merge(array_flip($keys), $fields);
$this->useFields($builder, array());
foreach($ordered_fields as $field)
$builder->add($field);
}
public function getName()
{
return 'base';
}
}
次に、継承したクラスで使用できます。
class AddressType extends WfBaseForm
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
// I add as many fields as I need
$builder->add('…');
}
このクラスを使用すると、テンプレートをレンダリングする前に、あなたは右のあなたのコントローラでそれを行うことができます
class ModifyAddressType extends BaseType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
parent::buildForm($builder, $options);
$builder->add('title', 'text', array('constraints' => array(new NotBlank())));
$this->reorder($builder, array('title', 'firstname', 'lastname'));
}
}
ありがとうございますが、それはできません。私たちは非常に複雑な構造を持ち、form_widget(form)関数が必要なので、バックエンドでこれを行う必要があります! – snirgel
フィールドを 'FormBuilder'インスタンスに希望の順序で追加しようとしましたか? –
それはできません。私たちはディペンデンス、継承などで約80個のオブジェクト型をラウンドしていますので、手作業でそのようなものを操作することはできません.... – snirgel