yii

30
Apr
0

yii页面跳转

1、在同一个Controller中页面跳转

$this->render('view页面',array('参数'=>'值'));

$this->render('news',array('result'=>'123','result1'=>'456'));

url重定向 ? $this->redirect(array('action方法'));

$this->redirect(array('getnews','id'=>1,,,,));

2、在不同的Controller中页面跳转

$this->redirect(array('跳转到的controller/跳转到的controller里的action','参数'=>'值',,,,));

$this->redirect(array('user/getuser','id'=>1));

========================================================

控制器

  1. ?方法1
    1. //执行操作
    2. if(Product::model()->updateAll($set,$criteria)){
    3. ????//成功跳转
    4. ????$this->render('../index/success',array('message'=>'恭喜,产品审核成功'));
    5. ????exit;
    6. }else{
    7. ????//失败跳转
    8. ????$this->render('../index/error',array('message'=>'对不起,产品审核操作失败,请稍后再试!'));
    9. ????exit;
    10. }
  2. ?默认3秒后跳转到定义的第一个链接
    1. $this->render('../index/success',array(
    2. ????????????'message'=>'恭喜,宝贝信息发布成功',
    3. ????????????'links'=>array(
    4. ????????????????????array('浏览发布的产品','/company/product/update/id/'.$model->zp_id),
    5. ????????????????????array('继续发布产品','/company/product/create/step/1'),
    6. ????????????????????),
    7. ));
    8. exit;
  3. ?另一种js跳转方式,它会替代全部页面显示,没有布局文件,可用于ajax更新的时候错误跳转
    1. if(!MemGroup::model()->exists($criteria)){
    2. ????jsRedirect($url,'2','操作错误,选中项操作名不能为空','controllerActions');
    3. ????exit;
    4. }

视图页面

  1. <!--操作成功?start-->
  2. <div?class="change_done?bd_db">
  3. ????<p>
  4. ????????<span?class="ico_big?ico_done"></span>
  5. ????????<span?class="fw_b?fs_14"><?php?echo?isset($message)?$message:'操作成功'??></span>
  6. ????</p>
  7. ????<p?class="line_30">现在去,
  8. ????????<?php
  9. ????????????foreach($links?as?$link){
  10. ????????????????echo?CHtml::link($link[0],$link[1],array('class'=>'c_06c?mr10'));
  11. ????????????}
  12. ?????????>
  13. ????</p>
  14. ????<p?class="c_666?ml40">该页将在?<span?id='setouttime'>3</span>秒后自动跳转!</p>
  15. </div>
  16. <!--操作成功?end-->
  17. <script?language=javascript>
  18. var?int=self.setInterval("countdown()",1000);
  19. function?countdown(){
  20. ????var?t=document.getElementById("setouttime").innerHTML-1;
  21. ????document.getElementById("setouttime").innerHTML=t;
  22. ????if(t===0){
  23. ????????location='<?php?echo?$links[0][1]?>';
  24. ????}
  25. }
  26. </script>

效果图

27
Apr
0

yii urlmanager 伪静态

yii urlmanager 伪静态

可以这样写:

'<controller:(post|product|user)>/<id:\d+>-<page:\d+>'?=>?'<controller>/list',
'<controller:(post|product|user)>/<id:\d+>'?=>?'<controller>/list'

\d+??匹配数字????\w+匹配字母

 

 

第一步:

在main.php配置文件的component域中添加urlManager模块,并加入urlrules.

1

2

3

4

5

6

7

8

9

10

11
$urls?=?include(dirname(__FILE__)?.?'/urlrules.php');??
?????????????:??
?????????????:??
???
'urlManager'=>array(??
?????????????'urlFormat'?=>?'path',??
?????????????'showScriptName'?=>?false,//隐藏index.php???
?????????????'urlSuffix'?=>?'.html',//后缀???
?????????????'rules'?=>?$urls,??
???
),

第二步:在同级目录下写urlrules.php.如:

1

2

3

4

5
return?array(??
????????'/index.html'?=>?'site/index',?//首页??
????????'search'?=>?'search/index',??
???
);

第三步,当然是配置服务器的rewrite模块,使得入口为index.php

1)apache下,在网站根目录下建立.htaccess如下:

1

2

3

4

5

6

7

8

9

10
Options?+FollowSymLinks???
???
IndexIgnore?*/*???
???
RewriteEngine?on????
#?if?a?directory?or?a?file?exists,?use?it?directly???
RewriteCond?%{REQUEST_FILENAME}?!-f??
RewriteCond?%{REQUEST_FILENAME}?!-d??
???
RewriteRule?.?index.php

2)?nginx下在php配置模块和location模块添加rewrite如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18
location?/?{??
????????????root???/home/george/workspace/EclipsePHP/webroot;??
????????????index??index.html?index.php?index.htm;??
????????????#try_files?$uri?$uri/?@rewrite;??
????????????if?(!-f?$request_filename){??
????????????????rewrite?(.*)?/index.php;??
????????????}??
?}??
location?~?\.php$?{??
?????????????root????????????/home/george/workspace/EclipsePHP/webroot;??
????????????fastcgi_pass???127.0.0.1:9000;??
????????????fastcgi_index??index.php;??
????????????fastcgi_param??SCRIPT_FILENAME???/home/george/workspace/EclipsePHP/webroot$fastcgi_script_name;??
????????????include????????fastcgi_params;??
????????????if?(!-f?$request_filename){??
????????????????rewrite?(.*)?/index.php;??
????????????}??
?}

URL路由,是指通过分析?URL,??找出请求的控制器及动作。路由信息就是指控制器及动作组成的请求字符串,形如?controllerID/ActionID?。

 

Yii中的路由主要有两重作用:

1.?根据请求?URL?找到应对的控制器及其方法

2.?根据提供的参数及规则生成?URL

这就称为路由双向解析。

 

支持两种形式的URL?解析:

1.???普通的get?传递参数方式,如?index.php?r=controller/action?m1=value1

2.???path模式(需要服务器支持),如?index.php/name1/value1/name2/value2

 

 

URL路由处理由?urlManager?组件?(?对应类名为?CUrlManager)?负责?,??它也是一个组件,故可以在配置文件中设置其属性:

$rules=array();?#url双向解析规则,这是最复杂的一项参数

$urlSuffix='';?#pathinfo?模式时的?url?后缀

$showScriptName=true;?#是否在?URL?中显示脚本文件名称,当设置为?false?时需要服务器支持

$appendParams=true;?#pathinfo模式下是否将参数追加到?URL?上,此项参数一般用于生成?URL?场景。设置为true?时?,??参数将以斜线分隔并追加到路径后面。设为?false?时将以?query?string?方式追加。

$routeVar='r';?#仅在?get?形式时有效,指定路由信息的变量名称

$caseSensitive=true;?#路由信息是否区分大小写。如果设置为?false,??请求路由信息将被转换成小写,所以CWebApplication::controllerMap?、?CController::actions?、保存控制器的目录三者都应该使用小写。

$matchValue=false;?#仅在?get?形式时有效。当创建?URL?前?GET?参数的值应该匹配对应的子规则,这句话不好理解,后面会详细使用案例说明

$cacheID='cache';?#路由缓存所使用的组件名称(若使用缓存机制)

$useStrictParsing=false;?#仅在?path?形式时有效,设置是否使用严格的?URL?解析。如果设置为?true,??则任何请求的?url?必须匹配?$rules?指定的规则,否则会引发?404?错误。

$urlRuleClass='CUrlRule';?#url规则处理组件类……

 

通过setter?方法定义的属性:

Urlformat?:?设置?url?形式,可以是?get,?path?两种方式

 

 

get模式是服务器默认支持的形式,故不需要规则解析,直接通过?$_GET[$this->routeVar]?变量即可取得路由信息,相对而言?path?模式是比较消耗资源的(因为需要逐条解析规则),所以我觉得在对性能要求较高的应用中,可以考虑使用?http?server?的地址重写代替?yii?的规则,从而减少?yii?中昂贵的规则分析性能代价。掌握了其规则的定义,才能从根本上熟练使用路由组件。

一个规则是由路由和匹配样式组成的,一般地,每条规则的键名为规则,值为应对的路由,均可以配置文件中指定或在运行时指定,以下是几个例子:

'post/<id:\d+>/<title:.*?>'=>'post/view'

表示匹配post/\d+/.*??规则的请求的路由为?post/view,??且将设置两个?GET?变量,分别为?$_GET['id']?和$_GET['title'],??指向对应的值。带尖括号的部分表示不仅要匹配而且要捕获值至变量中。

创建url?时,若指定路由为?post/view,??并提供?id,?title(?可选?)?参数,则将生成?post/$id/$title?形式的?url?,如:

$app->urlManager->createUrl('post/view',?array(

'id'=>23,

'title'=>'title_text',

'name1'=>'value1',

'name2'=>'value2'

));

将生成index.php/post/23/title_text?name1=value1&name2=value2

 

'posts/<tag:.*?>'=>'post/index'

匹配posts/.*??的请求的路由将设置为?post/index,??同时将匹配的内容保存到?$_GET['tag']?变量中。创建?URL?时若指定路由信息为?post/index,??并提供了?tag?参数(可选),则将生成?posts/$tag?形式?URL?。

 

'<controller:\w+>/<action:\w+>'=>'<controller>/<action>'

匹配?\w+/\w+?的请求?,??设置?$_GET['controller']?和?$_GET['action']?两个变量,并且路由信息中直接使用这两个变量的值作为路由信息。若指定?controller?及?action?两个参数,参将创建形如?controller/action?形式的?URL?。

 

了解这些,是我们使用urlManager?组件的关键。

27
Apr
0

Yii的accessRules用法

Yii的accessRules用法

访问控制过滤器(Access?Control?Filter)
访问控制过滤器是检查当前用户是否能执行访问的controller?action的初步授权模式。

这种授权模式基于用户名客户IP地址访问类型

访问控制过滤器,适用于简单的验证

 

需要复杂的访问控制,需要使用将要讲解到的基于角色访问控制(role-based?access?(RBAC))。
在控制器(controller)里重载CController::filters方法,设置访问过滤器来控制访问动作(看?Filter?了解更多过滤器设置信息)。
class?PostController?extends?CController
{
......
public?function?filters()
{
return?array(
'accessControl',
);
}
}
在上面,设置的access?control过滤器将应用于PostController里每个动作。

过滤器具体的授权规则通过重载控制器的CController::accessRules方法来指定。
class?PostController?extends?CController
{
......
public?function?accessRules()
{
return?array(
array('deny',
'actions'=>array('create',?'edit'),
'users'=>array('?'),
),
array('allow',
'actions'=>array('delete'),
'roles'=>array('admin'),
),
array('deny',
'actions'=>array('delete'),
'users'=>array('*'),
),
);
}
}
上面设定了三个规则,每个用个数组表示。

数组的第一个元素不是'allow'就是'deny',其他的是名-值成对形式设置规则参数的。

上面的规则这样理解:

create和edit动作不能被匿名执行;

delete动作可以被admin角色的用户执行;

delete动作不能被任何人执行。
访问规则是一个一个按照设定的顺序一个一个来执行判断的。

和当前判断模式(例如:用户名、角色、客户端IP、地址)相匹配的第一条规则决定授权的结果。

如果这个规则是allow,则动作可执行;

如果是deny,不能执行;如果没有规则匹配,动作可以执行。

为了确保某类动作在没允许情况下不被执行,设置一个匹配所有人的deny规则在最后,类似如下:
return?array(
//?...?别的规则...
//?以下匹配所有人规则拒绝'delete'动作
array('deny',
'action'=>'delete',
),
);
因为如果没有设置规则匹配动作,动作缺省会被执行。
访问规则通过如下的上下文参数设置:
actions:?设置哪个动作匹配此规则。
users:?设置哪个用户匹配此规则。

此当前用户的name?被用来匹配,三种设定字符在这里可以用:
*:?任何用户,包括匿名和验证通过的用户。
?:?匿名用户。
@:?验证通过的用户。

roles:?设定哪个角色匹配此规则

这里用到了将在后面描述的role-based?access?control技术。

In?particular,?the?rule?is?applied?if?CWebUser::checkAccess?returns?true?for?one?of?the?roles.提示,用户角色应该被设置成allow规则,因为角色代表能做某些事情。

ips:?设定哪个客户端IP匹配此规则。

verbs:?设定哪种请求类型(例如:GET,?POST)匹配此规则。

expression:?设定一个PHP表达式。

它的值用来表明这条规则是否适用。在表达式,你可以使用一个叫$user的变量,它代表的是Yii::app()->user。

 

 

 

 

 

 

访问规则中:
expression:?设定一个PHP表达式。它的值用来表明这条规则是否适用。在表达式,你可以使用一个叫$user的变量,它代表的是Yii::app()->user。
expression的具体用法:
class?AdminController?extends?CController
{
……
public?function?accessRules()
{
return?array(
array('allow',??//允许所有人执行'login','error','index'
'actions'=>array('login','error','index'),
'users'=>array('*'),
),
array('allow',?//允许超级管理员执行所有动作
'actions'=>array('create','update','delete'),
'expression'=>array($this,'isSuperAdmin'),
),
array('allow',//允许普通管理员执行
'actions'=>array('update'),
'expression'=>array($this,'isNormalAdmin'),????//表示调用$this(即AdminController)中的isNormalAdmin方法。
),
array('deny',??//?deny?all?users
'users'=>array('*'),
),
);
}

 

//判断是否是超级管理员
protected?function?isSuperAdmin($user)???//其中$user代表Yii::app()->user即登录用户。
{
return?($this->loadModel($user->id)->adminAdminFlag==1);
}

 

//判断是否是普通管理员
protected?function?isNormalAdmin($user)????//其中$user代表Yii::app()->user即登录用户。
{
return?($this->loadModel($user->id)->adminAdminFlag==0);
}

 

public?function?loadModel($id)
{
$model=Admin::model()->findByPk((int)$id);
if($model===null){
throw?new?CHttpException(404,'页面不存在');
}
return?$model;
}
}

 

 

注:其中$user代表Yii::app()->user即登录用户。

24
Apr
0

Yii 框架里数据库操作详解-[增加、查询、更新、删除的方法 'AR模式']

? ? public function getMinLimit () {
$sql = "...";
??? $result = yii::app()->db->createCommand($sql);
$query = $result->queryAll();

return array (
$query [0] ['max'],
);
}

 

 

 

$connection=Yii::app()->db;?
$sql="SELECT u.account,i.* FROM sys_user as u left join user_info as i on u.id=i.user_id";
$rows=$connection->createCommand?($sql)->query();
foreach ($rows as $k => $v ){
echo $v['add_time'];
}

 

 

========================================?事务

$db = Yii::app()->db;
$dbTrans = $db->beginTransaction();
$dbTrans->commit();
$dbTrans->rollback();

 

 

 

========================================? 分页

 
一般写法:
$criteria = new CDbCriteria;
$count = DnOnline::model()->count($criteria);
$pages = new CPagination($count);
$pages->pageSize = 5;
$pages->applylimit($criteria);
$model = DnOnline::model()->findAll($criteria);

记得控制器里有个函数paginate($itemCount,$pageSize=null,$pageVar=null)
CDB写法:
$criteria = new CDbCriteria;
$sql = "SELECT * FROM USER";
$model= Yii::app()->db->createCommand($sql)->queryAll();
$pages = new CPagination(count($model));
$pages->pageSize = 4;
$pages->applylimit($criteria);
$model=Yii::app()->db->createCommand($sql." LIMIT :offset,:limit");
$model->bindValue(':offset', $pages->currentPage*$pages->pageSize);
$model->bindValue(':limit', $pages->pageSize);
$model=$model->queryAll();

或者:

$criteria = new CDbCriteria;
$connection=Yii::app()->db;
$sql="SELECT u.account,i.* FROM sys_user as u left join user_info as i on u.id=i.user_id ";
$model= Yii::app()->db->createCommand($sql)->queryAll();
$pages = new CPagination(count($model));
$pages->pageSize = 4;
$pages->applylimit($criteria);

$model=Yii::app()->db->createCommand($sql." LIMIT :offset,:limit");
$model->bindValue(':offset', $pages->currentPage*$pages->pageSize);
$model->bindValue(':limit', $pages->pageSize);
$model=$model->queryAll();

 

 

========================================?一、查询数据集合?

1、$admin=Admin::model()->findAll?($condition,$params);
该方法是根据一个条件查询一个集合,如:
findAll("username=:name",array(":name"=>$username));
2、$admin=Admin::model()->findAllByPk($postIDs,$condition,$params);
findAllByPk($id,"name like ':name' and age=:age",array(':name'=>$name,'age'=>$age));
该方法是根据主键查询一个集合,可以使用多个主键,如:
findAllByPk(array(1,2));
3、$admin=Admin::model()->findAllByAttributes($attributes,$condition,$params);
该方法是根据条件查询一个集合,可以是多个条件,把条件放到数组里面,如:
findAllByAttributes(array('username'=>'admin'));
4、$admin=Admin::model()->findAllBySql($sql,$params);
该方法是根据SQL语句查询一个数组,如:
findAllBySql("select *from admin whereusername=:name",array(':name'=>'admin'));

========================================??二、查询对像?的方法??

1、$admin=Admin::model()->findByPk?($postID,$condition,$params);
根据主键查询出一个对象,如:findByPk(1);

 

 

 

 
2、$row=Admin::model()->find?($condition,$params);
根据一个条件查询出一组数据,可能是多个,但是他只返回第一行数据,如:
find('username=:name',array(':name'=>'admin'));

 

$userinfo=Userinfo::model()->find(array('condition'=>'user_id=:user_id','params'=>array(':user_id'=>$uid)));
print_r($userinfo->user_id);

 

 
3、$admin=Admin::model()->findByAttributes?($attributes,$condition,$params);
该方法是根据条件查询一组数据,可以是多个条件,把条件放到数组里面,他查询的也是第一条数据,如:
findByAttributes(array('username'=>'admin'));
4、$admin=Admin::model()->findBySql?($sql,$params);
该方法是根据SQL语句查询一组数据,他查询的也是第一条数据,如:
findBySql("select *from admin whereusername=:name",array(':name'=>'admin'));
5、拼一个获得SQL的方法,在根据find查询出一个对象
$criteria=new CDbCriteria;
$criteria->select='username'; // only select the 'title' column
$criteria->condition='username=:username';
$criteria->params=array(':username=>'admin');
$post=Post::model()->find($criteria);?// $params isnot needed

========================================??三、查询个数,判断查询是否有结果??

1、$n=Post::model()->count?($condition,$params);
该方法是根据一个条件查询一个集合有多少条记录,返回一个int型数字,如
count("username=:name",array(":name"=>$username));
2、$n=Post::model()->countBySql?($sql,$params);
该方法是根据SQL语句查询一个集合有多少条记录,返回一个int型数字,如
countBySql("select *from admin whereusername=:name",array(':name'=>'admin'));
3、$exists=Post::model()->exists($condition,$params);
该方法是根据一个条件查询查询得到的数组有没有数据,如果有数据返回一个true,否则没有找到

 

 

 

$sql = "select count(*) as count? from " . $this->tableName() . " where user_id = $userId";
$query = $result->queryAll();
$pageSize =10;
$count = $query [0] ['count'];
$pageCount = ceil($count / $pageSize);
return $pageCount;

========================================?四、添加的方法??
$admin=newAdmin;
$admin->username=$username;
$admin->password=$password;
if($admin->save?()>0){
echo "添加成功";
}else{
echo "添加失败";
}

 

 

 

$userLimit = new UserLimit();
$userLimit->item = 0.30000;
if($userLimit->insert?(){

 

}
========================================?五、修改的方法?

 
$userLimitRet = UserLimit::model()->findByPk?(array (
'user_id' => $userId,
'category_id' => $v
));
$userLimitRet->order = $order;

if (! $userLimitRet->update?()) {
}

 

 

 

 

 

$userAmount=userAmount::model()->findByPk?($userId);
$userAmount->credit=Yii::app()->request->getParam('credit',10000);
$ret = $userAmount->save?();

 

 

 
1、Post::model()->updateAll?($attributes,$condition,$params);
$count =Admin::model()->updateAll(array('username'=>'11111','password'=>'11111'),'password=:pass',array(':pass'=>'1111a1'));
if($count>0){
echo "修改成功";
}else{
echo "修改失败";
}

 

 

 

 

 

$ret = $this->updateAll?(array (
'set' => $Set
), " user_id?in ( " . $userIds . " )?and category_id = " . $categoryId);

if($ret){
return true;
}else {
return false;
}

 

 
2、Post::model()->updateByPk?($pk,$attributes,$condition,$params);
$count =Admin::model()->updateByPk(1,array('username'=>'admin','password'=>'admin'));
$count =Admin::model()->updateByPk(array(1,2),array('username'=>'admin','password'=>'admin'),'username=:name',array(':name'=>'admin'));
if($count>0){
echo "修改成功";
}else{
echo "修改失败";
}
$pk代表主键,可以是一个也可以是一个集合,$attributes代表是要修改的字段的集合,$condition代表条件,$params传入的值
3、Post::model()->updateCounters?($counters,$condition,$params);
$count=Admin::model()->updateCounters(array('status'=>1),'username=:name',array(':name'=>'admin'));
if($count>0){
echo "修改成功";
}else{
echo "修改失败";
}
array('status'=>1)代表数据库中的admin表根据条件username='admin',查询出的所有结果status字段都自加1

========================================?六、删除的方法??
1、Post::model()->deleteAll($condition,$params);
$count = Admin::model()->deleteAll('username=:nameandpassword=:pass',array(':name'=>'admin',':pass'=>'admin'));
$id=1,2,3
deleteAll('id in(".$id.")');删除id为这些的数据
if($count>0){
echo "删除成功";
}else{
echo "删除失败";
}
2、Post::model()->deleteByPk($pk,$condition,$params);
$count = Admin::model()->deleteByPk(1);
$count =Admin::model()->deleteByPk(array(1,2),'username=:name',array(':name'=>'admin'));
if($count>0){
echo "删除成功";
}else{
echo "删除失败";
}

23
Apr
0

关于createUrl和CHtml::link参数设置的区别

前者将多个参数放进一个数组中,后者直接向后累计添加(不放进数组)
1,createUrl应用

Html代码??收藏代码
  1. <a?href="<?php?echo?$this->createUrl('news/view',array('id'=>$companyNew->id,'news_type'=>$companyNew->news_type))??>"?title="<?php?echo?$companyNew->title??>">

批注:在MVC中,可以使用$this->createUrl();在../components/xx.php中使用Yii::app()->createUrl();

2,CHtml::link应用

Html代码??收藏代码
  1. <?php?echo?CHtml::link(CHtml::encode($data->title),?array('view',?'id'=>$data->id,'news_type'=>$data->news_type));??>
  2. //例如:
  3. <?php?echo?CHtml::link('Link?Text',?array('controller/action','param1'=>'value1'));?>
  4. html输出是<a?href="index.php?r=controller/action&param1=value1">Link?Text</a>
  5. //多参数
  6. <?php?echo?CHtml::link('Link?Text',?array('controller/action','param1'=>'value1','param2'=>'value2'));?>
  7. html输出是<a?href="index.php?r=controller/action&param1=value1&param2=value2">Link?Text</a>
  8. //额外参数:
  9. <?php?echo?CHtml::link('Link?Text',?array('controller/action','param1'=>'value1'),?array('target'=>'_blank'));?>
  10. html输出是<a?target="_blank"?href="index.php?r=controller/action&param1=value1">Link?Text</a>
  11. //绝对路径:
  12. <?php?echo?CHtml::link('Link?Text',?array('/controller/action'));?>
  13. //指定模块下的路径
  14. <?php?echo?CHtml::link('Link?Text',?array('/module-id/controller/action'));?>
  15. //无效链接:
  16. <?php?echo?CHtml::link('Link?Text',?array('href'=>'javascript:void(0)'));?>
  17. <a?href="javascript:void(0)">Link?Text</a>