ZendFramework Реализовать сохранение сущности с помощью Zend Collections

Knayz

Новичок
Народ, может дать совет как реализовать следующий функционал. Есть форма в ней поле название проекта, и блок полей для данных сотрудников: имя сотрудника, начало работы на проекте, конец работы на проекте. Можно добавлять еще несколько блоков сотрудников. Когда форма сабмититься надо чтобы для каждого набора данных о сотруднике в базу падала запись, причем у каждой записи колонка проект была заполнена данными из общего поля проект. Можно ли это реализовать через стандартные функционал гидраторов? Или нужно писать свой?
 

WMix

герр M:)ller
Партнер клуба
да, правильно форму составь с subформами на сущность, остальное будет достаточно легким занятием
 

Knayz

Новичок
У меня такая форма получается: select(название проекта), zend collection на основе zend fieldset в нем поля для сотрудников. Не получается данные из select применить для каждого набора из collection.
 

WMix

герр M:)ller
Партнер клуба
я не понимаю что ты хочешь, приведи к стандарту, который сможешь машинально обработать. а далее написать метод который понимает стандарт и обрабатывает.

по простому так
PHP:
$fieldset->setHydrator(new \Zend\Stdlib\Hydrator\ClassMethods(false))->setObject(new Сущьность())
 
Последнее редактирование:

Knayz

Новичок
В общем не смог я стандартными методами реализовать задуманное, сделал через метод exchangeArray в энтити.
 

Knayz

Новичок
Попробую по лучше описать.
Есть форма http://gyazo.com/5a6a59fac1ed9d95c68b55a7c13b5062
Здесь поля сотрудник, начало работы на проекте и конец работы на проекте - это элемент zend collection.
Если судить по примеру из этой документации https://github.com/doctrine/DoctrineModule/blob/master/docs/hydrator.md
то чтобы гидратор вызывал hydrate для всех переданных наборов zend collection у тебя должно быть 2 сущности со связью OneToMany. У меня же здесь присутствует только одна сущность журнала. И я ума не приложу как сделать чтобы гидратор отрабатывал несколько раз в данном случае.

Код:
<?php

namespace Globuserp\Entity;

use Doctrine\ORM\Mapping as ORM;


/**
* Log
*
* @ORM\Table(name="log", indexes={@ORM\Index(name="id_project", columns={"id_project"}), @ORM\Index(name="id_staff", columns={"id_staff"})})
* @ORM\Entity
*/
class Log
{
    /**
    * @var integer
    *
    * @ORM\Column(name="id", type="integer", nullable=false)
    * @ORM\Id
    * @ORM\GeneratedValue(strategy="IDENTITY")
    */
    private $id;

    /**
    * @var \DateTime
    *
    * @ORM\Column(name="start_time", type="datetime", nullable=false)
    */
    private $startTime;

    /**
    * @var \DateTime
    *
    * @ORM\Column(name="end_time", type="datetime", nullable=false)
    */
    private $endTime;

    /**
    * @var \Globuserp\Entity\Projects
    *
    * @ORM\ManyToOne(targetEntity="Globuserp\Entity\Projects", inversedBy="logEntries")
    * @ORM\JoinColumns({
    *  @ORM\JoinColumn(name="id_project", referencedColumnName="id")
    * })
    */
    private $idProject;

    /**
    * @var \Globuserp\Entity\Staff
    *
    * @ORM\ManyToOne(targetEntity="Globuserp\Entity\Staff")
    * @ORM\JoinColumns({
    *  @ORM\JoinColumn(name="id_staff", referencedColumnName="id")
    * })
    */
    private $idStaff;



    /**
    * Get id
    *
    * @return integer
    */
    public function getId()
    {
        return $this->id;
    }

    /**
    * Set startTime
    *
    * @param \DateTime $startTime
    * @return Log
    */
    public function setStartTime($startTime)
    {
        $this->startTime = $startTime;

        return $this;
    }

    /**
    * Get startTime
    *
    * @return \DateTime
    */
    public function getStartTime()
    {
        return $this->startTime;
    }

    /**
    * Set endTime
    *
    * @param \DateTime $endTime
    * @return Log
    */
    public function setEndTime($endTime)
    {
        $this->endTime = $endTime;

        return $this;
    }

    /**
    * Get endTime
    *
    * @return \DateTime
    */
    public function getEndTime()
    {
        return $this->endTime;
    }

    /**
    * Set idProject
    *
    * @param \Globuserp\Entity\Projects $idProject
    * @return Log
    */
    public function setIdProject(\Globuserp\Entity\Projects $idProject = null)
    {
        $this->idProject = $idProject;

        return $this;
    }

    /**
    * Get idProject
    *
    * @return \Globuserp\Entity\Projects
    */
    public function getIdProject()
    {
        return $this->idProject;
    }

    /**
    * Set idStaff
    *
    * @param \Globuserp\Entity\Staff $idStaff
    * @return Log
    */
    public function setIdStaff(\Globuserp\Entity\Staff $idStaff = null)
    {
        $this->idStaff = $idStaff;

        return $this;
    }

    /**
    * Get idStaff
    *
    * @return \Globuserp\Entity\Staff
    */
    public function getIdStaff()
    {
        return $this->idStaff;
    }


}
Вообщем проблемы две как сделать чтобы гидротор hydrate отрабатывал для каждого набора collection и как записать в $this->idProject для каждого набора collection то что было передано в форме в поле проект. Проект должен быть для всех сотрудников общий.
 

Knayz

Новичок
Т.е. нельзя сделать так чтобы, используя collections записать в одну таблицу бд использую одну cущность?
Из данной формы я пишу в одну таблицу. Использую только одну сущность.
 

WMix

герр M:)ller
Партнер клуба
проекты и сотрудники записаны, нужно только линковку записать в Log, правильно? у меня к тебе 3 новости, это m:n, записывать, как обычную таблицу. а вообще там 3 сущноси
 

Knayz

Новичок
проекты и сотрудники записаны, нужно только линковку записать в Log, правильно?
Да, именно.
Да, согласен.
записывать, как обычную таблицу
Вот в этом и заключается основная проблема.
Как это сделать через collection для каждого пользователя.
а вообще там 3 сущноси
Согласен, но я остальные 2 сущности использую только чтобы прочитать данные, записывать мне нужно только с помощью сущности Log
 

WMix

герр M:)ller
Партнер клуба
а простой foreach не катит? те если бы это делал я, то у меня была бы сущность типа массив записей и сущность запись. в масиве сущностей метод типа прими почту, который обходит циклом строки, передает на гидратор получая обьект и складывает их в массив
 
Последнее редактирование:
Сверху