昨天晚上在做项目是又遇到了多层产品分类的下拉菜单设计。估计大家也是经常遇到的需要做的功能,暂时我用最简单的数据结构来讲解我用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设计的封装,代码减少了,语义也清晰了,代码也更加好维护了^_^
顺便说一句,本文是我的第一篇博文,以后项目中有新的设计和技巧,我都会尽量抽时间写出来与大家分享~,也希望各位多多指点
本文链接
下载PHPExcel:http://phpexcel.codeplex.com
这是个强大的Excel库,这里只演示导出Excel文件的功能,其中的大部分功能可能都用不着。
2. 安装PHPExcel到Codeigniter1) 解压压缩包里的Classes文件夹中的内容到application\libraries\目录下,目录结构如下:
-- application\libraries\PHPExcel.php
-- application\libraries\PHPExcel (文件夹)
2)修改application\libraries\PHPExcel\IOFactory.php 文件
-- 将其类名从PHPExcel_IOFactory改为IOFactory,遵从CI类命名规则。
-- 将其构造函数改为public
3. 安装完毕,写一个导出excel的控制器(Controller)代码如下:
1 <?php 2 3 class Table_export extends CI_Controller { 4 5 function __construct() 6 { 7 parent::__construct(); 8 9 // Here you should add some sort of user validation10 // to prevent strangers from pulling your table data11 }12 13 function index($table_name)14 {15 $query = $this->db->get($table_name);16 17 if(!$query)18 return false;19 20 // Starting the PHPExcel library21 $this->load->library('PHPExcel');22 $this->load->library('PHPExcel/IOFactory');23 24 $objPHPExcel = new PHPExcel();25 $objPHPExcel->getProperties()->setTitle("export")->setDescription("none");26 27 $objPHPExcel->setActiveSheetIndex(0);28 29 // Field names in the first row30 $fields = $query->list_fields();31 $col = 0;32 foreach ($fields as $field)33 {34 $objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow($col, 1, $field);35 $col++;36 }37 38 // Fetching the table data39
作为一个php开发者,竟然犯了一个很低级的错误,昨天帮朋友配置php+mysql,连接数据库的时候犯了如下低级错误:
$dbhost='localhost';$dbusername='root';$dbpass='';$connect=mysql_connect($dbhost,$dbusername,$dbpass);print_r($connect);
我想测试数据库能否连接成功,打印一下连接返回的结果,却显示Resource id #42(其实看到这个就表明数据库连接已经成功了),以为哪里配置错了。
于是继续犯低级错误,这样继续写:
//接上面mysql_select_db('meican');$sql='select * from table';$result=mysql_query($sql);print_r($result);
我是想执行一条sql语句并打印结果集。
结果显示空白一片。
现在用框架用多了,用数据库连接类用多了,这种原始的连接数据库的基本操作都生疏了,看来还是要夯实基础啊。
分析了一下原因。原来PHP还存在一个资源类型。
资源 resource 是一种特殊变量,保存了到外部资源的一个引用。资源是通过专门的函数来建立和使用的。资源类型变量保存有为打开文件、数据库连接、图形画布区域等的特殊句柄。
因此正确的写法是:
$dbhost='localhost';$dbusername='root';$dbpass='';$connect=mysql_connect($dbhost,$dbusername,$dbpass);mysql_select_db('101ban');$sql='select * from tt_liuyan';mysql_query("set names utf8");$result=mysql_query($sql);while($row=mysql_fetch_array($result)){ echo $row['author'].'<br/>'.$row['content'];}
这样就OK了,可以看见从数据库表获取的数据。
其实连接数据库成功没,一条语句就ok了,直接:
$link=mysql_connect($host,$username,$pwd);if($link){ echo 'ok';}else{ echo mysql_error();
本文链接