2012-05-26 40 views
0

前段时间我已经要求类似的东西,但现在我正在采取这一点,所以再次问。形式与头和细节

也许这个问题听起来很简单,但它不适合我。

我有两个表:

header (id,date,field1,field2) // This has One entry on the table 
detail (id,idheader,field1,field2) // This can have multiple entries on the table 

所以首部(1)--->细节(N)

其可以是最好的方法,使一个形式和upate在同一$ F - >更新()这两个表?

想象,这可能是很多东西:发票,预算,等等,等等

非常感谢

回答

0

传统的办法是有“头”网格并添加列扩展,这显示具有“细节”和模型“细节”的网格具有setMasterField(“idheader”,$ _GET [“header_id”]);

例如

class page_test extends Page { 
    function initMainPage(){ 
     $g = $this->add("Grid"); // or CRUD 
     $g->setModel("header"); 
     $g->addColumn("expander", "details"); 
    } 
    function page_details(){ 
     $this->api->stikcyGET("header_id"); 
     $g = $this->add("Grid"); // or CRUD 
     $m = $this->add("Model_detail")->setMasterField("idheader", $_GET["header_id"]); 
     $g->setModel($m); 

    } 
} 

未测试。

1

看起来你的逻辑模型在物理上位于两个表中。首先,确定哪个表是“主要”,它可以是任何方式。我将通过创建以下模型做“头”表主:

class Model_Header extends Model_Table { 
    public $table='header'; 
    function init(){ 
     parent::init(); 

     $this->addField('date')->type('date'); 
     $this->addField('field1'); 
     $this->addField('field2'); 
    } 
} 

接下来你需要与你的第二个表加入并从中添加字段。当您调用$ model-> join()时,它会将“SQL_Relation”对象返回给您,这可用于添加其他字段并创建更多联接。您可以创建新的对象或扩展现有的对象。

class Model_Record extends Model_Table { 
    public $table='header'; 
    function init(){ 
     parent::init(); 

     $this->addField('date')->type('date'); 
     $this->addField('field1'); 
     $this->addField('field2'); 

     $detail = $this->join('detail.idheader'); 
     $detail->addField('body'); 


     $details->addField('body_field1','field1'); 
    } 
} 

因为这两个表定义相同的字段和模型必须有独特的领域,我对detail.field1定义一个新的名字。我也明确指定了用于加入的字段(idheader)。接下来,您可以像使用其他型号一样使用新型号:

$form=$this->add('Form'); 
$form->setModel('Model_Record'); 
$form->onSubmit(function($form){ 
    $form->update()->js()->successMessage('success!')->execute(); 
});