我正在开发一个页面与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'