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}\nRun 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 );\nRun 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}\nRun Code Online (Sandbox Code Playgroud)\n\n在插入操作中,我只是这样做:
\n\n$usuario->setdatacriacao(new \\DateTime(\'now\'));\nRun Code Online (Sandbox Code Playgroud)\n\n如果我必须设置任何值,那就很简单:
\n\n$usuario->setdatacriacao($usuario->getdatacriacao()->format(\'Y-m-d H:i:s\'));\nRun Code Online (Sandbox Code Playgroud)\n\n编辑:
\n\n当更新记录时,会发生这种情况:
\n\nArray ( [datacriacao] => Array ( [dateStepNotStep] => The input is not a valid step ) )\nRun 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\nValue 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)\nRun Code Online (Sandbox Code Playgroud)\n\n提前致谢
\n我认为 DateTime 元素的默认值为 1 分钟步长,并将其发送到验证器。因此,如果秒数不为零,则会抛出错误。尝试使用 00 秒并检查它是否消失。否则,您需要将步骤选项设置为“任意”。