27

symfony 1.4 では、フォームのオプションを介して、フォーム クラス定義をパラメータ化することが可能でした。カスタムオプションをカスタムフォームタイプに渡す方法はありますか??? メソッドの options パラメーターを使用しようとしましたがbuildForm、この配列が何であるかよくわかりません。どうやらそれは私が望むものではないようです...ありがとう!

4

6 に答える 6

43

解決策は簡単です。カスタムオプションをTwigテンプレートでも使用できるようにする場合は、メソッドで使用する必要があり、メソッドでメソッドを使用する必要 $builder->setAttribute()buildFormあり $view->set()ますbuildView()

<?php

namespace Acme\DemoBundle\Form\Type;

use Symfony\Component\Form\AbstractType as FormAbstractType;
use Symfony\Component\Form\FormBuilder;
use Symfony\Component\Form\FormView;
use Symfony\Component\Form\FormInterface;

// For Symfony 2.1 and higher:
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

/**
 * ImagePreviewType
 *
 */
class ImagePreviewType extends FormAbstractType
{

    /**
     * {@inheritDoc}
     * For Symfony 2.0
     */
    //public function getDefaultOptions(array $options)
    //{
    //    $options = parent::getDefaultOptions($options);
    //    $options['base_path'] = 'path/to/default/dir/';
    //
    //    return $options;
    //}

    /**
     * {@inheritDoc}
     * For Symfony 2.1 and higher
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'base_path'         => '',
        ));
    }

    /**
     * {@inheritDoc}
     */
    public function buildView(FormView $view, FormInterface $form, array $options)
    {
        // For Symfony 2.0:
        // $view->set('base_path', $form->getAttribute('base_path'));

        // For Symfony 2.1 and higher:
        $view->vars['base_path'] = $options['base_path'];
    }

    /**
     * {@inheritDoc}
     */
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder
            ->setAttribute('base_path', $options['base_path'])
        ;
    }

    /**
     * {@inheritDoc}
     */
    public function getName()
    {
        return 'image_preview';
    }

    public function getParent(array $options)
    {
        // for Symfony 2.0:
        // return 'field';

        // for Symfony 2.1 and higher:
        return 'form';
    }
}

カスタムフォームタイプのテンプレート(ファイル... Acme / DemoBundle / Resources / views / Form / fields.html.twig):

{% block image_preview_widget %}
{% spaceless %}
<img src="{{ base_path ~ value }}" alt=""  {{ block('widget_container_attributes') }} />
{% endspaceless %}
{% endblock %}

app / config/config.ymlでカスタムフォームタイプのテンプレートを登録します

twig:
    debug:            %kernel.debug%
    strict_variables: %kernel.debug%
    form:
        resources:
            - 'AcmeDemoAdminBundle:Form:fields.html.twig'

使用法:ユーザーのプロファイルを編集している間、ユーザーの画像のプレビューを表示します。

// src/Acme/DemoBundle/Form/Type/UserType.php
namespace Acme\DemoBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;

class UserType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder->add('user_profile_image_file_name', new ImagePreviewType(), array(
            'base_path' => 'some/other/dir',
        ));
    }
}

2014-08-18:Symfony2.1以降用に更新

于 2012-07-11T22:44:38.777 に答える
2

私はそのオプションを使用しようとしarrayましたが、成功しませんでした。これは、キーの事前定義された小さなサブセットしか運べないように思われたからです。これは、どう考えても私には受け入れられませんでした...

ただし、フォーム メソッドを介してすべてのオプションを渡し、__construct後で使用するためにクラス プロパティに保存することができます。次に、buildForm次を使用してアクセスできます$this->"propertyName"...

array単一の変数を渡すか、少数の変数のみを渡すかを決定するのはあなた次第です__construct...

これは大まかな例です。

class Foobar{
    private $update = false;

    public function __construct($update = false){
        $this->update = $update;
    }


    public function buildForm(FormBuilder builder, array options){
        if ( $update ){
            // something
        }else{
            // well, this is not an update - do something else
        }
    }
}
于 2012-06-06T21:17:09.993 に答える