我有以下表格:
-- -----------------------------------------------------
-- 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页可以有5个可以自定义的文本字段。所有三个页面(以及所有表单元素,本例中为12个)都与1个产品相关联。
因此,当我创建产品时,我是否可以添加一个按钮来为该产品创建页面,然后在页面中我可以添加一个按钮来添加新的表单元素字段?
我还是有些新手,所以我的数据库结构可能不太理想。我很感激任何建议和反馈!有人可以指点我的一些信息,教程,文档,想法,建议,以及我如何实现这个?
答案 0 :(得分: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放在页面“mypage”上,则需要创建“mypage / details”。成功保存新产品后,您的新方法会将用户重定向到此新页面,它也会传递产品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上发布您的项目并与我们的Agile Toolkit开发小组共享,我们中的一些人肯定会为您实现这一点。
奖金:
您可能想要如何编辑现有产品页面?最容易的是在主要网格中有扩展器:
$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的依赖,这是管理数据的好方法。