更新记录时出现烦人的日期时间问题([dateStepNotStep] => 输入不是有效步骤)

Gus*_*ves 1 php mysql zend-framework doctrine-orm zend-framework2

我正在 Lamp 服务器中使用 Zend Framework 2 + Doctrine 开发一个页面。我很难解决这个恼人的问题。我有一个实体:

\n\n
<?php\nnamespace Application\\Entity;\nuse Doctrine\\ORM\\Mapping as ORM;\n/**\n* Usuarios\n*\n* @ORM\\Table(name="usuarios", indexes=    {@ORM\\Index(name="fk_usuarios_idTipo_idx", columns={"idTipo"})})\n * @ORM\\Entity\n */\nclass Usuarios\n{\n\n/**\n * @var \\DateTime\n *\n * @ORM\\Column(name="dataCriacao", type="datetime", nullable=false)\n */\nprivate $datacriacao;\n\n/**\n * Set datacriacao\n *\n * @param \\DateTime $datacriacao\n *\n * @return Usuarios\n */\npublic function setDatacriacao($datacriacao)\n{\n    $this->datacriacao = $datacriacao;\n\n    return $this;\n}\n\n/**\n * Get datacriacao\n *\n * @return \\DateTime\n */\npublic function getDatacriacao()\n{\n    return $this->datacriacao;\n}\n\n    public function exchangeArray($data = array())\n{\n    $this->datacriacao      =       isset($data[\'datacriacao\'])     ?       $data[\'datacriacao\']        :       null;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

}

\n\n

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

\n\n

以 Usuarios 形式:

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

我尝试过使用和不使用 min、max 和 step on datacriacao。插入一条记录就可以了。这是我更新记录的操作:

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

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

\n\n
$usuario->setdatacriacao(new \\DateTime(\'now\'));\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果我必须设置任何值,那就很简单:

\n\n
$usuario->setdatacriacao($usuario->getdatacriacao()->format(\'Y-m-d H:i:s\'));\n
Run Code Online (Sandbox Code Playgroud)\n\n

编辑:

\n\n

当更新记录时,会发生这种情况:

\n\n
Array ( [datacriacao] => Array ( [dateStepNotStep] => The input is not a valid step ) )\n
Run Code Online (Sandbox Code Playgroud)\n\n

您可以注意到,更新时我没有对此列执行任何操作。它不应该有任何改变:我只想更新一些列,而不是全部!Sooo...这里的主要问题是:为什么这个 ZF2 不能像以前那样简单地处理日期时间?如果插入工作正常,为什么更新它会给我带来这场噩梦?

\n\n

编辑#2:

\n\n

实际上,插入不再起作用。这东西是怎么回事?

\n\n

错误:\n在 /home/inhotim/Trabalho/0-OPE/scape/Produ\xc3\x83\xc2\xa7\xc3\x83\xc2\xa3o/Web/ 中的非对象上调用成员函数 format() scape/vendor/zendframework/zend-validator/src/DateStep.php 第 220 行

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

提前致谢

\n

Pra*_*eep 5

我认为 DateTime 元素的默认值为 1 分钟步长,并将其发送到验证器。因此,如果秒数不为零,则会抛出错误。尝试使用 00 秒并检查它是否消失。否则,您需要将步骤选项设置为“任意”。