2013-07-10 46 views
0

這是更接近/最佳實踐的問題,不是一個具體的技術問題,所以我來找你的一些指導。ZF2形式 - 插入和更新形成

我的問題圍繞着Zend框架2點的形式,特別是如果我要實現對insetting實體和更新的實體不同的形式。

概述一個簡化的用例。比方說,我在我的數據庫中有一個產品表。每個產品都有一個ID(product_id),它是主鍵和名稱(name)。假設我存儲的產品來自供應商,他們向我提供了一個我想用於數據庫中主鍵的唯一產品ID。

現在,假設我已經實施了一個product_fieldset和一個product_form,兩者都很好地工作。該表格允許我指定產品ID和名稱並將其存儲在數據庫中。但是,當用戶使用表單更新產品名稱而不是插入新產品時,我不希望他們能夠編輯產品ID,因爲這是我的數據庫主鍵。

我目前只能看到如何我可以通過實施2點的形式和2個字段集少一個字段(產品ID)呈現形式在更新場景。

你會如何處理這個問題?當使用服務經理/表單管理員撤回我的表單時,我無法理解我在表格中如何/在哪裏或哪些地方應用邏輯來處理這些情況。

:WQ

回答

1

首先:

比方說,我是來自供應商的存儲產品誰給我提供了一個獨特的產品ID,我想用我的主鍵數據庫。

這是一個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, 
    )); 
    } 
} 

這意味着該模型始終保持一個ID「爲自己」和SKU可以隨時進行更新。更新使用請求中的ID(例如,您的網址爲admin/product/edit/123),並且SKU編號有所不同,並且可以更新。

通過這種方式,形式可以保持相同的更新和創建方法兩者。我通常使用服務層來堅持對象,你應該按照你喜歡的方式去做。

+0

感謝Jurian,並且我同意,主鍵應該保留用於數據庫管理。在這種情況下,我嘗試使用SKU的唯一原因是因爲我的模型(並且有成千上萬個)定期從XML源更新。通過將SKU作爲主鍵,我可以使用MySql的「ON DUPLICATE KEY UPDATE」功能,從SKU爲唯一標識符的數千個項目的源中快速更新數據庫。如果沒有這個,對於每個項目,我首先必須搜索數據庫,看它是否存在,並根據結果做出更新決定。 – familymangreg

+0

您可以使用'INSERT IGNORE'查詢或使用'INSERT [WHERE NOT EXISTS ]',否則。對於第一個(插入中的所有錯誤將被跳過,請注意!)您只需對SKU有一個唯一的限制,然後插入您的Feed中的所有數據。雖然,這是一個不同的話題,並沒有真正涉及到上述ZF2問題。搜索關於這個話題,有很多關於它的問題:) –