2011-12-26 112 views

回答

1

您可以在模型级别添加相关实体:

https://stackoverflow.com/a/7466839/204819

如果这不是一个选项,您可以随时为您的“编辑”自定义处理程序和“删除”按钮,使用执行操作内部ORM甚至模型级别。

+0

我已经添加了一个使用模型来执行此操作的示例 - 您是否有覆盖编辑和删除按钮所需的代码示例?谢谢 – 2011-12-28 00:05:37

1

您可以使用函数beforeInsert,afterInsert,beforeDelete,afterDelete和beforeUpdate,afterUpdate在数据库中执行额外的处理。例如, 在您的webroot中使用ATK 4.1.3的解压缩安装将创建一个名为agiletoolkit的文件夹,该文件夹在下文中称为ATKHOME。

在带有三个字段(id,tasktype_desc和budget_code)的mysql中创建一个简单的表TASKTYPE,并使用id和budget_code创建另一个表TASKTYPE_BUDGET。

在表中创建两个型号ATKHOME/lib中/型号如下(你可能需要创建示范目录,如果犯规存在的话)

class Model_TaskType extends Model_Table { 
    public $entity_code='tasktype'; 
    public $table_alias='ty'; 

    function defineFields(){ 
      parent::defineFields(); 

      $this->newField('id') 
       ->mandatory(true);; 

      $this->newField('tasktype_desc') 
       ->mandatory(true); 

      $this->newField('budget_code') 
       ->mandatory(true); 
     } 

     public function afterInsert($new_id){ 
     $ttb=$this->add('Model_TaskTypeBudget'); 
     $ttb->set('id',$new_id) 
      ->set('budget_code',$this->get('budget_code')); 
     $ttb->insert(); 
     return $this; 
     } 

     public function beforeUpdate(&$data){ 
     $ttb=$this->add('Model_TaskTypeBudget')->loadData($data['id']); 
     $ttb->set('budget_code', $data['budget_code']); 
     $ttb->update(); 
     return $this; 
     } 

     public function beforeDelete(&$data){ 
     $ttb=$this->add('Model_TaskTypeBudget')->loadData($data['id']); 
     $ttb->delete(); 
     return $this; 
     } 
} 

注意,如果你正使用InnoDB和有外键,你必须按照正确的顺序进行插入和删除,例如如果在ID上有从TaskTypeBudget到TaskType的外键,那么它应该使用beforeDelete和afterInsert来防止违反约束。

class Model_TaskTypeBudget extends Model_Table { 
    public $entity_code='tasktype_budget'; 
    public $table_alias='tyb'; 

    function defineFields(){ 
      parent::defineFields(); 

      $this->newField('id') 
       ->mandatory(true); 

      $this->newField('budget_code') 
        ->mandatory(true); 

    } 
} 

而且在ATKHOME /页页面这样

class page_tasktype extends Page { 

    function init(){ 
     parent::init(); 
     $p=$this; 

     $tt=$this->add('Model_TaskType'); 
     $crud=$p->add('CRUD'); 
     $crud->setModel($tt, array('id','tasktype_desc', 'budget_code')); 

     if($crud->grid) 
      $crud->grid->addPaginator(10); 
     } 
} 

还要注意小心包括开幕<?每个班级线前的PHP标签,但不包括结束? >因为这可能会导致Ajax中的错误。

在ATKHOME/config-default.php中,将mysql连接的用户名和密码从root/root修改为mysql数据库的用户名和密码。

$config['dsn']='mysql://atktest:[email protected]/atktest'; 

和修改ATKHOME/lib目录/ Frontend.php以取消8号线,让所有的页面连接到数据库(你也可以只添加$这个 - >数据库连接();行页面

class Frontend extends ApiFrontend { 
function init(){ 
    parent::init(); 
    $this->dbConnect(); //uncommented 

同样Frontend.php,围绕插入线50以下,以一个按钮添加到默认菜单添加了新的一页。

->addMenuItem('CRUD Test', 'tasktype') 

现在去你的网页浏览器并输入http://localhost/agiletoolkit并在第一页上单击CRUD测试。添加行将导致将行添加到TASKTYPE,并将具有相同ID和budget_code的行添加到TASKTYPE_BUDGET。编辑budget_code将反映在两个表中,删除该行将从两个表中删除它。

如何整洁简单的是,一旦你知道ATk4提供的功能?