2

Symfony2 の FormBuilder コンポーネントを使用して、サービス クラス内で動的フォームを構築したいと考えています。ただし、これらのフォームはすぐにエンティティにリンクされるわけではありません (そのため、フォーム クラス サービス タイプは適用されないと思います)。

ユーザーに一連の質問をする必要があり、質問への回答に応じて無数の結果が得られます (例: チーズケーキは好きですか? はいの場合、ユーザーはチーズケーキの種類を尋ねる別のフォームに誘導されます。いいえ、アイスクリームが好きかどうか尋ねてください..など) これを行うために、FormFactory サービスでインスタンス化される Dialguer サービスを作成しました。services.yml から:

dialoguer:
    class: My\MainBundle\Services\Dialoguer    
    arguments: ['@forms.factory']

ダイアログ プロセスの各ステップは、異なるダイアログ クラスによって処理されます。これらはすべて、AbstractDialogue クラスの子クラスです。ダイアログ サービスは、既に回答されたデータを見て、次に尋ねる適切なダイアログを見つけます。

ダイアログ サービスは、@forms.factory サービスを適切なダイアログ クラスに渡します。この場合は Start:

namespace My\MainBundle\Services\Dialoguer\Individual;

use My\MainBundle\Services\Dialoguer\AbstractDialogue as AbstractDialogue;

class Start extends AbstractDialogue
{
    static $stem = 'check_registration';    
    protected $fields = array(
        'over_thirtyfive' => array(
        'type' => 'choice',
        'options' => array( 
            'label' => 'Are you over 35?', 
            'choices'=>array('yes'=>'Yes','no'=>'No'), 
            'expanded'=> true, 
            'multiple'=>false 
            )
        )
    );
....

function __construct( $formFactory )
{
    $this->formFactory = $formFactory;
}

親の AbstractDialogue クラスから、get_form メソッドは各フィールドを調べ、上記の仕様に基づいてフォームに追加します。

public function get_form( $form_data = array() )
{       
    $defaults = array_merge( $this->defaults, $form_data );

    $builder = $this->formFactory->create();
    $builder->setData( $defaults );
    foreach( $this->fields as $field => $type_ar )
    {
        $builder = $builder->add( $field, $type_ar['type'], $type_ar['options'] );
    }
    //return $builder->getForm();
    return $builder;
}

そして、最後にコントローラ クラスで:

$dialogue = $this->get('dialoguer')->process($request, 'Individual');
$form = $dialogue->get_form()->getView();
$args = compact('form');
return $this->render("MyMainBundle:Forms:process_app.form.html.twig", $args);

最後に、ここに問題があります: 上記の get_form メソッドは Symfony\Component\Form\Form インスタンスを渡しますが、これには getView メソッドがないため、エラーがスローされます。

この非伝統的なフォーム作成方法を使用してフォーム ビューを取得するには、どうすればよいですか? (それともうまくいかないのでしょうか?)

4

1 に答える 1

1

コントローラーにタイプミスがあり、フォームがビューにアクセスできませんでした。「getView」を「createView」に変更する必要があります。おっと。

サービスにも変更を加え、'$this->formFactory->create()' を '$this->formFactory->createBuilder();' に変更しました。

将来のために、サービス クラスのスクリプトとそれに付随する API について説明します。

public function get_form( $form_data = array() )
{       
$defaults = array_merge( $this->defaults, $form_data );

$builder = $this->formFactory->createBuilder();

元の投稿で述べたように、$this->formFactory は、サービス構成を通じて「@form.factory」をインポートすることにより、クラスで使用できるようになります。createBuilder は Symfony\Component\Form\FormBuilder のインスタンスをインスタンス化します ~ http://api.symfony.com/2.0/Symfony/Component/Form/FormBuilder.html

$builder->setData( $defaults );
foreach( $this->fields as $field => $type_ar )
{
    $builder = $builder->add( $field, $type_ar['type'], $type_ar['options'] );
}
return $builder->getForm();
}

getForm メソッドは Symfony\Component\Form\Form のインスタンスをインスタンス化します ~ http://api.symfony.com/2.0/Symfony/Component/Form/Form.html

そして、私のコントローラーで -

$form = $dialogue->get_form()->createView();

createView メソッドは、Twig でレンダリングできる Symfony\Component\Form\FormView のインスタンスを作成します。

{{ form(form) }} 

できます。

于 2013-10-31T15:37:24.520 に答える