恼人的日期时间问题([dateStepNotStep] =>当更新记录时,输入不是一个有效步骤


Annoying DateTime issue ([dateStepNotStep] => The input is not a valid step ) when updating record

我正在开发一个页面与Zend框架2 +原则在一个灯服务器。我很难解决这个烦人的问题。我有一个实体:

<?php
namespace Application'Entity;
use Doctrine'ORM'Mapping as ORM;
/**
* Usuarios
*
* @ORM'Table(name="usuarios", indexes=    {@ORM'Index(name="fk_usuarios_idTipo_idx", columns={"idTipo"})})
 * @ORM'Entity
 */
class Usuarios
{
/**
 * @var 'DateTime
 *
 * @ORM'Column(name="dataCriacao", type="datetime", nullable=false)
 */
private $datacriacao;
/**
 * Set datacriacao
 *
 * @param 'DateTime $datacriacao
 *
 * @return Usuarios
 */
public function setDatacriacao($datacriacao)
{
    $this->datacriacao = $datacriacao;
    return $this;
}
/**
 * Get datacriacao
 *
 * @return 'DateTime
 */
public function getDatacriacao()
{
    return $this->datacriacao;
}
    public function exchangeArray($data = array())
{
    $this->datacriacao      =       isset($data['datacriacao'])     ?       $data['datacriacao']        :       null;
}

}

它基本上是一个User实体,所以我删除了不必要的代码。

在UsuariosForm:

<?php
namespace Application'Form'Usuarios;
use Doctrine'Common'Persistence'ObjectManager;
use DoctrineModule'Stdlib'Hydrator'DoctrineObject as DoctrineHydrator;
use Zend'Form'Form;
use Zend'Form'Element;
use Zend'InputFilter'InputFilter;
class UsuariosForm extends Form
{
public function __construct(ObjectManager $objectManager)
{
    parent::__construct('Usuarios');
    $this->setAttribute('enctype', 'multipart/form-data');
    $this->setAttribute('method', 'post');
    $this->setHydrator(new DoctrineHydrator($objectManager, 'Application'Entity'Usuarios'));
    $this->add(array(
            'type'      =>      'Zend'Form'Element'DateTime',
            'name'      =>      'datacriacao',
            // 'required'   =>      false,
            'options'   =>      array(
                'label'     =>  'Created At',
                'format'    =>  'Y-m-d H:i:s'
                ),
            'attributes'    =>  array(
                'class'     =>  'form-control input-sm',
                // 'min'    =>  Date('Y-m-d H:i:s'),
                // 'max'    => strtotime('+1 day',  Date('Y-m-d H:i:s')),
                // 'step'       =>      1,
                )
            )
        );

我已经尝试过使用和不使用最小值,最大值和step。插入一个记录工作得很好。这是我更新记录的操作:

<?php 
/**
 * Action to recover access.
 *
 * @access public
 */
public function recoverAccessAction()
{
    $recoverKey = $this->params('id', 0);
    $entityManager = $this->getEntityManager();
    $form = new UsuariosForm($entityManager);
    $form->get('submit')->setAttribute('value', 'Submit');
    $usuariosRepository = $entityManager->getRepository('Application'Entity'Usuarios');
    $usuario = $usuariosRepository->findOneBy(array('senhastatus' => 2, 'resetsenha' => $recoverKey ));
    $validationMessages = array();
    if (isset($usuario))
    {
        if ($this->request->isPost())
        {
            $data = $this->request->getPost();
            try {
                $hydrator = new DoctrineHydrator($entityManager, 'Application'Entity'Usuarios');
                $validationMessages = $this->checkPassword($data['senha'], $data['conferirSenha'], $usuario->getdatanasc()->format('Y-m-d'));
                if (sizeof($validationMessages) == 0)
                {
                    $data = $hydrator->extract($usuario);
                    $data['datanasc'] = $usuario->getdatanasc()->format('Y-m-d');
                    // $data['datacriacao'] = new 'DateTime($usuario->getdatacriacao());
                    $form->setData($data);
                    var_dump($form->isValid());
                    if ($form->isValid())
                    {
                        $stringHelper = new StringHelper();
                        $salt = $stringHelper->generateRandomString();
                        $senha = md5($data['senha'].$usuario->getSalt());
                        $usuario->setSenha($senha);
                        $usuario->setdatacriacao(new 'DateTime($usuario->getdatacriacao()));
                        $entityManager->persist($usuario);
                        $entityManager->flush();
                    }
                    else
                        print_r($form->getMessages());
                }
                else
                {
                        // Exibindo todas as mensagens de erro 'anexadas' aos campos
                    foreach ($validationMessages as $key => $messages) {
                        foreach ($messages as $key => $message) 
                            $form->setMessages(array($messages[0] => array($message) ));
                    }
                    print_r($form->getMessages());
                }
            } catch (Exception $e) {
                // todo @gustavo: implement
            }
        }
    }
    return array('form' => $form, 'usuario' => $usuario);
}

在插入操作中,我只需要这样做:

$usuario->setdatacriacao(new 'DateTime('now'));

如果我必须设置任何值,它会像这样简单:

$usuario->setdatacriacao($usuario->getdatacriacao()->format('Y-m-d H:i:s'));
编辑:

当更新记录时,如下所示:

Array ( [datacriacao] => Array ( [dateStepNotStep] => The input is not a valid step ) )

你可以注意到我在更新时没有对这列做任何事情。它不应该有任何改变:我只想更新一些列,而不是全部!呃呃……这里的主要问题是:为什么这个ZF2不能简单地处理日期时间?如果插入工作正常,为什么更新它给我这个噩梦?

编辑# 2:

实际上,在插入中已经不起作用了。这是怎么回事?

错误:在/home/inhotim/Trabalho/0-OPE/scape/Produção/Web/scape/vendor/zendframework/zend-validator/src/DateStep.php中调用成员函数format()

Value setted:
'datacriacao' => 
    object(DateTime)[500]
      public 'date' => string '2015-08-14 16:18:28' (length=19)
      public 'timezone_type' => int 3
      public 'timezone' => string 'America/Sao_Paulo' (length=17)

Thanks in advance

我认为默认的DateTime元素是1分钟的步骤,它发送给验证器。如果秒不为零,就会抛出错误。用100秒试试,看看它是否消失了。否则你需要将step选项设置为'any'