昨天晚上在做项目是又遇到了多层产品分类的下拉菜单设计。估计大家也是经常遇到的需要做的功能,暂时我用最简单的数据结构来讲解我用yii的最新设计吧。
category 如下图:

之前我们一般的做法都是先把数据查询出来,然后根据数据结构先把分类的层级结构处理了,如下
$data = array(); foreach($models as $model){ $data[$model->id] = str_repeat('  ', $this->level).$model->name;
}
然后再把$data放进dropDownList或自己循环显示select的option
下面是我最新的设计代码:
model代码:
* @property integer $id * @property string $name * @property integer $parent_id * @property string $path * @property string $level ... class Category extends CActiveRecord{ ... public function getOptionName(){ return str_repeat('  ', $this->level).$this->name; } ... }
view代码
/* @var $form CActiveForm */ ... $form->dropDownList($model,'parent_id', CHtml::listData(Category::model()->findAll(), 'id', 'optionName'),array('class'=>'span4', 'encode'=>false)); ...
我把只要的代码加粗显示。对了,熟悉yii的朋友都知道这里我们使用CComponent的getter,通过getter,我们把Category的属性字段增加了一个optionName(根据分类的level对name进行缩进处理),增强了model的功能来实现我们这个经常遇到的关于下拉选择的树形数据显示问题。比之前一般用的先循环一次处理数据更加优雅的解决了这个问题。使用oop设计的封装,代码减少了,语义也清晰了,代码也更加好维护了^_^
顺便说一句,本文是我的第一篇博文,以后项目中有新的设计和技巧,我都会尽量抽时间写出来与大家分享~,也希望各位多多指点
浙公网安备 33010602011771号