问题描述:Ecstore后台的finder添加自定义字段func_column后,如果当前finder进行过字段手动排序的话,则不会显示新添加的自定义字段。
问题原因:代码逻辑问题。
涉及文件:app/base/ego.php,app/base/ego/desktop/ego.php,app/desktop/lib/finder/builder/prototype.php。
具体代码逻辑过程:
先是看下finder的构成中column形成的函数。
function getColumns(){
if(!$this->columns){
$cols = $this->app->getConf('view.'.$this->object_name.'.'.$this->finder_aliasname.'.'.$this->controller->user->user_id);
$cols = $cols ? $cols : $this->finder_cols;
$func_columns = $this->func_columns();
$all_cols = $this->all_columns();
$this->columns = ecos_cactus('desktop','finder_get_columns',$cols, $func_columns, (array)$this->dbschema['default_in_list'], $all_cols);
}
return $this->columns;
}
如果字段有手动排序过,那么这里$cols是直接去数据库里的值,如果没有,则是$this->finder_cols,而文件头部定义了public $finder_cols = ”;
再看ecos_cactus函数,调用了ecos_cactus_desktop_finder_get_columns。
function ecos_cactus(){
$args = func_get_args();
$app_name = $args[0];
unset($args[0]);
$func_name = 'ecos_cactus_'.$app_name.'_'.$args[1];
unset($args[1]);
require_once(ROOT_DIR.'/app/base/ego/'.$app_name.'/ego.php');
$return = call_user_func_array($func_name,$args);
return $return;
}
最后看ecos_cactus_desktop_finder_get_columns怎么处理:
function ecos_cactus_desktop_finder_get_columns($cols , $func_columns , $default_in_list , $all_cols)
{
if($cols){
return explode(',',$cols);
}else{
if($func_columns){
foreach($func_columns as $key=>$func_column){
$col_keys[count($col_keys)] = $key;
}
}
$columns = array_merge((array)$col_keys,(array)$default_in_list);
foreach($all_cols as $key=>$value){
if(in_array($key,$columns)){
$return[count($return)] = $key;
}
}
return $return;
}
}
很明显,这里当$cols不为空时,则直接返回数据库里的数据,所以你再怎么自定义字段也没个鸟用,下面的代码它根本不会执行。
文章评分2次,平均分4.0:★★★★☆
