3

我有以下表格:

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

-- 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');

    }
}

这行得通。但我需要得到它,以便在创建新产品时它基本上允许我将新行添加到页面和字段表中。

例如,表格中的产品是要呈现多个页面的印刷产品(如贺卡)。第 1 页可能有 2 个可以自定义的文本字段,第 2 页可能有 3 个文本字段,一个用于定义文本大小的滑块和一个用于选择颜色的下拉列表,第 3 页可能有五个都可以自定义的文本字段. 所有三个页面(以及所有表单元素,在本示例中为 12 个)都与 1 个产品相关联。

所以当我创建产品时,我可以添加一个按钮来为该产品创建一个页面,然后在页面中我可以添加一个按钮来添加一个新的表单元素字段吗?

我对此还有些陌生,所以我的数据库结构可能并不理想。我很感激任何建议和反馈!有人可以向我指出一些关于如何实现这一点的信息、教程、文档、想法、建议吗?

4

1 回答 1

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('CRUD') 替换为 add('MyCRUD')。接下来,如果您将 CRUD 放置在页面“mypage”上,您将需要创建“mypage/details”。成功保存新产品后,您的新方法会将用户重定向到这个新页面,并且它也会传递 productID。

在这个新页面上,您应该有

$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 上发布您的项目并与我们的 Agile Toolkit 开发小组分享,我们中的一些人肯定会为您实施。

奖金:

您可能想如何编辑现有的产品页面?最简单的方法是在主 crud 的网格中使用扩展器:

$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 的依赖,这是管理数据的好方法。

于 2012-06-08T22:38:44.693 回答