3

カスタムの DateType クラスを作成したいと思います。これを行うために、クラスSymfony\Component\Form\Extension\Core\Type\DateTypeを src/ ディレクトリにコピーし、クラス名とgetName().

<?php

namespace FooBar\CoreBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
// ...

class MonthType extends AbstractType
{
    // ...

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

    // ...
}

新しいタイプも登録しました:

foobar.form.type.month:
    class: FooBar\CoreBundle\Form\Type\MonthType
    tags:
        - { name: form.type, alias: month }

ただし、新しい型を使用しようとすると、例外 ( Array to string conversion in /var/www/foobar/app/cache/dev/twig/4d/99/945***.php) がスローされます。

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $default = new \DateTime('now');
    $builder
        ->add('season', 'month', array('data' => $default))
    ;
}

注:すべてに変更'month'すると、'date'問題なく動作します。

例外がスローされる理由と、それを取り除く方法を知っている人はいますか?

4

1 に答える 1

1

直し方

ブロックを定義し、month_widgetフォーム フィールド テンプレートとして使用して、sf2 がフィールドを適切にレンダリングするようにする必要があります。

たとえば、.twig に次のように記述します。

{% form_theme form _self %}

{% block month_widget %}
<input type="text" value="{{ value.year }}">
<input type="text" value="{{ value.month }}">
{% endblock %}

好みに合わせてプレゼンテーションをカスタマイズします。

デフォルトのテーマ ファイルSymfony/Bridge/Twig/Resources/views/Form/form_div_layout.html.twigが役立つ場合があります。

詳細については、以下を参照してください。 http://symfony.com/doc/current/cookbook/form/create_custom_field_type.html#creating-a-template-for-the-field

エラーの原因

Symfony2 には という名前のレンダリング ブロックがありませんmonth_widget

MonthTypeあなたが作成したのはの子ですFormType(継承されたgetParent()が「フォーム」を返すため)

month_widgetが見つからなかったため (まだ定義していないため)、次にレンダリングを試みますform_widget

にはform_widget、 のような単純なテキスト フィールドしか<input type="text" value="{{ value }}" ...なく、値がスカラーではないため、ここでは失敗します。

クラスで使用されているため、value実際には DateTime ではなく配列です。DateTimeToArrayTransformer(クラス名の通り、DateTimeを配列に変換)

したがって、エラーはArray to string conversion.

于 2014-02-19T02:35:14.810 に答える