【问题标题】:atk4 advanced crud?atk4 高级杂物?
【发布时间】:2012-06-10 17:43:36
【问题描述】:

我有以下表格:

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

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

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

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

【问题讨论】:

    标签: mysql crud atk4


    【解决方案1】:

    除非您有现有产品,否则您通常无法添加页面。我们通常使用状态字段来解决这个问题。将此添加到您的产品模型中:

    $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”。成功保存新产品后,您的新方法会将用户重定向到这个新页面,并且它也会传递产品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 上并与我们的敏捷工具包开发小组分享,我们中的一些人肯定会为您实施。

    奖励:

    您可能想如何编辑现有的产品页面?最简单的方法是在主 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 的依赖,这是管理数据的好方法。

    【讨论】:

    • 好吧,我浏览了你的帖子,但我无法让它工作。这是github链接link。在我单击提交添加产品后,该产品被添加到数据库中。但返回此错误:
    • Exception_Logic 未为此对象定义方法附加信息:由对象引发:对象 Model_Product(sample_project_addproduct_details_model_product) 类:Model_Product 方法:refModel 参数:Array ( [0] => Pages )
    • 那里只是“参考”,抱歉。现已修复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-26
    • 1970-01-01
    • 1970-01-01
    • 2016-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多