问题描述: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:★★★★☆