Symfonyでのフォームに関するベストプラクティスはできるだけ多くのコードを再利用することです(おそらく一般的にはベストプラクティスです)。 エンティティを編集または作成するための一連のアクションを設定しました。両方のアクションで同じフォームクラスと同じ小枝テンプレートが使用されます。今私はそのエンティティの削除フォームを作成する必要があります。symfonyフォームのすべてのフィールドを動的に無効にする方法
エンティティの作成や編集に使用したテンプレートを再利用したいが、今回はすべてのフィールドが無効になる。この方法では、ユーザーはエンティティのコンテンツを表示しますが、フィールドを編集する機能によって混乱することはありません(送信ボタンをクリックすると、すべてが削除され、保存されません)。送信ボタンを含め、私が試した
// AppBundle/Controller/DeleteEntityController.php
// ...
class TermType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('term', TextType::class, array('label' => 'Term'));
$builder->add('definition', TextareaType::class, array('label' => 'Definition'));
$builder->add('visibility_status', ChoiceType::class, array(
'label' => 'Visibility',
'choices' => array(
'Visible' => true,
'Invisible' => false
),
));
$builder->add('page', EntityType::class, array(
'label' => 'Page',
'class' => 'AppBundle:Page',
'query_builder' => function (PageRepository $er) {
return $er->getPageByType('Glossary');
},
'choice_label' => 'title'
));
$builder->add('submit', SubmitType::class, array(
'label' => 'Submit'
));
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => Term::class,
));
}
}
まず最初に、フォームを呼び出すことだったと真($form = $this->createForm(TermType::class, $term, array('disabled' => true));
)として無効に設定されますが、そのオプションはすべてを無効にします。
は今のところ、それはフォームクラスです。 は、だから私は明示的にそれがcreateForm
に渡されたオプションをオーバーライドしているだろうと考え、送信ボタン有効:
// AppBundle/Form/TermType.php
// ...
$builder->add('submit', SubmitType::class, array(
'label' => 'Submit',
'disabled' => false
));
// ...
をしかし、それは動作しませんでした。私が考えることのできる唯一の選択肢は、カスタムオプションを渡して、すべてのフィールドにdisabled
オプションを設定することですが、その値を持つ送信ボタンです。これらの線に沿って何か:
// AppBundle/Controller/DeleteEntityController.php
// ...
$form = $this->createForm(TermType::class, $term, array('is_delete_form' => true));
// ...
と
// AppBundle/Form/TermType.php
// ...
$builder->add('submit', SubmitType::class, array(
'label' => 'Submit',
'disabled' => $options['is_delete_form']
));
// ...
この場合のベストプラクティスは何ですか?テンプレート内のフィールドを無効にするか、フォームクラスから行う必要がありますか?
私は同意します。 FormTypeクラスに送信ボタン(または他のボタン)を表示しないでください。代わりに、あなたがはるかに多くのコントロールを持っているあなたのテンプレートでレンダリングします。 – ehymel
そのページを読んでいないと私は恥ずかしいです。テンプレートの中に送信ボタンを移動させた。コントローラーからテンプレートに送信されるパラメーター "action"は、正しいラベルとクラスを設定します。 現在、これが最適なソリューションです。しかし、私はまだいくつかのフォームフィールドがどのように使用されているかについて少し疑念を感じています。たとえば、私がChoiceTypeを使用するとき、選択肢として表示するかラジオボックスとして表示するかを選択できます。しかし、この選択肢は、フォームクラス内で表現とロジックを少し混ぜています。 – paratassi
こんにちは@paratassi、フォームフィールドやフォームクラスのフォームにいくつかの属性を定義すると、それはまったく問題ありません。ロジックを完全に分離してForm Bundleで表示する方法はほとんどありません。しかし、Form Bundleのアイデアやデザインパターンはかなり古く、開発者は常にそれに固執する必要はないと私は信じています。 Reactのような最新のフロントエンドフレームワークでは、フロントエンド側で同じコードの再利用性と柔軟性を提供しますが、バックエンドでは、Formバインディングと同じことを実現するParams ConverterとValidatorの機能があります。 –