使用ATK4中其他模型/数组的列扩展CRUD

时间:2012-05-08 14:42:33

标签: php atk4

在atk4中,我喜欢使用一列扩展CRUD,该列是模型中可用列数组中的查找。这是为了获得catshop_id已经可用的类别名称(catshop)。但是catshop只能作为阵列使用。

模型是:

class Model_CatLink extends Model_Table {
  public $table='catlink';
  function init() {
    parent::init();
    $this->addField('catshop_id');
    $this->addField('margin_ratio');
  }
}  

在我的页面上:

$catshop=array(1=>'cat1',2=>'another cat 2',...,123=>'top cat'); 
$c=$p->add('CRUD');
$m=$this->add('Model_CatLink');
$c->setModel($m);

现在网格显示catshop_id和margin_ratio字段。使用catshop_id我想查找$ catshop中可用的类别标题。这个$ catshop数组实际上是从另一个mysql平台检索的,因此无法加入。

如何使用catshop列扩展crud? 我到目前为止尝试的是使用addExpression扩展模型本身...无法使其正常工作。

我想到这样的事情,首先将其添加到模型中:

$self=$this;
$this->addExpression('catshop')->set(function($select) use ($self){
    return $self->catshop[$self->get('catshop_id')];
});

然后在页面上将$ catshop传递给模型:

$catshop=array(1=>'cat1',2=>'another cat 2',...,123=>'top cat'); 
$c=$p->add('CRUD');
$m=$this->add('Model_CatLink');
$m->catshop=$catshop;
$c->setModel($m);

然后我想在$ c-> setModel($ m)之前将值添加到模型中,虽然我不知道如何继续这个。

我正在寻找的结果是一个显示catshop字符串的CRUD,并允许使用catshop数组中的下拉版本更改catshop_id。

1 个答案:

答案 0 :(得分:0)

您不需要扩展CRUD,您需要扩展CRUD正在使用的Grid。或者,您可以扩展模型加载。

选项1:在网格中:

class MyGrid extends Grid {
    function init(){
        parent::init();
        $this->add('myfield','category');
    }
    funciton format_myfield($field){
        $this->current_row[$field]=
            $this->model->lookupCategory($this->current_row[$field]);

        // use current_row_html[] if you want HTML output
    }
}

然后,当您创建CRUD时,您需要指定:

$c=$this->add('CRUD',array('grid_class'=>'MyGrid'));

选项2:在模型中:

您的替代方案是在模型中的afterLoad:

class Model_CatLink extends Model_Table {
    function init(){
        parent::init();

        $this->addExpression('category')->set('undefined'); // nothing by default

        $this->addHook('afterLoad',$this);
    }
    function afterLoad(){
        $this['category']=$this->lookupCategory($this['category_id']);
    }
}