ATK4 Как настроить собственные форматеры? - PullRequest
1 голос
/ 28 марта 2012

Я пытаюсь раскрасить раскрывающееся поле, и я не уверен, что выбрал правильный подход. У меня есть эта модель, для которой поле «тип» должно быть выпадающим, который отображает строку, но хранит целое число. Чтобы отформатировать вывод, я поместил в Grid субклассы как

class Model_Member extends MVCTable {
    function init() {
        parent::init();

        $this->addField('type')
            ->type('list')
            ->display(array('grid'=>'mbrtype'))
            ->caption('Member Type')
            ->listData(array('Guest','Associate','Full'))
            ;
    }
}

Чтобы отформатировать вывод, я подклассифицировал Grid как

class Grid extends Grid_Basic {
    function format_mbrtype($field) {
        $mt=array('Guest','Associate','Full');
        $this->current_row[$field]=$mt[$this->current_row[$field]];
    }
}

Когда я загружаю записи об участниках моего администратора CRUD, я вижу это поле, заполненное числами вместо отформатированных данных. Я ожидал, что контроллер получит значения, переданные в display (), и выполнит мой форматер вместо стандартного.

Я что-то здесь упускаю? Я пролистал источник, и мое лучшее предположение относительно того, где что-то идет не так, находится в MVCGrid.php, строка 45. Вызов formatType () для объекта Controller не включает имя поля в качестве третьего аргумента, который заставляет его игнорировать отображения набора отображения поля и возвращаться к массиву $ type_correspondence контроллера.

Конечно, я работаю с ATK4 только пару недель, так что, возможно, я просто неправильно связал вещи. Это правильный способ реализации пользовательского форматера?

1 Ответ

0 голосов
/ 28 марта 2012

есть проблема в ATK 4.1.3:

На самом деле была проблема. Вам нужно исправить патчи atk4:

diff --git a/mvc/MVCGrid.php b/mvc/MVCGrid.php
index 90bd365..0fb0c0b 100644
--- a/mvc/MVCGrid.php
+++ b/mvc/MVCGrid.php
@@ -42,7 +42,7 @@ class MVCGrid extends Grid{
                $field=$this->getController()->getModel()->getField($field_name);
                if(is_null($field))throw new Exception_InitError("Field '$field_name' is not defined in the ".
                        get_class($this->getController()->getModel())." model");
-               if(is_null($type))$type=$this->getController()->formatType($field->datatype(),'grid');
+               if(is_null($type))$type=$this->getController()->formatType($field->datatype(),'grid',$field_name);
                if($field_name=='locked')return
                        parent::addColumn('locked','locked','');
         if($field_name=='id')$type='text';

Или откройте atk4-addons / mvc / MVCGrid.php и в строке 45 добавьте 3-й аргумент к вызову formatType (....., $ field_name);

и это должно сработать.

1012 * В качестве альтернативы * Обновите atk4-addons до "master" в github, который все еще находится на 4.1 ветке. Демо: http://codepad.agiletoolkit.org/myformat Правильный способ определения поля «display» - через массив ('grid' => 'myfield'); Спасибо, что заметили проблему!

...