2012-06-06 28 views
3

我有以下表格:atk4先進的crud?

-- ----------------------------------------------------- 

-- Table `product` 

-- ----------------------------------------------------- 

CREATE TABLE IF NOT EXISTS `product` (
    `id` INT NOT NULL AUTO_INCREMENT , 
    `productName` VARCHAR(255) NULL , 
    `s7location` VARCHAR(255) NULL , 
    PRIMARY KEY (`id`)) 
ENGINE = InnoDB; 


-- ----------------------------------------------------- 

-- Table `pages` 

-- ----------------------------------------------------- 

CREATE TABLE IF NOT EXISTS `pages` (
    `id` INT NOT NULL AUTO_INCREMENT , 
    `productID` INT NULL , 
    `pageName` VARCHAR(255) NOT NULL , 
    `isBlank` TINYINT(1) NULL , 
    `pageOrder` INT(11) NULL , 
    `s7page` INT(11) NULL , 
    PRIMARY KEY (`id`) , 
    INDEX `productID` (`productID` ASC) , 
    CONSTRAINT `productID` 
    FOREIGN KEY (`productID`) 
    REFERENCES `product` (`id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 


-- ----------------------------------------------------- 

-- Table `field` 

-- ----------------------------------------------------- 

CREATE TABLE IF NOT EXISTS `field` (
    `id` INT NOT NULL AUTO_INCREMENT , 
    `pagesID` INT NULL , 
    `fieldName` VARCHAR(255) NOT NULL , 
    `fieldType` VARCHAR(255) NOT NULL , 
    `fieldDefaultValue` VARCHAR(255) NULL , 
    PRIMARY KEY (`id`) , 
    INDEX `id` (`pagesID` ASC) , 
    CONSTRAINT `pagesID` 
    FOREIGN KEY (`pagesID`) 
    REFERENCES `pages` (`id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 

我已經得到了CRUD對「產品」工作表中。

//addproduct.php 
class page_addproduct extends Page { 
    function init(){ 
     parent::init(); 

     $crud=$this->add('CRUD')->setModel('Product'); 

    } 
} 

This Works。但我需要得到它,以便在創建新產品時它基本上允許我在頁面和字段表中添加新行。

例如,表中的產品是具有多個頁面進行渲染的打印產品(如賀卡)。第1頁可能有2個可以自定義的文本字段,第2頁可能有3個文本字段,用於定義文本大小的滑塊和用於選擇顏色的下拉列表,第3頁可能有5個文本字段可以全部自定義。所有三個頁面(以及所有表單元素,本例中爲12)都與1個產品相關聯。

所以當我創建產品時,是否可以添加一個按鈕來爲該產品創建一個頁面,然後在該頁面中,我可以添加一個按鈕來添加一個新的表單元素字段?

我對此還是有點新,所以我的db結構可能並不理想。我會很感激任何建議和反饋!有人可以向我指出一些信息,教程,文檔,想法,建議,以及我如何實現這一點?

回答

2

通常情況下,除非您有現有產品,否則無法添加頁面。我們通常用國家領域來解決這個問題。將此添加到您的產品型號中:

$this->addField('state')->enum(array('active','draft'))->defaultValue('draft'); 

也可以在SQL中創建它。此外,它通常是好來形容的關係,所以添加到您的產品型號是:

$this->hasMany('Page','productID'); 

接下來,您將需要更改行動時,增加了一個新的記錄。你可以通過擴展Crud類輕鬆地做到這一點:

class MyCRUD extends CRUD { 
    function formSubmitSuccess(){ 
     if($_GET['id']) return parent::formSubmitSuccess(); // edit ->save 

     // add ->save handled here 
     $this->js()->univ()->location($this->api->url('./details', 
      array('id'=>$this->form->model->id)))->execute(); 
    } 
} 

並用add('MyCRUD')替換add('CRUD')。接下來,如果您將CRUD放置在「我的頁面」頁面上,則需要創建「我的頁面/詳細信息」。成功保存新產品後,您的新方法會將用戶重定向到此新頁面,並且它也會傳遞產品ID。

在此新頁面,你應該有

$m=$this->add('Model_Product')->load($_GET['id']); // makes sure ID is valid 
$this->api->stickyGET('id'); // configures page to carry id= value along 
$crud=$this->add('CRUD'); 
$crud->setModel($m->ref('Page')); 

這將顯示CRUD在這裏,它會自動編輯特定產品的頁面。你現在唯一想念的是後退按鈕。

if($crud->grid){ 
    if($crud->grid->addButton('Save')->isClicked()){ 
     // AJAX action on button click 

     $m->set('status','active')->save(); // update status of current product 
     $this->js()->univ()->location($this->api->url('..'))->execute(); 
     // redirect back to parent page 
    } 

    // You might want a cancel button too 
    $crud->grid->addButton('Cacel')->js('click') 
     ->univ()->location($this->api->url('..')); 

    // no AJAX, simple javascript action. 
} 

要完美地完成一切,請返回原始頁面並添加條件。您不必創建新的模式,除非你想,可以是這樣的:

// on my page 
$this->add('MyCRUD')->setModel('Product')->addCondition('state','active'); 

這樣,你的主要CRUD將不會顯示那些不完整的記錄。您的數據庫可能會累積可暫時刪除一次的草稿記錄。如果這裏有什麼不起作用,請在Github上發佈您的項目,並與我們的敏捷工具包開發小組共享,但我們中的一些人肯定會爲您實施。

獎勵:

您可能想要如何編輯現有產品頁面?最簡單的辦法是有擴張的主要污物的網格:

$crud=$this->add('MyCRUD'); 
$crud->setModel('Product')->addCondition('state','active'); 
$crud->addColumn('expander','details'); // will expand into page mypage/details and will automatically pass ID. 

該解決方案是不是100%完美,但考慮到Web應用程序這是管理您的數據的好方法的特點和他們對SQL的依賴。

+0

好吧,我經歷了你的文章,我無法得到它的工作。這裏是github鏈接[link](https://github.com/thindery/builder.git)。之後我點擊提交添加產品,該產品被添加到數據庫..但返回此錯誤:沒有爲此對象定義 – thindery

+0

Exception_Logic 方法 其他信息: 通過募集對象:對象Model_Product( sample_project_addproduct_details_model_product) class:Model_Product method:refModel arguments:Array([0] => Pages) – thindery

+0

那就是「ref」那裏,對不起。現在修好。 – romaninsh