ATK4如何设置自定义格式化程序?

时间:2012-03-27 22:36:23

标签: atk4 php

我正在努力提升下拉字段,我不确定我采取了正确的方法。我有这个模型,字段'type'是一个显示字符串的下拉列表,但存储一个整数。为了格式化输出,我将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时,我看到这个字段填充了数字而不是格式化数据。我曾期望Controller获取传递给display()的值并执行我的格式化程序,而不是使用标准格式化程序。

我在这里遗漏了什么吗?我在源代码中进行了调查,我最好的猜测是在MVCGrid.php第45行中出现问题的地方。对Controller对象上的formatType()的调用不包括字段名作为第三个参数,导致它忽略字段的显示集合的映射并回退到Controller的$ type_correspondence数组。

当然,我现在只与ATK4合作了几个星期,所以我可能只是把事情搞错了。这是实现自定义格式化程序的正确方法吗?

1 个答案:

答案 0 :(得分:0)

ATK 4.1.3存在问题:

实际上有一个问题。你需要修补atk4-addons:

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行,将第三个参数添加到formatType(.....,$ field_name)的调用中;

这应该有用。

替代地

将atk4-addons升级到github中的“master”,它仍在4.1分支上。

演示:http://codepad.agiletoolkit.org/myformat

定义“显示”字段的正确方法是通过数组('grid'=>'myfield');

感谢您注意到这个问题!