手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表Tag:yii

针对品鉴网的一些URL路由设置

这篇文章又能当成开发文档,也能当成软文,所以,你们就将就着看吧。

yii框架中很早就支持路由功能了。所以,从那时候开始,很多人就开始将项目路由化,举例说明:
http://user.pinjian.net,访问用户中心
http://admin.pinjian.net 访问后台
http://xxxx.pinjian.net 访问Xxx
表面上这是一大堆 网站,其实很有可能是什么?只是一个控制器或者一个module罢了。
http://user.pinjian.net可能对应了什么?http://pinjian.net/user/index,很有可能就这样而已。
而对于yii来说,这个太简单了
在main.php(环境 变量设置中),针对urlManager的rules加入:

PHP代码
  1. 'urlManager' => array(  
  2.     'urlFormat' => 'path',  
  3.     'showScriptName'=>false,  
  4.     'rules' => array(  
  5.         'http://photo.pinjian.net/<action:\w+>'=>'image/<action>',  
  6.         '<controller:\w+>/<id:\d+>' => '<controller>/view',  
  7.         '<controller:\w+>/<action:\w+>/<id:\d+>' => '<controller>/<action>',  
  8.         '<controller:\w+>/<action:\w+>' => '<controller>/<action>',  
  9.     ),  
  10. ),  

看看高亮的那一行,是不是很简单?
之前,有一篇博客介绍过的:http://www.neatstudio.com/show-1550-1.shtml,还篇比较详细

Tags: yii

Yii的又一个BUG?

先申明一下,这个可能不是BUG。只是算起来是实现的方式不一样而已。
场景:我有一个MYSQL数据库,但是现在容量越来越大,主要是因为其中有大字段,多个大字段,所以在查询的时候会特别特别慢。所以想到用mongo来存储一些查询用的结构。单条的时候,我还是准备采用MYSQL。当然其实单条用mongo也合适。不过因为迁移数据有点麻烦,所以还是先忍忍,一步一步来。

测试阶段:因为MYSQL to MONGO有点小麻烦,没有现成的工具。官方说有mongoimport,我看过了,确实OK,但是只支持一些基础的结构,比如:json,csv等。其他的则需要第三方工具。但我自己先在测试中,所以就直接写了个脚本,先将数据用AR取出来。然后插入到mongo中。结果发现,在排序的时候。。9999比10000还大。问了一下神仙 ,他说这应该是按字符串排序的方式来做的。

于是做了一个测试,写进了一个数字,果然就对了。。难道是yii的AR的BUG?想想这不太应该啊。于是我写了一个小的Demo:

PHP代码
  1. $db = mysql_connect("localhost","root","123456");  
  2. mysql_select_db("feed");  
  3. $query = mysql_query("select id from feeds_group limit 1");  
  4. while($rs = mysql_fetch_array($query)){  
  5.     $result = $rs;  
  6.     echo "<pre>";  
  7.     var_dump($result);  
  8.     echo "</pre>";  
  9. }  
  10. echo "<hr />";  
  11. $dsn = 'mysql:host=localhost;dbname=feed';  
  12. $user = 'root';  
  13. $password = '123456';  
  14. $dbh = new PDO($dsn$user$password);  
  15. $sth = $dbh->prepare("select id from feeds_group limit 1");  
  16. $sth->execute();  
  17. $result = $sth->fetchAll();  
  18. echo "<pre>";  
  19. var_dump($result);  
  20. echo "</pre>";  

打印出来一看:

XML/HTML代码
  1. array(2) {  
  2.   [0]=>  
  3.   string(1) "1"  
  4.   ["id"]=>  
  5.   string(1) "1"  
  6. }  
  7.   
  8. array(1) {  
  9.   [0]=>  
  10.   array(2) {  
  11.     ["id"]=>  
  12.     string(1) "1"  
  13.     [0]=>  
  14.     string(1) "1"  
  15.   }  
  16. }  

 

果然出来就是字符串了,最后只能自己在插到mongo的时候写了一个小函数,对于数值型字段做了转换,问题就这样解决了。

 

 

 

 

Tags: yii, mongodb, mysql, string

又拍云的Yii组件

这个只是基于又拍云上面的一个小小的扩展,也是作了一个封装。
因为又拍云每次操作bucket都需要为它设置用户名和密码。如果我在一个controller里多次操作不同的bucket,有点麻烦 ,于是就做了一个小封装。
使用起来很简单,在配置文件main.php的components中加入一小段:

XML/HTML代码
  1. 'components'=>array(  
  2.     'upyun'=>'ext.upyun.EasyUpyun',  
  3. ),  

当然,如果有需要额外定制的变量,也可以参考其他组件的设置方法。

附件在这里,我就不多说了,贴上组件的注释:

PHP代码
  1. /** 
  2.  * EasyUpyun.php 
  3.  * @example: 
  4.  *  Yii::app()->upyun->upload($domain,$savedname,$datas,$autoCreateDir=true); 
  5.  *  这个是一个demo,推荐仍然使用upyun提供的API,这样就可以几乎不用改代码 
  6.  *  UpyunBase的用法是$upyun->setApiDomain('abc'); 
  7.  *  组件用法:Yii::app()->upyun->setApiDomain('bucket的别名','abc'); 
  8.  * 
  9.  * @category upyun 
  10.  * @package  upyun 
  11.  * @author   gouki <gouki.xiao@gmail.com> 
  12.  * @version  $Id$ 
  13.  * @created  12-7-6 PM11:07 
  14.  */  

再贴上变量的注释

PHP代码
  1. /** 
  2.  * 别名 
  3.  * 因为又拍云的bucket的名字比较长,在开发的时候,如果用很长的bucket会很痛苦,因此就做了一个别名功能用来代替bucket 
  4.  * @var array 
  5.  */  
  6. public $alias = array(  
  7.     'static' => 'test-public'  
  8. );  
  9. /** 
  10.  * 又拍云的bucket 
  11.  * key 为 bucket 
  12.  * value 为 bucket对应的用户名和密码,格式为“用户名:密码” 
  13.  * @var array 
  14.  */  
  15. public $bucket = array(  
  16.     'test-public' => 'admin:123456'  
  17. );  
  18. /** 
  19.  * 又拍云API实例 
  20.  * @var UpYun 
  21.  */  
  22. public $upyun;  
  23. /** 
  24.  * 是否采用upyun的debug功能,该功能为全局打开,一旦开启,所有bucket涉及的debug都开启 
  25.  * @var bool 
  26.  */  
  27. public $debug = FALSE;  

Over,有想试用的,可以直接尝试下载附件。

附件: upyun.zip (5.59 K, 下载次数:1740)

Tags: yii, 又拍云, 组件

Yii : using multiple radio button

Yii在使用CHtmlRadio的时候,如果参数不正确,会隐藏一个form,导致如果radio的值有3个时,永远只能提交第一个和最后一个
太纠结了。仔细看看,确实 是有一个隐藏FORM,导致本来应该是3个radio的button,变成了6个。

找了一下资料,看了一下源码,果然。。。。有一个hidden。

PHP代码
  1. /** 
  2.  * Generates a radio button for a model attribute. 
  3.  * If the attribute has input error, the input field's CSS class will 
  4.  * be appended with {@link errorCss}. 
  5.  * @param CModel $model the data model 
  6.  * @param string $attribute the attribute 
  7.  * @param array $htmlOptions additional HTML attributes. Besides normal HTML attributes, a few special 
  8.  * attributes are also recognized (see {@link clientChange} and {@link tag} for more details.) 
  9.  * A special option named 'uncheckValue' is available that can be used to specify 
  10.  * the value returned when the radio button is not checked. By default, this value is '0'. 
  11.  * Internally, a hidden field is rendered so that when the radio button is not checked, 
  12.  * we can still obtain the posted uncheck value. 
  13.  * If 'uncheckValue' is set as NULL, the hidden field will not be rendered. 
  14.  * @return string the generated radio button 
  15.  * @see clientChange 
  16.  * @see activeInputField 
  17.  */  
  18. public static function activeRadioButton($model,$attribute,$htmlOptions=array())  
  19. {  
  20.     self::resolveNameID($model,$attribute,$htmlOptions);  
  21.     if(!isset($htmlOptions['value'])) 
  22.         $htmlOptions['value']=1; 
  23.     if(!isset($htmlOptions['checked']) && self::resolveValue($model,$attribute)==$htmlOptions['value']) 
  24.         $htmlOptions['checked']='checked'; 
  25.     self::clientChange('click',$htmlOptions); 
  26.  
  27.     if(array_key_exists('uncheckValue',$htmlOptions)) 
  28.     { 
  29.         $uncheck=$htmlOptions['uncheckValue']; 
  30.         unset($htmlOptions['uncheckValue']); 
  31.     } 
  32.     else 
  33.         $uncheck='0'; 
  34.  
  35.     $hiddenOptions=isset($htmlOptions['id']) ? array('id'=>self::ID_PREFIX.$htmlOptions['id']) : array('id'=>false); 
  36.     $hidden=$uncheck!==null ? self::hiddenField($htmlOptions['name'],$uncheck,$hiddenOptions) : ''; 
  37.  
  38.     // add a hidden field so that if the radio button is not selected, it still submits a value 
  39.     return $hidden . self::activeInputField('radio',$model,$attribute,$htmlOptions);  
  40. }  


太纠结了。居然用unCheckValue设置一下才OK:

PHP代码
  1. echo CHtml::radioButton('btn', false, array(  
  2.     'value'=>'1',  
  3.     'name'=>'btnname',  
  4.     'uncheckValue'=>null  
  5. ));   
  6. CHtml::radioButton('btn', false, array(  
  7.     'value'=>'2',  
  8.     'name'=>'btnname',  
  9.     'uncheckValue'=>null  
  10. ));   
  11.    
  12. //如果是activeForm,就得这么用
  13. echo $form->radioButton($model'name'array(  
  14.     'value'=>1,  
  15.     'uncheckValue'=>null  
  16. ));  
  17. echo $form->radioButton($model'name'array(  
  18.     'value'=>2,  
  19.     'uncheckValue'=>null  
  20. ));  

果然纠结。。。NND

Tags: yii

ZendFramework

Zend 2.0的框架改动与1比实在是太大了,当然抛开Namespace不说,即使是应用和架构,都有了一部分调整。
Zend实在太庞大了。用来开发项目不一定是首选。以前都是当成类库来用的,毕竟他实现了几乎目前所需要用到的一切功能,甚至GData之类的接口都全了,你还能奢求什么?
要赶时髦?openID和oauth也有,要实用?连pdf库都有,发邮件、本地化、命令行,应有尽有,不是类库是什么?
不过2.0就不太一样。我随便看了一个DB类,和以前的操作都有点不太一样了。或许是一下子没有适应过来那种newZend_Db_TableGateway之类的调用方式吧
手册在这里:http://packages.zendframework.com/docs/latest/manual/en
下载在这里:http://packages.zendframework.com/

还有一个相对比较实用的wiki:http://framework.zend.com/wiki/display/ZFDEV2/Home
可以看看。2.0的架构和代码还是值得学习的。

Tags: zend, yii