Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 条令和符号2中的日期时间字段_Php_Mysql_Symfony_Doctrine - Fatal编程技术网

Php 条令和符号2中的日期时间字段

Php 条令和符号2中的日期时间字段,php,mysql,symfony,doctrine,Php,Mysql,Symfony,Doctrine,我对Symfony2还比较陌生,并设置了一个表单,通过doctrine将日期时间数据输入MySQL数据库,但我遇到了以下错误: The form's view data is expected to be of type scalar, array or an instance of \ArrayAccess, but is an instance of class DateTime. You can avoid this error by setting the "data_class" op

我对Symfony2还比较陌生,并设置了一个表单,通过doctrine将日期时间数据输入MySQL数据库,但我遇到了以下错误:

The form's view data is expected to be of type scalar, array or an instance of \ArrayAccess, but is an instance of class DateTime. You can avoid this error by setting the "data_class" option to "DateTime" or by adding a view transformer that transforms an instance of class DateTime to scalar, array or an instance of \ArrayAccess.
当我尝试为字段建议的
数组('data\u class'=>'dateTime')
设置时,我在缓存的细枝模板中得到以下内容:

Catchable Fatal Error: Object of class DateTime could not be converted to string in
我也尝试了一些方法来让它工作,但似乎没有任何效果

在我的实体中,声明如下:

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="my_date", type="datetime", nullable=false)
     * @Assert\Date()
     */
    private $myDate;
作为我表格中的隐藏字段:

$form = $this->createFormBuilder($myClass)
            ->add('myDate', 'hidden')
隐藏它的原因是,这些值是通过javascript多级表单添加的。谁能告诉我这个问题可能是什么,或者我如何着手解决它?是否应将实体设置更改为“字符串”


谢谢。

要在表单中操纵日期,必须使用datetimedatetime表单类型,因为这些类型具有datetime视图

因此,在呈现形式中,所有数据都必须是标量类型

如果您想在隐藏字段中使用datetime对象,则必须使用自定义视图转换器,因为date-time对象没有将值转换为字符串的方法*\uuu-toString*,并且您不能反向转换为datetime对象

对于“创建自定义视图转换器”,可以在中查看文档

trasnform-将datetime对象转换为字符串值,该值已输入。 reverseTransform-将值(字符串类型)从输入转换为datetime对象


另外,默认情况下,您可以使用Symfony表单包。

隐藏的文件类型只是一个隐藏的文本字段

这意味着,为了呈现小部件,它只使用(请参阅中的include语句):

value=”“/>
正如您所看到的,它只是回显了您传递给字段的值(转义函数不适用于任何重要的事情)。问题是:您将
DateTime
类作为值传递,而不是字符串。即使您指定传递了一个
DateTime
类,它仍然没有更改值,只是尝试将
DateTime
对象转换为字符串。 这是不可能的


这就是目前发生的事情。现在,让我们来看看如何修复它。它试图呈现的数据(
$value
)实际上称为视图数据(如您所见)。在当前情况下,视图数据等于表单::$viewData属性(请参见)。此属性以前由
->normToView()方法定义(请参阅)

如中所示,它运行视图转换器(如果可用):

foreach($this->config->getViewTransformers()作为$transformer){
$value=$transformer->transform($value);
}
因此,为了将
DateTime
对象转换为字符串,我们必须使用视图转换器。现在,让我们看看可用的。我们非常幸运,因为有一个:


完成此操作后,应正确生成表单。因为表单中几乎所有内容都是对称的,所以转换器也可以从字符串转换为日期时间,这意味着您的代码只使用
datetime
对象

最简单的解决方案是创建一个日期字段并用css隐藏它

$form = $this->createFormBuilder($myClass)
               ->add('myDate','date',array( 'attr'=>array('style'=>'display:none;')) )

您将保留javascript对象的日期,并将其作为日期保存在数据库中

我已经尝试了许多方法来遵循您链接到的教程和类,但似乎没有任何效果。可能会有一个代码示例吗?回答得很好,它为我解释了一大堆东西。。。当我将数据提交回数据库时,我是否必须将其转换回数据库?我得到一个“此值无效”。当我提交时。。。但无法从哪里找到答案。所有字段看起来都正常,我的所有实体断言上都有自定义消息…@john我刚刚测试了它,我没有收到任何与此代码有关的错误。糟糕的是,是javascript在我的字段中输入日期文本字符串,而没有h:m:s。所有这些都已修复并提交,所以我猜它在添加到数据库之前会被转换回来。好东西@正如您在中所看到的,调用了john yes,这与
->normToView()
:迭代所有视图转换器并执行
->reverseTransform()
use Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeToStringTransformer;

// ...

$builder = $this->createFormBuilder($myClass);
$builder->add(
    $builder->create('myDate', 'hidden')
        ->addViewTransformer(new DateTimeToStringTransformer())
);
$form = $this->createFormBuilder($myClass)
               ->add('myDate','date',array( 'attr'=>array('style'=>'display:none;')) )