symfony2创建自定义字段类型

时间:2013-05-24 16:32:33

标签: symfony doctrine-orm

您好我正在尝试创建自定义字段 比如here,但在添加到service.yml

之后
services:
    griffin.type.datetime_to_string:
        class: griffin\CoreBundle\Form\DateTimeType
        arguments: ["@doctrine.orm.entity_manager"]
        tags:
            - { name: form.type, alias: datetime_to_string }

我得到Catchable Fatal Error: Argument 1 passed to griffin\CoreBundle\Form\DataTransformer\DateTimeToStringTransformer::__construct() must implement interface Doctrine\Common\Persistence\ObjectManager, null given任何人有这个问题吗?

修改

namespace griffin\CoreBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use griffin\CoreBundle\Form\DataTransformer\DateTimeToStringTransformer;
use Doctrine\Common\Persistence\ObjectManager;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
/**
 * Description of DateTimeType
 *
 * @author skowron-line
 */
class DateTimeType extends AbstractType {

    private $om;

    public function __construnct(ObjectManager $om) {
        $this->om = $om;
    }

    public function buildForm(FormBuilderInterface $builder, array $options) {
        var_dump($this->om);
        $transformer = new DateTimeToStringTransformer($this->om);
        $builder->addModelTransformer($transformer);
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver) {
        $resolver->setDefaults(array(
            'invalid_message' => 'err',
        ));
    }

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

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

并在我的控制器中

$form = $this->createForm(new KlientType(), $klient);

1 个答案:

答案 0 :(得分:1)

如果要将自定义FormType用作服务(因为需要注入服务或参数),必须使用服务名称(或别名)将字段添加到构建器,而不是使用新的CustomFormType()。 / p>

$builder->add('date', 'datetime_to_string', array(
    // ...
))

自2.0以来,Symfony已经提供了字符串转换的DateTime。

查看Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToStringTransformer

您可以将日期字段转换为文本输入,并将“widget”选项设置为“single_text”,并将format选项设置为所需的文本表示。

$builder->add('publishedAt', 'date', array(
    'widget' => 'single_text',
    'format' => 'yyyy-MM-dd',
));

转换为文本输入,此字段可以轻松地与常见的JavaScript Datepickers集成。考虑使用那个而不是你自己的实现。

提示

您不必使用“in yml。

包围注入的服务
services:
    griffin.type.datetime_to_string:
        class: griffin\CoreBundle\Form\DateTimeType
        arguments: [@doctrine.orm.entity_manager]
        tags:
            - { name: form.type, alias: datetime_to_string }

当从网络上的教程复制/粘贴时,这通常会导致错误,其中符号会自动转换为与“真实”问号不同的内容。