2013-07-10 2 views
0

Это скорее вопрос подхода/лучшей практики, чем конкретный технический вопрос, поэтому я прихожу к вам за небольшим руководством.Формы ZF2 - вставка и обновление форм

Мой вопрос окружает формы Zend Framework 2, и особенно, если я должен внедрять другую форму для вставки объектов и обновления объектов.

Описать упрощенный вариант использования. Предположим, у меня есть таблица продуктов в моей базе данных. Каждый продукт имеет идентификатор (product_id), который является первичным ключом и именем (name). Скажем, продукты, которые я храню, поступают от поставщика, который предоставляет мне уникальный идентификатор продукта, который я хочу использовать для моего первичного ключа в базе данных.

Теперь предположим, что я реализовал product_fieldset и product_form, оба из которых работают красиво. Форма позволяет мне указать идентификатор продукта и имя и сохранить его в базе данных. Однако, когда пользователь использует форму для обновления имени продукта, вместо того, чтобы вставлять новый продукт, я не хочу, чтобы они могли редактировать идентификатор продукта, поскольку это первичный ключ моей базы данных.

В настоящее время я могу видеть, как я мог бы представить форму в сценарии обновления с одним меньшим полем (идентификатор продукта), реализовав 2 формы и 2 набора полей.

Как вы подходите к этому? При использовании диспетчера служб/менеджера форм, чтобы отменить мои формы, я не могу понять, как/где, или даже если я должен реализовать логику в форме для решения таких ситуаций.

: WQ

ответ

1

Прежде всего:

Скажем продукты я храню приходят от поставщика, которые предоставляют мне с уникальным идентификатором продукта, который я хочу использовать для моего первичного ключа в база данных.

Это номер SKU. Сохраните первичные ключи для управления базой данных. Если есть внешний идентификатор, сохраните его отдельно.

Тогда я бы всегда использовал форму для вставки и обновления. Это становится довольно тривиальным, когда ваш SKU отличается от вашего основного ключа. Пример кода, увидеть эту модель:

<?php 
class Product 
{ 
    protected $id; 
    protected $sku; 
    protected $name; 

    // getters & setters here 
} 

class Form extends \Zend\Form\Form 
{ 
    public function __construct() 
    { 
    $this->add(array(
     'name' => 'sku', 
    )); 

    $this->add(array(
     'name' => 'name', 
    )); 
    } 
} 

class Controller extends \Zend\Mvc\Controller\AbstractActionController 
{ 
    public function createAction() 
    { 
    $form = new Form; 
    $product = new Product; 
    $form->bind($product); 

    if ($this->getRequest()->isPost()) { 
     $data = $this->getRequest()->getPost(); 
     $form->setData($data); 

     if ($form->isValid()) { 
     // get service to update 
     $service->create($product); 

     // redirect to view 
     } 
    } 

    return new ViewModel(array(
     'form' => $form, 
    )); 
    } 

    public function updateAction() 
    { 
    $form = new Form; 
    // Load product based on the ID 
    $form->bind($product); 

    if ($this->getRequest()->isPost()) { 
     $data = $this->getRequest()->getPost(); 
     $form->setData($data); 

     if ($form->isValid()) { 
     // get service to update 
     $service->update($product); 

     // redirect to view 
     } 
    } 

    return new ViewModel(array(
     'form' => $form, 
     'product' => $product, 
    )); 
    } 
} 

Это означает, что модель всегда сохраняет идентификатор «для себя» и SKU может быть обновлен в любое время. Обновление использует идентификатор из запроса (например, у вас есть URL admin/product/edit/123), а номер SKU - по-разному и может быть обновлен.

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

+0

Спасибо, Юриан, и да, я согласен, первичный ключ должен храниться для управления базой данных. Единственная причина, по которой я пытался использовать SKU в этом случае, состоит в том, что мои модели (и их тысячи) регулярно обновляются из фида XML. Имея SKU в качестве первичного ключа, я мог бы использовать функцию MySql 'ON DUPLICATE KEY UPDATE', чтобы очень быстро обновлять базу данных из фида тысяч элементов, где SKU является уникальным идентификатором. Без этого для каждого элемента мне сначала нужно будет найти базу данных, чтобы узнать, существует ли она и принять решение обновить в соответствии с результатом. – familymangreg

+0

Вы можете использовать запрос 'INSERT IGNORE' или использовать' INSERT [...] WHERE NOT EXISTS' в противном случае. Для первого (все ошибки в вставке будут пропущены, помните об этом!) у вас просто есть уникальное ограничение на SKU, а затем вставьте все данные из вашего фида. Хотя, это другая тема и не связана с проблемой ZF2 выше. Поиск по этой теме, есть много вопросов об этом :) –

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