2

このヘルプのおかげで、変数ラベルを含むフォームを作成できます。今、そのようなフォームのコレクションを作成したいのですが、それはできません。

正確に:私は MyField クラスを持っています:

class MyField {
    protected label;
    protected userAnswer;

    public function setLabel($label){...}
    public function getLabel(){...}
    public function setUserAnswer($answer){...}
    public function getUserAnswer(){...}
}

MyFieldType クラスもあります。

class MyFieldType extends AbstractType{
    public function buildForm(FormBuilderInterface $builder, array $options){
        $myField = $options['myField'];
        $builder->add('userAnswer', 'text', array('label' => $myField->getLabel()));
    }

    public function getDefaultOptions(array $options){
        return array('data_class' => '...\MyField',
                        'myField' => null);
    }
}

そして、コントローラーで:

public function MyAction(Request $request){
    ...
    $myField = new MyField();
    ...
    $form = $this->createForme(new MyFieldType(), $myField, array('myField' => $myField));
    ...
}

以上で、フィールドのラベルは $myField->label です。

今、私はいくつかの MyFields を持つフォームを作成したい: 私はクラス MyForm を持っています

class MyForm {
    protected myFields; // array of MyField
    public function setMyFields...
    public function getMyFields...
    public function addAField...
}

そして、フィールド ラベルを $myField->label として使用したいと考えています。では、どうすれば MyFormType を定義できますか?
私は次のようなものを試しました:

class MyFormType extends AbstractType {
    public function buildForm(FormBuilderInterface $builder, array $options){
        $myFields = $options['myFields'];
        $builder->add('myFields', 'collection',
                array('type' => new MyFieldType(),
                    'options' => array('myField' => $myFields[0])));
    }

それは機能します(もちろん、すべてのフィールドに同じラベルが付いていますが、それは望ましくありません)が、各 MyFieldType に独自の MyField を与える方法がわかりません...

何か案が ?

4

2 に答える 2

1

次の 2 つのタイプを作成します。

class MyFormType extends AbstractType {

    public function buildForm(FormBuilderInterface $builder, array $options){

        $builder->add('myFields', 'collection',
                array('type' => new MyFieldType());
    }




class MyFieldType extends AbstractType {
    public function buildForm(FormBuilderInterface $builder, array $options){

        $builder->add('label', 'text');
    }

それが役に立てば幸い

于 2012-11-16T18:59:56.183 に答える
0

私はやりたいことをする方法を見つけました (nass600 の回答と私の返信に感謝します): 新しいタイプのフィールドを作成しました ( http://symfony.com/en/doc/current/cookbook/form/create_custom_field_typeを参照) .html ) このように:

class LabelType extends AbstractType{
    public function setDefaultOptions(OptionsResolverInterface $resolver){
    }

    public function getParent(){
        return 'text';
    }

    public function getName(){
        return 'label';
    }
}

次に、 MyFieldType を変更しました:

class MyFieldType extends AbstractType{
    public function buildForm(FormBuilderInterface $builder, array $options){
        $builder->add('label', new LabelType())
                ->add('userAnswer', 'text');
    }

    public function getDefaultOptions(array $options){
        return array('data_class' => '...\MyField')
    }
}

Symfony クックブックで説明されているように、fields.html.twig も作成しました。

{% block label_widget %}
  {{ value }}
{% endblock %}

そして、今、私の myForm.html.twig で:

...
{% for field in form.myFields %}
{% form_widget(field.label) %}
{% form_widget(field.userAnswer) %}
...

で動作します:

class MyFormType extends AbstractType {
    public function buildForm(FormBuilderInterface $builder, array $options){
        $myFields = $options['myFields'];
        $builder->add('myFields', 'collection',
                array('type' => new MyFieldType()));
    }
...

さよなら

于 2012-11-17T01:52:50.277 に答える