Hi,馋猫管理系统

B2B2C商城,社区,数据接口,APP

1.用户管理 系统管理员管理 系统权限管理 网站注册会员管理 会员等级 会员积分 消费记录
2.网站管理 分类管理 文章管理 广告管理 友情链接管理
3.店铺管理 店铺申请管理
4.商品管理 商品品牌管理
5.交易管理 订单管理
6.统计信息 订单统计 商品统计 访客统计
7.社区管理 圈子管理 帖子管理
8.APP 接口管理 APP_KEY APP_SECRET APP已实现查看附近的人 个人中心…
9.系统设置
10.日志管理 系统操作日志 管理员登录日志 会员登录日志 短信发送日志。
11.后台功能完善及APP更多功能开发中。。。
演示地址:
后台:sys.ioutsider.me
API文档及测试:api.ioutsider.me
网站前台准备中…
相关截图:
1

2

3

4

5

6

7

8

Yii 数据分页及排序

在控制器:

class PostController extends Controller
{
    function actionIndex()
    {
        $criteria = new CDbCriteria();
        $count=Post::model()->count($criteria);
        $pages=new CPagination($count);
 
        // elements per page
        $pages->pageSize=5;
        $pages->applyLimit($criteria);
 
        // sorting
        $sort = new CSort('Post');
        $sort->attributes = array('id', 'title',);
        $sort->applyOrder($criteria);
 
        $models = Post::model()->findAll($criteria);
 
        $this->render('index', array(
            'models' => $models,
            'pages' => $pages,
            'sort' => $sort,
        ));
    }
}

在视图文件中:

<p><?php echo $sort->link('id')?></p>
<p><?php echo $sort->link('title')?></p>
<ol>
<?php foreach($models as $model):?>
    <li>
        <h2><?php echo $model->id?> - <?php echo $model->title?></h2>
    </li>
<?php endforeach?>
</ol>
 
<?php $this->widget('CLinkPager', array(
    'pages' => $pages,
))?>

An Easy Solution for Dependent dropDownList Using AJAX

Sometimes new Yii guys face problem to manage dependent dropDownList using AJAX. I am going to discuss an easy solution about this issue.

Example code:

Code in View

<?php                                   
  echo CHtml::dropDownList('region_id','', 
  array(2=>'New England',1=>'Middle Atlantic',3=>'East North Central'),
 
  array(
    'prompt'=>'Select Region',
    'ajax' => array(
    'type'=>'POST', 
    'url'=>Yii::app()->createUrl('YourController/loadcities'), //or $this->createUrl('loadcities') if '$this' extends CController
    'update'=>'#city_name', //or 'success' => 'function(data){...handle the data in the way you want...}',
  'data'=>array('region_id'=>'js:this.value'),
  ))); 
 
 
 
echo CHtml::dropDownList('city_name','', array(), array('prompt'=>'Select City'));
?>

Code in Controller

public function actionLoadcities()
{
   $data=RegionCity::model()->findAll('region_id=:region_id', 
   array(':region_id'=>(int) $_POST['region_id']));
 
   $data=CHtml::listData($data,'id','city_name');
 
   echo "<option value=''>Select City</option>";
   foreach($data as $value=>$city_name)
   echo CHtml::tag('option', array('value'=>$value),CHtml::encode($city_name),true);
}

I think this will help to understand actually how AJAX works in Yii for dependent dropDownList also AJAX working behavior in Yii framework.

在GridView中使用关联模型进行搜索和排序

在GridView中使用关联模型进行搜索和排序

首先我们有两个模型它们直接有关联:

class Author extends CActiveRecord {
...
}
 
class Post extends CActiveRecord {
...
    function relations() {
        return array(
            'author'=&gt;array( self::BELONGS_TO, 'Author', 'id_author' ),
        );
    }
...
}

当以网格形式显示所有 Post 时,我们希望显示作者的名字,并且可以通过作者名字中的关键字过滤 Post。提供这些功能的最好解决方式(在我看来)是:

首先需要在 Post 模型中添加一个新的属性,它用来保存搜索的字符串(即要搜索的作者名).也可以使用外键列来实现同样的效果,但是我不喜欢这么用,在搜索条件中保存搜索的字符串而不是外键 id.你还须在搜索条件中将这个新的属性的规则设置为 safe。

class Post extends CActiveRecord {
  public $author_search;
  ...
  public function rules() {
    return array(
      ...
      array( 'xxx,yyy,author_search', 'safe', 'on'=&gt;'search' ),
    );
  }

现在就可以在搜索条件(标准情况-每个模型都要一个 search 方法)中使用这个属性了。同时,我们需要使用条件的 ‘with’ 属性来指定我们的 Post 是通过哪个关系来获取作者(这种方式只需一次数据库查询而不是延迟加载中的多次查询)。

$criteria = new CDbCriteria;
$criteria-&gt;with = array( 'author' );
...
$criteria-&gt;compare( 'author.username', $this-&gt;author_search, true );
...

当我们修改搜索函数时,我们对返回的 CActiveDataProvider 添加一个新的功能

return new CActiveDataProvider( 'Post', array(
    'criteria'=&gt;$criteria,
    'sort'=&gt;array(
        'attributes'=&gt;array(
            'author_search'=&gt;array(
                'asc'=&gt;'author.username',
                'desc'=&gt;'author.username DESC',
            ),
            '*',
        ),
    ),
));

配置中排序部分的 attributes 允许我们覆盖默认值。当我们按 author_search 字段排序的时候,它将会按照指定的规则排序,最后的 * 表示其他字段按默认排序。通过这种方式我们也可以修改默认属性的排序(例如:用户指定按 last_name 列排序时,应该使用last_name和first_name结合排序).

到现在为止我们已经为我们的网格显示做好了前期准备

$this-&gt;widget('zii.widgets.grid.CGridView', array(
    'dataProvider'=&gt;$model-&gt;search(),
    'filter'=&gt;$model,
    'columns'=&gt;array(
        'title',
        'post_time',
        array( 'name'=&gt;'author_search', 'value'=&gt;'$data-&gt;author-&gt;username' ),
        array(
            'class'=&gt;'CButtonColumn',
        ),
    ),
));

这就是所有,我们使用用户名代替用户ID外键列来排序,并且我们可以使用姓名关键字搜索.

转载自: 在GridView中使用关联模型进行搜索和排序

CActiveDataProvider, CArrayDataProvider, CSqlDataProvider做为gridview挂件的数据提供者的使用经验

首先构造测试数据 创建两个表:

--
-- 表的结构 `tbl_user`
--
 
CREATE TABLE IF NOT EXISTS `tbl_user` (
  `uid` INT(11) NOT NULL AUTO_INCREMENT,
  `username` VARCHAR(20) NOT NULL,
  `password` VARCHAR(70) NOT NULL,
  PRIMARY KEY  (`uid`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
 
--
-- 转存表中的数据 `tbl_user`
--
 
INSERT INTO `tbl_user` (`uid`, `username`, `password`) VALUES
(1, 'syang', 'syang');
 
-- --------------------------------------------------------
 
--
-- 表的结构 `tbl_userinfo`
--
 
CREATE TABLE IF NOT EXISTS `tbl_userinfo` (
  `infoid` INT(11) NOT NULL AUTO_INCREMENT,
  `nickname` VARCHAR(20) NOT NULL,
  `uid` INT(11) NOT NULL,
  PRIMARY KEY  (`infoid`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
 
--
-- 转存表中的数据 `tbl_userinfo`
--
 
INSERT INTO `tbl_userinfo` (`infoid`, `nickname`, `uid`) VALUES
(1, 'Song Yang', 1);

通过gii创建两个模型文件 User.php 和 Userinfo.php
修改User.php,添加关联代码

	public function relations()
	{
		return array(
		    'info'=> array(self::HAS_ONE, 'Userinfo', 'uid')
		);
	}

下面,我们建一个新的控制器,名为TestController.php,代码如下:

<?php
/**
 * Description of TestController
 *
 * @author syang
 */
class TestController extends Controller {
	public function actionIndex() {
 
		//AR数据提供
		$ar_provider = new CActiveDataProvider('User', array(
 
		));
 
		//Sql数据提供
		$sql = "select * from tbl_user, tbl_userinfo where tbl_user.uid=tbl_userinfo.uid";
		$count = User::model()->findBySql($sql)->count();
		$sql_provider = new CSqlDataProvider($sql, array(
		    'keyField'=>'uid',	//必须指定一个作为主键
		    'totalItemCount'=>$count,	//分页必须指定总记录数
		));
 
		//Array数据提供
		$sql = "select * from tbl_user, tbl_userinfo where tbl_user.uid=tbl_userinfo.uid";
		$array_data = Yii::app()->db->createCommand($sql)->queryAll();
		$array_provider = new CArrayDataProvider($array_data, array(
		    'keyField'=>'uid',	//必须指定一个作为主键
		));
 
		$this->render('index', array(
						'ar_provider'=>$ar_provider,
						'sql_provider'=>$sql_provider,
						'array_provider'=>$array_provider
 
					));
	}
}
?>

我们在view下建一个以控制器id命名的目录,如上为test,并在test目录下建立一个index.php的模块文件
代码如下:

<?php
 
echo "AR关联查询,示例:";
 
 $this->widget('zii.widgets.grid.CGridView', array(
 
	'id'=>'ar',
 
	'dataProvider'=>$ar_provider,
 
	'columns'=>array(
 
		'uid',
 
		array('header'=>'用户名', 'name'=>'username'),       //name对应字段名
 
		array('header'=>'密码', 'value'=>'$data->password'),  //用value这样写也可以
 
		'info.infoid',
		array('header'=>'昵称', 'name'=>'info.nickname'),
		//或者这样array('header'=>'昵称', 'value'=>'$data->info->nickname'),
 
		array(
 
			'class'=>'CButtonColumn',
 
		),
 
	),
 
));
 
echo "Sql 查询,示例:";
 
$this->widget('zii.widgets.grid.CGridView', array(
 
	'id'=>'sql',
 
	'dataProvider'=>$sql_provider,
 
	'columns'=>array(
 
		'uid',
 
		array('header'=>'用户名', 'name'=>'username'),
 
		array('header'=>'密码', 'value'=>'$data["password"]'),
 
		'infoid',
 
		array('header'=>'昵称', 'name'=>'nickname'),
 
		array(
 
			'class'=>'CButtonColumn',
 
		    	'viewButtonUrl'=>'Yii::app()->controller->createUrl("view",array("id"=>$data["uid"]))',
 
			'updateButtonUrl'=>'Yii::app()->controller->createUrl("update",array("id"=>$data["uid"]))',
 
			'deleteButtonUrl'=>'Yii::app()->controller->createUrl("delete",array("id"=>$data["uid"]))',
 
		),
 
	),
 
));
 
echo "Array 数据,示例:";
 
$this->widget('zii.widgets.grid.CGridView', array(
 
	'id'=>'array',
 
	'dataProvider'=>$array_provider,
 
	'columns'=>array(
 
		'uid',
 
		array('header'=>'用户名', 'name'=>'username'),
 
		array('header'=>'密码', 'value'=>'$data["password"]'),
 
		'infoid',
 
		array('header'=>'昵称', 'name'=>'nickname'),
 
		array(
 
			'class'=>'CButtonColumn',
 
		    	'viewButtonUrl'=>'Yii::app()->controller->createUrl("view",array("id"=>$data["uid"]))',
 
			'updateButtonUrl'=>'Yii::app()->controller->createUrl("update",array("id"=>$data["uid"]))',
 
			'deleteButtonUrl'=>'Yii::app()->controller->createUrl("delete",array("id"=>$data["uid"]))',
 
		),
 
	),
 
)); ?>

总结:上面的示例演示了,使用CActiveDataProvider, CArrayDataProvider, CSqlDataProvider的例子
最简单的就是使用CActiveDataProvider,其他两个,在使用gridview挂件时,需要稍微修改一下,因为gridview原有button列上的连接使用的是$data->这种对象的方式
由于sql与array返回的数据都是数组,所以后面的地方改成数组就可以了。本例还演示了模型关联时使用CActiveDataProvider与gridview的列子。读者可以反复测试体会Yii的强大功能。

YII CArrayDataProvider 的使用

利用CArrayDataProvider,可以对一个数组里面的数据进行分页
action代码:

public function actionPage(){
            $rawData = array(
                array('id'=>1,'username'=>'aa','password'=>'aaaaaa'),
                array('id'=>2,'username'=>'bb','password'=>'aaaaaa'),
                array('id'=>3,'username'=>'cc','password'=>'aaaaaa'),
                array('id'=>4,'username'=>'dd','password'=>'aaaaaa'),
                array('id'=>5,'username'=>'ee','password'=>'aaaaaa'),
                array('id'=>6,'username'=>'ff','password'=>'aaaaaa'),
                array('id'=>7,'username'=>'gg','password'=>'aaaaaa'),
                array('id'=>8,'username'=>'hh','password'=>'aaaaaa'),
                array('id'=>9,'username'=>'jj','password'=>'aaaaaa'),
                array('id'=>10,'username'=>'qq','password'=>'aaaaaa'),
                array('id'=>11,'username'=>'www','password'=>'aaaaaa'),
                array('id'=>12,'username'=>'xx','password'=>'aaaaaa'),
                array('id'=>13,'username'=>'zz','password'=>'aaaaaa'),
            );
 
            $dataProvider=new CArrayDataProvider($rawData, array(
                'id'=>'user',
                'sort'=>array(
                    'attributes'=>array(
                         'id', 'username', 'password',
                    ),
                ),
                'pagination'=>array(
                    'pageSize'=>10,
                ),
            ));
            $this->render('page',array('dataProvider'=>$dataProvider));
        }

views代码:

 $this->widget('zii.widgets.grid.CGridView', array(
            'id'=>'effectivepolicy-grid',
            'dataProvider'=>$dataProvider,
            'emptyText'=>'没有找到数据.',
            'nullDisplay'=>'-',
            'columns'=>array(
 
                array(
                    'name'=>'用户名',
                    'value'=>'$data["username"]',
                    'htmlOptions'=>array('style'=>'width:55px;')
                ),
                                array(
                    'name'=>'密码',
                    'value'=>'$data["password"]',
                    'htmlOptions'=>array('style'=>'width:55px;')
                ),
            ),
        ));

Yii CDbCriteria 常用方法

Yii CDbCriteria 常用方法

    $criteria = new CDbCriteria;      
//函数方式
    $criteria->addCondition("id=1"); //查询条件,即where id = 1  
    $criteria->addInCondition('id', array(1,2,3,4,5)); //代表where id IN (1,23,,4,5,);  
    $criteria->addNotInCondition('id', array(1,2,3,4,5));//与上面正好相法,是NOT IN  
    $criteria->addCondition('id=1','OR');//这是OR条件,多个条件的时候,该条件是OR而非AND  
    $criteria->addSearchCondition('name', '分类');//搜索条件,其实代表了。。where name like '%分类%'  
    $criteria->addBetweenCondition('id', 1, 4);//between 1 and 4   
 
    $criteria->compare('id', 1);    //这个方法比较特殊,他会根据你的参数自动处理成addCondition或者addInCondition,  
                                    //即如果第二个参数是数组就会调用addInCondition  
 
    $criteria->addCondition("id = :id");  
    $criteria->params[':id']=1;  
 
//属性方式  
    $criteria->select = 'id,parentid,name'; //代表了要查询的字段,默认select='*';  
    $criteria->join = 'xxx'; //连接表  
    $criteria->with = 'xxx'; //调用relations   
    $criteria->limit = 10;    //取1条数据,如果小于0,则不作处理  
    $criteria->offset = 1;   //两条合并起来,则表示 limit 10 offset 1,或者代表了。limit 1,10  
    $criteria->order = 'xxx DESC,XXX ASC' ;//排序条件  
    $criteria->group = 'group 条件';  
    $criteria->having = 'having 条件 ';  
    $criteria->distinct = FALSE; //是否唯一查询

相关实例代码:

$criteria = new CDbCriteria();
$criteria->select = 'table_name,model_id,sum(amount) total';
$criteria->group = 'table_name,model_id';
$criteria->addCondition("$nIdcId=4");//也可以$criteria->condition = "$nIdcId=4";
$aResult = accessory_info::model()->findAll($criteria);
 
 
$c = new CDbCriteria();
$c->select = 't.id, t.created_at, t.outsource_id, t.user_id, t.operate, t.content';
$c->join = 'LEFT JOIN outsource ON outsource.id=t.outsource_id';
$c->condition = 'outsource.idc_id IN(' . implode(',', $idc_ids)  . ')';
 
if($last_log_id) {
	$c->condition .= " AND t.id > $last_log_id";
}
 
$c->limit = 20;
$c->order = 't.id DESC';
 
$logs = OutsourceProcessLog::model()->findAll($c);

YII 有用的代码

使用updateCounters()来更新计数器字段:

Book::model()->updateCounters(array('download_count'=>1),':id=id',array(':id'=>$id));

使用sendFile()来下载文件:

$type = LFilter::checkString($_GET['t']);
$dataProvider = Book::model()->findByPk($id);
$content = $this->renderPartial('book',array(
                                     'dataProvider' => $dataProvider,
                                     'type' => $type,
                                ),true,false);
Yii::app()->request->sendFile($dataProvider->name.'.'.$type,$content);

设计数据库时候如果create_time,update_time字段为int(10).在模型中使用行为插件:

public function behaviors()
{
return array(
    'CTimestampBehavior' => array(
    'class' => 'zii.behaviors.CTimestampBehavior',
    'createAttribute' => 'create_time',
    'updateAttribute' => 'update_time',
     )
); }

YII项目性能优化

1.最小化脚本文件
通过配置应用组件 clientScript 的 scriptMap 属性来声明脚本被最小化。 可以在应用配置中完成,也可以在代码中配置

$cs=Yii::app()->clientScript;
$cs->scriptMap=array(
'jquery.js'=>'/js/all.js',
'jquery.ajaxqueue.js'=>'/js/all.js',
'jquery.metadata.js'=>'/js/all.js',
......
);

上面的代码所做是映射这些 JavaScript 文件到 URL /js/all.js。 若这些 JavaScript 文件任何之一需要被一些组件引入, Yii 将引入这个 URL (一次) 而不是各个独立的脚本文件。

其次,我们需要使用一些工具来联合 (和压缩) JavaScript 文件为一个单独的文件,并保存为 js/all.js。

相同的技巧也适用于 CSS 文件。

在 Google AJAX Libraries API 帮助下我们可以改善页面载入速度。例如,我们可以从 Google 的服务器引入 jquery.js而不是从我们自己的服务器。要这样做, 我们首先配置 scriptMap 如下,

$cs=Yii::app()->clientScript;
$cs->scriptMap=array(
'jquery.js'=>false,
'jquery.ajaxqueue.js'=>false,
'jquery.metadata.js'=>false,
......
);

通过映射(map)这些脚本文件为 false,我们阻止 Yii 产生引入这些文件的代码。作为替代,我们在页面中编写如下代码直接从 Google 引入文件,

<head>
<?php echo CGoogleApi::init(); ?>
<?php echo CHtml::script(
CGoogleApi::load('jquery','1.3.2') . "\n" .
CGoogleApi::load('jquery.ajaxqueue.js') . "\n" .
CGoogleApi::load('jquery.metadata.js')
); ?>
</head>

2.使用缓存技术
Yii 提供了几个可以有效提高性能的缓存方案。若一些数据的生成需要长时间,我们可以使用数据缓存 方法来减少数据产生的频率;若页面的一部分保持相对的固定,我们可以使用 碎片缓存 方法减少它的渲染频率;若一整个页面保持相对的固定,我们可以使用 页面缓存 方法来节省页面渲染所需的花销。

若应用在使用 Active Record,我们应当打开 数据结构缓存 以节省解析数据表结构的时间。可以通过设置 CDbConnection::schemaCachingDuration 属性为一个大于 0 的值来完成。

除了这些应用级别的缓存技术,我们也可使用服务级别的缓存方案来提高应用的性能。事实上,我们之前描述的 PHP APC 缓存 就属于此项。 也有其他的服务器技术,例如 Zend Optimizer, eAccelerator, Squid

3.开启 APC 扩展
启用 PHP APC扩展 可能是改善一个应用整体性能的最简单方式。此扩展缓存和优化 PHP 中间代码并避免时间花费再为每个新来的请求解析PHP脚本

4.禁用调试模式
禁用调试模式是另一个改善性能的容易方式。若常量 YII_DEBUG 被定以为 true,这个 Yii 应用将以调试模式运行。调试模式在开发阶段是有用的,但是它影响性能因为一些组件引起额外的系统开销。例如,信息记录器(the message logger)将为被条被记录的信息记录额外的调试信息。

5.使用 yiilite.php
当启用 PHP APC 扩展 时, 我们可以将 yii.php 替换为另一个名为 yiilite.php 的引导文件来进一步提高 Yii-powered 应用的性能。

文件 yiilite.php 包含在每个 Yii 发布中。它是一些常用到的 Yii 类文件的合并文件。在文件中,注释和跟踪语句都被去除。因此,使用 yiilite.php 将减少被引用的文件数量并避免执行跟踪语句。

注意,使用 yiilite.php 而不开启 APC 实际上将降低性能,因为 yiilite.php 包含了一些不是每个请求都必须的类,这将花费额外的解析时间。 同时也要注意,在一些服务器配置下使用 yiilite.php 将更慢,即使 APC 被打开。 最好使用演示中的 hello world 运行一个基准程序来决定是否使用 yiilite.php。

6.数据库优化
从数据库取出数据经常是一个网络应用的主要瓶颈。虽然使用缓存可以减少性能损失,它不能解决根本问题。当数据库包含大量数据而被缓存的数据是无效时,如果没有良好的数据库和查询优化设计,获取最新的数据将会非常耗费资源。

在一个数据库中聪明的设计索引。索引可以让 SELECT 查询更快, 但它会让 INSERT, UPDATE 或 DELETE 查询更慢。

对于复杂的查询,推荐为它创建一个数据库视图,而不是通过PHP代码生成查询语句让DBMS来重复解析他们。

不要滥用 Active Record。虽然 Active Record 擅长以一个 OOP样式模型化数据,它实际上为了它需要创建一个或几个对象来代表每条查询结果降低了性能。 对于数据密集的应用,在底层使用 DAO 或 数据库接口 将是一个更好的选择。

最后但并不是最不重要的一点,在你的 SELECT 查询中使用 LIMIT 。这将避免从数据库中取出过多的数据 并耗尽为 PHP 分配的内存。

YII 操作数据库的三种方式

Getting data from a database

Most applications today use databases. Be it a small website or a social network, at least some parts are powered by databases. Yii introduces three ways which allow you to work with databases:

Active Record
Query builder
SQL via DAO

<?php
class DbController extends Controller
{
    protected function afterAction($action)
    {
        $time = sprintf('%0.5f', Yii::getLogger()->getExecutionTime());
        $memory = round(memory_get_peak_usage()/(1024*1024),2)."MB";
        echo "Time: $time, memory: $memory";
        parent::afterAction($action);
    }
 
    public function actionAr()
    {
        $actors = Actor::model()->findAll(array('with' => 'films',
                'order' => 't.first_name, t.last_name, films.title'));
        echo '<ol>';
        foreach($actors as $actor)
        {
            echo '<li>';
            echo $actor->first_name.' '.$actor->last_name;
            echo '<ol>';
            foreach($actor->films as $film)
            {
                echo '<li>';
                echo $film->title;
                echo '</li>';
            }
            echo '</ol>';
            echo '</li>';
        }
        echo '</ol>';
    }
 
    public function actionQueryBuilder()
    {
        $rows = Yii::app()->db->createCommand()
                ->from('actor')
                ->join('film_actor', 'actor.actor_id=film_actor.actor_id')
                ->leftJoin('film', 'film.film_id=film_actor.film_id')
                ->order('actor.first_name, actor.last_name, film.title')
                ->queryAll();
        $this->renderRows($rows);
    }
 
    public function actionSql()
    {
        $sql = "SELECT * FROM actor a
             JOIN film_actor fa ON fa.actor_id = a.actor_id
             JOIN film f ON fa.film_id = f.film_id
             ORDER BY a.first_name, a.last_name, f.title";
        $rows = Yii::app()->db->createCommand($sql)->queryAll();
        $this->renderRows($rows);
    }
 
    public function renderRows($rows)
    {
        $lastActorName = null;
        echo '<ol>';
        foreach($rows as $row)
        {
            $actorName = $row['first_name'].' '.$row['last_name'];
            if($actorName!=$lastActorName){
                if($lastActorName!==null){
                    echo '</ol>';
                    echo '</li>';
                }
                $lastActorName = $actorName;
                echo '<li>';
                echo $actorName;
                echo '<ol>';
            }
            echo '<li>';
            echo $row['title'];
            echo '</li>';
        }
        echo '</ol>';
    }
}

YII 输入自动完成

在你的视频文件中添加以下代码 :

<?php
$this->widget('zii.widgets.jui.CJuiAutoComplete', array(
 'name'=>'name',
 'sourceUrl'=>'suggestName'
, 'value'=>'some initial value;
 ));
?>

在controller 文件中添加

public function actionSuggestName($term)
{
  //the $term parameter is what the user typed in on the control
 
  //send back an array of data:
  echo CJSON::encode(array('one', 'two', 'three'));
 
  Yii::app()->end(); 
}

Yii CDbCriteria的用法

$criteria = new CDbCriteria;      
$criteria->addCondition("id=1"); //查询条件,即where id = 1  
$criteria->addInCondition('id', array(1,2,3,4,5)); //代表where id IN (1,23,,4,5,);  
$criteria->addNotInCondition('id', array(1,2,3,4,5));//与上面正好相法,是NOT IN  
$criteria->addCondition('id=1','OR');//这是OR条件,多个条件的时候,该条件是OR而非AND  
$criteria->addSearchCondition('name', '分类');//搜索条件,其实代表了。。where name like '%分类%'  
$criteria->addBetweenCondition('id', 1, 4);//between 1 and 4   
 
$criteria->compare('id', 1);    //这个方法比较特殊,他会根据你的参数自动处理成addCondition或者addInCondition,  
                                //即如果第二个参数是数组就会调用addInCondition  
/** 
 * 传递变量 
 */  
$criteria->addCondition("id = :id");  
$criteria->params[':id']=1;  
/** 
 * 一些public vars 
 */  
$criteria->select = 'id,parentid,name'; //代表了要查询的字段,默认select='*';  
$criteria->join = 'xxx'; //连接表  
$criteria->with = 'xxx'; //调用relations   
$criteria->limit = 10;    //取1条数据,如果小于0,则不作处理  
$criteria->offset = 1;   //两条合并起来,则表示 limit 10 offset 1,或者代表了。limit 1,10  
$criteria->order = 'xxx DESC,XXX ASC' ;//排序条件  
$criteria->group = 'group 条件';  
$criteria->having = 'having 条件 ';  
$criteria->distinct = FALSE; //是否唯一查询