首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >atk4高级crud?

atk4高级crud?
EN

Stack Overflow用户
提问于 2012-06-07 01:04:01
回答 1查看 513关注 0票数 3

我有以下表格:

代码语言:javascript
复制
-- -----------------------------------------------------

-- 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”表上工作了。

代码语言:javascript
复制
//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结构可能不是很理想。如果有任何建议和反馈我将不胜感激!谁能告诉我一些信息,教程,文档,想法,建议,关于如何实现这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-09 06:38:45

通常你不能添加页面,除非你有一个现有的产品。我们通常使用状态字段来解决这个问题。将以下内容添加到您的产品模型中:

代码语言:javascript
复制
$this->addField('state')->enum(array('active','draft'))->defaultValue('draft'); 

也可以在SQL中创建它。此外,描述关系通常也很好,因此将此添加到您的产品模型中:

代码语言:javascript
复制
$this->hasMany('Page','productID');

下一步,您需要在添加新记录时更改操作。您可以通过扩展crud类轻松地做到这一点:

代码语言:javascript
复制
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。

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

代码语言:javascript
复制
$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,它将自动编辑该特定产品的页面。你现在唯一错过的就是后退按钮。

代码语言:javascript
复制
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.
}

要很好地完成所有操作,请返回到原始页面并添加一个条件。你不必创建新的模型,除非你想,可以是这样的:

代码语言:javascript
复制
// on my page
$this->add('MyCRUD')->setModel('Product')->addCondition('state','active');

这样,您的主CRUD将不会显示不完整的记录。您的数据库可能会累积一些草稿记录,您可以偶尔删除这些记录。如果这里有什么不起作用,在Github上发布你的项目,并与我们的敏捷工具包开发团队分享,我们中的一些人肯定会为你实现它。

奖励:

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

代码语言:javascript
复制
$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的依赖,这是一种管理数据的好方法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10918786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档