2013-02-18 8 views
0

Я следующие http://framework.zend.com/manual/2.1/en/modules/zend.form.collections.html и отлично работает с проверкой и так далее.Сохраните данные из формы collection

Когда форма действует руководство просто запускает var_dump на лице, и это выглядит примерно так:

object(Application\Entity\Product)[622] 
    protected 'name' => string 'Chair' (length=5) 
    protected 'price' => string '25' (length=2) 
    protected 'categories' => 
    array (size=2) 
     0 => 
     object(Application\Entity\Category)[615] 
      protected 'name' => string 'Armchair' (length=8) 
     1 => 
     object(App1ication\Entity\Category)[621] 
      protected 'name' => string 'Office' (length=6) 

Категории могут быть более 2 или просто 1. Как сохранить нормальный form в таблицу базы данных, которую я понимаю и не имею проблем. Но здесь мы имеем данные для двух разных таблиц. Думаю, я мог бы вручную прочитать категории в моем контроллере и заполнить их моделью и сохранить их по строкам. Но это не похоже на лучший способ сделать это.

Как получить данные от объекта к модели или моей базе данных? Можно ли это сделать без Доктрины?

ответ

1

У вас есть два варианта: getData() или bind().

bind() - это «автоматический» способ - вы привязываете объект к объекту формы, который имеет свойство для этого объекта, которое соответствует имени вашей коллекции. Затем, когда вызывается метод формы isValid(), механизм привязки передаст значения из элементов коллекции в свойство соответствия объекта.

В качестве альтернативы вы можете использовать getData() на объекте коллекции, а затем делать все, что вам нужно.

Как только у вас есть объект, чтобы его сохранить, подумайте об использовании ZfcBase, так как это тяжелая работа для вас.

Это простой пример картограф:

namespace MyModule\Mapper; 

use ZfcBase\Mapper\AbstractDbMapper; 
use Zend\Stdlib\Hydrator\ArraySerializable; 
use MyModule\Entity\MyEntity; 

class MyMapper extends AbstractDbMapper 
{ 
    protected $tableName = 'my_table'; 

    public function __construct() 
    { 
     $this->setHydrator(new ArraySerializable()); 
     $this->setEntityPrototype(new MyEntity()); 
    } 

    public function save(MyEntity $entity) 
    { 
     if (!$entity->getId()) { 
      $result = $this->insert($entity); 
      $entity->setId($result->getGeneratedValue()); 
     } else { 
      $where = 'id = ' . (int)$entity->getId(); 
      $this->update($entity, $where); 
     } 
    } 

    public function fetchAll($choiceGroupId) 
    { 
     $select = $this->getSelect($this->tableName); 
     return $this->select($select); 
    } 

    public function loadById($id) 
    { 
     $select = $this->getSelect($this->tableName) 
         ->where(array('id' => (int)$id)); 

     return $this->select($select)->current(); 
    }   
} 

Этот преобразователь использует ArraySerializable увлажняющий, поэтому ваш объект сущности (MyEntity в примере) должен реализовать методы getArrayCopy() и populate(). getArrayCopy() возвращает массив данных для сохранения и populate() используется для заполнения объекта из массива данных из базы данных.

+0

Да, получение данных от лица к форме работает очень хорошо, а другим способом. После завершения проверки гид заканчивается на «var_dump ($ product);», там я сижу с сущностью с данными, но я не знаю, как сделать гидратор и картограф. – Rickard

+0

Aha! Обновленный ответ, чтобы включить некоторую информацию о картографах –

+0

Спасибо, что потратили свое время на этот Роб! Я думаю, что до сих пор неясно, в моем вопросе :) Я обновил его сейчас и надеюсь, что более ясно, чего я не понимаю. – Rickard

Смежные вопросы