簡體   English   中英

doctrine和Symfony 2中的DateTime字段

[英]DateTime fields in doctrine and Symfony 2

我對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.

當我嘗試該array('data_class' => 'dateTime')的建議array('data_class' => 'dateTime')設置但我在緩存的twig模板中得到以下內容:

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多級表單添加的。 任何人都可以對這個問題有什么看法,或者我是如何解決它的? 我應該將實體設置更改為“字符串”嗎?

謝謝。

隱藏文件類型只是一個隱藏的文本字段。

這意味着,為了呈現窗口小部件,它只使用簡單的窗口小部件模板 (請參閱hidden_widget.html include語句):

<input type="<?php echo isset($type) ? $view->escape($type) : 'text' ?>" <?php echo $view['form']->block($form, 'widget_attributes') ?><?php if (!empty($value) || is_numeric($value)): ?> value="<?php echo $view->escape($value) ?>"<?php endif ?> />

你可以看到它只是回顯你傳遞給字段的值(轉義函數不對任何重要的東西)。 有一個問題:您將DateTime類作為值傳遞,而不是字符串。 即使您指定傳遞了DateTime類,它仍然不會更改該值,它只是嘗試將DateTime對象轉換為字符串。 那是不可能的。


這就是目前發生的事情。 現在,讓我們轉到如何解決它。 它嘗試渲染的數據( $value )實際上稱為視圖數據(如您所見, 定義變量的位置 )。 在當前情況下,視圖數據等於Form :: $ viewData屬性(請參閱->getViewData()定義 )。 此屬性先前由->normToView()方法定義 (請參閱$viewData定義 )。

正如您在->normToView()方法中看到的,它運行視圖變換器( 如果可用)

foreach ($this->config->getViewTransformers() as $transformer) {
    $value = $transformer->transform($value);
}

因此,為了將DateTime對象轉換為字符串,我們必須使用View轉換器。 現在,讓我們來看看可用的數據轉換器 我們很幸運,因為有一個DateTimeToStringTransformer

/**
 * Transforms between a date string and a DateTime object
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 * @author Florian Eckerstorfer <florian@eckerstorfer.org>
 */
class DateTimeToStringTransformer extends BaseDateTimeTransformer
{

這正是我們所需要的!

現在,讓我們將此數據轉換器注冊為hidden字段的視圖轉換器:

use Symfony\Component\Form\Extension\Core\DataTransformer\DateTimeToStringTransformer;

// ...

$builder = $this->createFormBuilder($myClass);
$builder->add(
    $builder->create('myDate', 'hidden')
        ->addViewTransformer(new DateTimeToStringTransformer())
);

完成此操作后,應正確生成表單。 因為,表單中的幾乎所有內容都是對稱的,變換器也可以從字符串到日期時間工作,這意味着您的代碼只使用DateTime對象!

對於表單中的操作日期,您必須使用日期 時間日期時間表單類型,因為這些類型具有日期時間視圖轉換器。

因此,在渲染形式中,所有數據都必須是標量類型。

如果要在隱藏字段中使用datetime對象,則必須使用自定義視圖轉換器,因為日期時間對象沒有方法* __ toString *用於將值轉換為字符串,並且您無法反向轉換為datetime對象。

要創建自定義視圖轉換器,您可以在Symfony 2站點中查看文檔。

trasnform - 將datetime對象轉換為字符串值,此值已輸入。 reverseTransform - 從輸入到datetime對象轉換值(字符串類型)。

PS默認情況下,您可以使用Symfony Form包中的DateTimeToStringTransformer

最簡單的解決方案是創建一個日期字段並用css隱藏它

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

您將保留javascript對象日期,並將其作為日期保留在數據庫中

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM