我有以下表格:
-- -----------------------------------------------------
-- 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在“product”表上工作了。
//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个产品相关联。
因此,当我创建产品时,是否可以添加一个按钮来为该产品创建一个页面,然后在页面中添加一个按钮来添加一个新的表单元素字段?
我还是个新手,所以我的db结构可能不是很理想。如果有任何建议和反馈我将不胜感激!谁能告诉我一些信息,教程,文档,想法,建议,关于如何实现这一点?
发布于 2012-06-09 06:38:45
通常你不能添加页面,除非你有一个现有的产品。我们通常使用状态字段来解决这个问题。将以下内容添加到您的产品模型中:
$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上发布你的项目,并与我们的敏捷工具包开发团队分享,我们中的一些人肯定会为你实现它。
奖励:
您可能想知道应该如何编辑现有的产品页面?最简单的做法是在主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.这个解决方案并不是百分之百理想,但是考虑到WEB应用程序的特点及其对SQL的依赖,这是一种管理数据的好方法。
https://stackoverflow.com/questions/10918786
复制相似问题