0

文字列またはDateTimeオブジェクトのいずれかを入力として受け入れるカスタムフィールドが必要です。いくつかの議論の後、私はDataTransformersが進むべき道であると判断しました。クックブックの指示に従いましたが、次のエラーが発生します。

キャッチ可能な致命的なエラー:Symfony \ Component \ Form \ FormFactory :: loadTypeExtensions()に渡された引数1は、/ Applications/MAMPで呼び出されたYanic\HomeBundle \ Form \ DataTransformer\DateToStringTransformerのインスタンスであるインターフェースSymfony\Component \ Form\FormTypeInterfaceを実装する必要があります/htdocs/symfony-standard-2.1/vendor/symfony/symfony/src/Symfony/Component/Form/FormFactory.php行320で、/ Applications / MAMP / htdocs / symfony-standard-2.1 / vendor / symfony/symfonyで定義されています/src/Symfony/Component/Form/FormFactory.php行332

FormTypeを期待しているようですが、ドキュメントにはそれは必要ないはずだと書かれています。

これが私が使用しているコードです。

UsersType.php

public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $transformer = new \Yanic\HomeBundle\Form\DataTransformer\DateToStringTransformer();

        $builder
            ->add('username')
            ->add('password','password',
            array(
                'required' => false
            ))
            ->add('email')
            ->addViewTransformer( $transformer )
            ->add('created', 'datetimeToString', array(
                'disabled' => true,
            ))
            ->add('modified', 'datetimeToString', array(
                'disabled' => true,
            ))
            ->add('isActive', null, array(
                'label' => 'Is active?',
                'required' => false
            ))
            ->add('lastLogin', null, array(
                'empty_data' => 'never',
                'widget' => 'single_text',
                'read_only' => true,
                'label' => 'Last login'
            ))
            ->add('modifiedBy', null, array(
                'label' => 'Modified by',
                'read_only' => true
            ))
            ->add('groups')
        ;
    }

DateToStringTransformer.php

namespace Yanic\HomeBundle\Form\DataTransformer;

use Symfony\Component\Form\DataTransformerInterface;
use Symfony\Component\Form\Exception\TransformationFailedException;

class DateToStringTransformer implements DataTransformerInterface
{
    /**
     * Transforms an DateTime object to a string.
     *
     * @param  \DateTime|null $issue
     * @return string
     */
    public function transform($date)
    {
        if (null === $date) {
            return "never";
        }

        return $date->format('d-m-Y H:i');
    }

    /**
     * Transforms a string (date formatted) to an object (\DateTime).
     *
     * @param  string $date
     * @return \DateTime|null
     * @throws TransformationFailedException
     */
    public function reverseTransform($number)
    {
        return $number;
    }
}

services.yml

services:
    form.dataTransformer.datetimeToString:
        class: Yanic\HomeBundle\Form\DataTransformer\DateToStringTransformer
        tags:
            - { name: form.type, alias: datetimeToString }

私は何が間違っているのですか?

ああ、私はSymfony2.1Beta2を使用しています

4

1 に答える 1

0

ドキュメントにはそれについてのヒントがあります:

<?php

use Symfony\Component\Form\FormBuilderInterface;
use Acme\TaskBundle\Form\DataTransformer\IssueToNumberTransformer;

class TaskType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        // ...

        // this assumes that the entity manager was passed in as an option
        $entityManager = $options['em'];
        $transformer = new IssueToNumberTransformer($entityManager);

        // use a normal text field, but transform the text into an issue object
        $builder
            ->add('issue', 'text')
            ->addViewTransformer($transformer)
        ;
    }

    // ...
}

通常のテキストフィールドを使用しますが、テキストを課題オブジェクトに変換します」**

データトランスフォーマーをフォームタイプとしてサービスに登録しました。 symfonyはあなたのデータトランスフォーマーをフォームタイプとして扱います。

フォームタイプを作成してそこにデータトランスフォーマーを配置するか(ドキュメントのように)、サービス定義を削除するか、datetimeToStringの代わりに通常の日付フィールドを使用する必要があります。

しかし、その場合は、最初の方法の方が良いと思います。

于 2012-07-13T12:20:44.757 に答える