symfony 1.4 では、フォームのオプションを介して、フォーム クラス定義をパラメータ化することが可能でした。カスタムオプションをカスタムフォームタイプに渡す方法はありますか??? メソッドの options パラメーターを使用しようとしましたがbuildForm
、この配列が何であるかよくわかりません。どうやらそれは私が望むものではないようです...ありがとう!
6 に答える
解決策は簡単です。カスタムオプションを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以降用に更新
私はそのオプションを使用しようとし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
}
}
}