我对 zend-form 或 Doctrine ORM 有疑问,我不确定,问题是我使用 zend-form 并且没问题,但是当我需要更新时出现问题,当我得到旧值时,最后放入 setData 选择疯狂的选择了很多选项。我将把一部分代码放在图片上以显示问题。
<?php
namespace Admin\Entity;
use Doctrine\ORM\Mapping as ORM;
use Zend\Hydrator;
/**
* Categoria
*
* @ORM\Table(name="categoria", uniqueConstraints={@ORM\UniqueConstraint(name="id_UNIQUE", columns={"id"})}, indexes={@ORM\Index(name="fk_categoria_categoria1_idx", columns={"categoria_id"})})
* @ORM\Entity
* @ORM\Entity(repositoryClass="Admin\Repository\CategoriaRepository")
*/
class Categoria
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="nome", type="string", length=60, nullable=false)
*/
private $nome;
/**
* @var string
*
* @ORM\Column(name="slug", type="string", length=60, nullable=false)
*/
private $slug;
/**
* @var Categoria|null
*
* @ORM\ManyToOne(targetEntity="Categoria", inversedBy="children")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="categoria_id", referencedColumnName="id")
* })
*/
private $categoria;
/**
* @var \Doctrine\Common\Collections\Collection
*
* @ORM\OneToMany(targetEntity="Categoria", mappedBy="categoria")
*/
private $children;
/**
* @var bool
*
* @ORM\Column(name="status", type="boolean", nullable=false)
*/
private $status;
/**
* Categoria constructor.
* @param array $options
*/
public function __construct(array $options = [])
{
(new Hydrator\ClassMethods())->hydrate($options,$this);
$this->children = new \Doctrine\Common\Collections\ArrayCollection();
}
public function __toString(): string
{
// TODO: Implement __toString() method.
return $this->nome;
}
/**
* @param array $cond
* @param int $type
* @return array
*/
public function toArray(array $cond = [], $type = 1)
{
$arr = (new Hydrator\ClassMethods())->extract($this);
if (sizeof($cond) > 0)
if ($type == 1) {
foreach ($arr as $k => $v) {
if (!in_array($k, $cond))
unset($arr[$k]);
}
} else {
foreach ($cond as $ust) {
unset($arr[$ust]);
}
}
return $arr;
}
/**
* @return int
*/
public function getId(): int
{
return $this->id;
}
/**
* @param int $id
* @return Categoria
*/
public function setId(int $id): Categoria
{
$this->id = $id;
return $this;
}
/**
* @return string
*/
public function getNome(): string
{
return $this->nome;
}
/**
* @param string $nome
* @return Categoria
*/
public function setNome(string $nome): Categoria
{
$this->nome = $nome;
return $this;
}
/**
* @return string
*/
public function getSlug(): string
{
return $this->slug;
}
/**
* @param string $slug
* @return Categoria
*/
public function setSlug(string $slug): Categoria
{
$this->slug = $slug;
return $this;
}
/**
* @return Categoria
*/
public function getCategoria()
{
return $this->categoria;
}
/**
* @param Categoria $categoria
* @return Categoria
*/
public function setCategoria($categoria)
{
$this->categoria = $categoria;
return $this;
}
/**
* @return \Doctrine\Common\Collections\Collection
*/
public function getChildren():\Doctrine\Common\Collections\Collection
{
return $this->children;
}
/**
* @param Categoria $children
* @return Categoria
*/
public function setChildren($children)
{
$this->children = $children;
return $this;
}
/**
* @return bool
*/
public function isStatus(): bool
{
return $this->status;
}
/**
* @return bool
*/
public function getStatus(): bool
{
return $this->status;
}
/**
* @param bool $status
* @return Categoria
*/
public function setStatus(bool $status): Categoria
{
$this->status = $status;
return $this;
}
}
另一部分是
/**
* @param array $option
* @return \Zend\Http\Response|ViewModel
*/
public function updateAction(array $option = [], array $forceString = [])
{
if(is_string($this->form))
$form = new $this->form($this->em,null, $option);
else
$form = $this->form;
$page = $this->params()->fromRoute('page');
//$form = new $this->form(null, $option);
$request = $this->getRequest();
$repository = $this->em->getRepository($this->entity);
$id = (int)$this->params()->fromRoute('id', 0);
if ($id) {
try {
$entity = $repository->find($id);
} catch (\Exception $e) {
return $this->redirect()->toRoute(
$this->route, ['controller' => $this->controller]
);
}
//$form->bind($entity);
$form->setData($entity->toArray());
$form->get('submit')->setValue('Editar');
}
if ($request->isPost()) {
// AbstractValidator::setDefaultTranslator($this->sm->get('MvcTranslator'));
$form->setData($request->getPost());
if ($form->isValid()) {
$res = $request->getPost()->toArray();
if ($this->service->update($res, $id))
$this->flashmessenger()->addSuccessMessage('Dados atualizados com sucesso!');
else
$this->flashmessenger()->addErrorMessage('Houve um erro ao tentar atualizar o seu registro!');
if (!empty($this->module) && $this->module)
return $this->redirect()->toRoute(
$this->route, ['controller' => $this->controller,'page'=>$page]
);
else
return $this->redirect()->toRoute(
$this->route, ['controller' => $this->controller]
);
}
}
$view = new ViewModel([
'form' => $form,
'id' => $id,
'controller' => $this->controller,
'action' => 'update',
]);
$view->setTemplate($this->template);
return $view;
}
前端
<div class="media">
<div class="d-flex align-self-center">
<h1 class="g-font-weight-300 g-font-size-28 g-color-black mb-0"> Categoria (<?= ($action == "insert" ? "Novo" : "Editar") ?>)</h1>
</div>
</div>
<hr class="d-flex g-brd-gray-light-v7 g-my-30">
<div class="g-brd-around g-brd-gray-light-v7 g-rounded-4 g-pa-15 g-pa-20--md g-mb-30">
<?php
if ($id) {
$acaoRedir = ['action' => $action, 'controller' => $controller, 'id' => $id];
} else {
$acaoRedir = ['action' => $action, 'controller' => $controller];
}
$form->setAttribute('action', $this->url('admin/default', $acaoRedir));
$form->prepare();
?>
<?= $this->form()->openTag($form); ?>
<div class="form-group">
<?php $nome = $form->get('nome'); ?>
<label for="nome"><?= $this->formLabel($nome); ?></label>
<?= $this->formElement($nome); ?>
<?= $this->formElementErrors($nome); ?>
</div>
<div class="form-group ">
<?php $categoria = $form->get('categoria'); ?>
<label for="categoria"><?= $this->formLabel($categoria); ?></label>
<div class="u-select--v3 g-pos-rel g-brd-gray-light-v7 g-rounded-4 mb-0">
<?= $this->formElement($categoria); ?>
<?= $this->formElementErrors($categoria); ?>
<div class="d-flex align-items-center g-absolute-centered--y g-right-0 g-color-gray-light-v6 g-color-lightblue-v9--sibling-opened g-mr-15">
<i class="hs-admin-angle-down"></i>
</div>
</div>
</div>
<div class="form-group">
<?php $status = $form->get('status'); ?>
<label for="status"><?= $this->formLabel($status); ?></label>
<div class="u-select--v3 g-pos-rel g-brd-gray-light-v7 g-rounded-4 mb-0">
<?= $this->formElement($status); ?>
<?= $this->formElementErrors($status); ?>
<div class="d-flex align-items-center g-absolute-centered--y g-right-0 g-color-gray-light-v6 g-color-lightblue-v9--sibling-opened g-mr-15">
<i class="hs-admin-angle-down"></i>
</div>
</div>
</div>
<div class="form-group mb-0">
<?php $security = $form->get('security'); ?>
<?php $submit = $form->get('submit'); ?>
<?php $voltar = $form->get('voltar'); ?>
<?= $this->formElement($security); ?>
<?= $this->formHidden($form->get('id')); ?>
<?= $this->formSubmit($submit); ?>
<?= $this->formButton($voltar); ?>
</div>
<?= $this->form()->closeTag($form); ?>
</div>
表格
<?php
/**
* Created by PhpStorm.
* User: WebMaster
* Date: 13/08/2017
* Time: 15:00
*/
namespace Admin\Form;
use Admin\Entity\Categoria;
use AppBase\Form\Form;
use Doctrine\ORM\EntityManager;
use Zend\Form\Element\Button;
use Zend\Form\Element\Select;
use Zend\Form\Element\Text;
use Zend\Form\Element\Hidden;
use Zend\Form\Element\Csrf;
use \Admin\Filter\CategoriaFilter;
class CategoriaForm extends Form
{
public function __construct(EntityManager $em, $name = 'form-categoria', array $options = [])
{
parent::__construct($em, $name, $options);
$this->setInputFilter(new CategoriaFilter());
$this->setAttribute('method', 'post');
$entityCategoria = $this->em->getRepository(Categoria::class);
$arrCategorias = [
0 => 'Categoria Principal'
];
$arrCategorias+=$entityCategoria->findPairs();
$parent = new Select('categoria');
$parent->setLabel('Categoria parentesco');
$parent->setAttributes([
'id' => 'categoria',
'class' => 'form-control js-select u-select--v3-select u-sibling w-100'
]);
$parent->setAttribute('multiple', false);
$parent->setValueOptions($arrCategorias);
$this->add($parent);
$id = new Hidden('id');
$this->add($id);
$nome = new Text('nome');
$nome->setLabel('Nome');
$nome->setAttributes([
'id' => 'nome',
'class' => 'form-control form-control-md g-brd-gray-light-v7 g-brd-gray-light-v3--focus g-rounded-4 g-px-14 g-py-10'
]);
$this->add($nome);
$status = new Select('status');
$status->setLabel('Status');
$status->setAttributes([
'id' => 'status',
'class' => 'form-control js-select u-select--v3-select u-sibling w-100',
'options' => [
'' => 'Selecione',
1 => 'Ativo',
0 => 'Inativo',
],
]);
$this->add($status);
$csrf = new Csrf("security");
$this->add($csrf);
$this->add([
'name' => 'submit',
'type' => \Zend\Form\Element\Submit::class,
'attributes' => [
'value' => 'Salvar',
'class' => 'btn btn-md u-btn-3d u-btn-primary g-mr-10 g-mb-15'
]
]);
$voltar = new Button('voltar');
$voltar->setLabel('voltar');
$voltar->setAttributes([
'value' => 'voltar',
'class' => 'btn btn-danger btn-md u-btn-3d g-mr-10 g-mb-15',
'onClick'=>'document.location.href=\'/admin/categoria\'',
]);
$this->add($voltar);
}
}