我正在努力提升下拉字段,我不确定我采取了正确的方法。我有这个模型,字段'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合作了几个星期,所以我可能只是把事情搞错了。这是实现自定义格式化程序的正确方法吗?
答案 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');
感谢您注意到这个问题!