Расширьте CRUD столбцом из другой модели/массива в ATK4

В atk4 мне нравится расширять CRUD одним столбцом, который представляет собой поиск в массиве доступного столбца в модели. Это нужно для получения названия категории (catshop), для которой catshop_id уже доступен. Но 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);

Теперь в сетке отображаются поля cathop_id и margin_ratio. С помощью catshop_id я хочу найти название категории, доступное в $catshop. Этот массив $catshop фактически получен с другой платформы mysql, поэтому невозможно присоединиться.

Как расширить хлам с помощью столбца catshop? До сих пор я пытался расширить саму модель с помощью 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), хотя я не уверен, как это сделать.

Результат, который я ищу, - это CRUD, который показывает строку catshop, а также позволяет изменить catshop_id с помощью выпадающего списка из массива catshop.


person Bob Siefkes    schedule 08.05.2012    source источник


Ответы (1)


Вам не нужно расширять CRUD, вам нужно расширять Grid, который CRUD активно использует. В качестве альтернативы вы можете расширить загрузку модели.

Вариант 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']);
    }
}
person romaninsh    schedule 10.05.2012
comment
Я изучаю варианты. Вариант 1 решит это как форматирование, а вариант 2 решит уже в модели. Как получить раскрывающийся список в форме части CRUD при добавлении/изменении записи? С hasMany() он автоматически сделает и то, и другое. Здесь часть сетки решена, так что я должен сам добавить addField('dropdown','category') в форму $c-›или подумать о расширении Field_Reference? - person Bob Siefkes; 11.05.2012
comment
Чтобы добавить раскрывающийся список в часть формы CRUD, я использовал $m->getField('catshop_id')->datatype('list')->setValueList($catshop); и он правильно обновляет базу данных. Теперь я попробую предложенный вариант 1, чтобы вывести соответствующую категорию в сетку. - person Bob Siefkes; 14.05.2012