atk4先进的crud?

时间:2012-06-06 17:04:01

标签: mysql crud atk4

我有以下表格:

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

-- 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个产品相关联。

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

我还是有些新手,所以我的数据库结构可能不太理想。我很感激任何建议和反馈!有人可以指点我的一些信息,教程,文档,想法,建议,以及我如何实现这个?

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