1

嗨,我正在尝试创建像这里一样的自定义字段,但在添加到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);
4

1 回答 1

1

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

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

从 2.0 开始,Symfony 已经提供了 DateTime 到字符串的转换。

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

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

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

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

小费:

您不必在 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 }

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

于 2013-05-24T16:44:30.097 回答