0

我对 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);

    }
}
4

0 回答 0