标签:yii

浏览模式: 标准 | 列表 | 图文
官方wiki:Configuring PhpStorm IDE for Yii

官方wiki:Configuring PhpStorm IDE for Yii

如果到facebook上关注一下yii framework的群组,会发现有人在介绍yiicookbook.org,里面是一本关于1.1的书。
然后去yii framework官方上搜索一下phpstorm,会发现同一个人在说自己用phpstorm,问phpstorm有没有什么支持。结果官网说暂时好象不支持。。。
然后再搜索了一下,发现在yii的官网有一个简单的例子在说如何让项目支持yii framework。看了一下,发现,大多数都用过,只有第一点,说是把yiilite.php过滤掉。这个其实很重要了,否则有些变量就会出现提示两次。
OK,来看官网的wiki吧:http://www.yiiframework.com/wiki/92/configuring-phpstorm-ide-for-yii

Code completion

  1. Exclude yiilite.php from index:
    • File → Settings → IDE Settings → File Types.
    • yiilite.php to Ignore files and folders.
  2. Exclude not used directories, specify resources.
    • File → Settings → Project settings → Directories.
    • Mark framework/cli/views, protected/runtime and assets as excluded.
    • Mark website root as resource root.
  3. Specify path to your PHP.
    • File → Settings → Project settings → PHP → PHP Home.
  4. If your project uses common Yii framework folder you need to include it.
    • File → Settings → Project settings → PHP → PHP Home → Add.
    • Specify a path to framework directory.
  5. If you are writing unit tests you can include PHPUnit to get code completion:
    • File → Settings → Project settings → PHP → PHP Home → Add.
    • Specify a path to PHPUnit.
  • Complete code: Ctrl+Space.
  • Show method arguments: Ctrl+Q.

Testing

You should install PHPUnit to run unit tests.

  1. PHPUnit.
    • Follow official PHPUnit installation guide.
    • In your IDE: Run → Edit configurations.
    • Press "+".
    • Name: anything.
    • Test: depending on what do you want to test select an appropriate option. Specify path.
    • Use XML configuration file: specifying path to phpunit.xml. Often it's path_to_your_webroot/protected/tests/phpunit.xml.
  • To run tests use SHIFT+F10.
OK,现在这样就可以简单的支持yii framework了。只是phpstorm还是有点小问题,因为提示的时候不会显示phpdoc的信息。纠结,啥时候会有doc的提示呢?
Yii + Zend_Feed

Yii + Zend_Feed

YII是一个PHP框架。
ZendFramework也是一个PHP框架
在Yii里配置ZF框架,刷刷的就一个RSS阅读器就出来了。
代码很简单,把Zend整合COPY到protected/extensions目录下
在控制器的init方法里加入:
Yii::import("ext.*");
require_once("Zend_Feed_Reader.php");

然后在需要的方法里加入
$feed = Zend_Feed_Reader::import("http://neatstudio.com/rss.php");
这样就创建了一个读的对象了。然后。。。。。
你懂的:

$data = array(
'title' => $feed->getTitle(),
'link' => $feed->getLink(),
'dateModified' => $feed->getDateModified(),
'description' => $feed->getDescription(),
'language' => $feed->getLanguage(),
'entries' => array(),
);

foreach ($feed as $entry) {
$edata = array(
'title' => $entry->getTitle(),
'description' => $entry->getDescription(),
'dateModified' => $entry->getDateModified(),
'authors' => $entry->getAuthors(),
'link' => $entry->getLink(),
'content' => $entry->getContent()
);
$data['entries'][] = $edata;
}
print_r($data);

就这样,一个刚刚的RSS阅读器就出来了。
当然,它没有缓存,没有这没有那的,不过,都解析完了,剩下的功能还会远吗?

扩展yii的验证类

扩展yii的验证类

在项目中遇到文件上传的问题,这时候需要用到CFileValidator,但是官方的验证中少了一点点的处理,比如,对于图片,我只想上传尺寸正好是300x500的图片。怎么办?
所以我做了一点小小的扩展,于是我在rules里面加了这么两条:

array('picname', 'application.validators.Myfile', 'on'=>'insert','types'=>'jpg,png','wrongType'=>'只允许上传jpg或者PNG','maxSize' => 1024*300,'tooLarge' => '图片最大只支持300K','imageSize'=>'768x1024','wrongImageSize'=>'对不起,图片尺寸只支持768*1024'),
array('picname', 'application.validators.Myfile', 'on'=>'update','types'=>'jpg,png','wrongType'=>'只允许上传jpg或者PNG','maxSize' => 1024*300,'tooLarge' => '图片最大只支持300K','imageSize'=>'768x1024','wrongImageSize'=>'对不起,图片尺寸只支持768*1024','allowEmpty'=>true,),

数组的第二个字段就是一个全路径,告诉rules,对于picname用的是application.validators.Myfile类。这个类其实很简单,只是简单的扩展了官方的CFileValidator类,大致如下:

class Myfile extends CFileValidator{
public $imageSize;
public $wrongImageSize;

/**
* @param CModel $object the object being validated
* @param string $attribute the attribute being validated
* @param CUploadedFile $file uploaded file passed to check against a set of rules
* @return void
*/
protected function validateFile($object, $attribute, $file){
parent::validateFile($object,$attribute,$file);
if($this->imageSize!=''&&strpos($this->imageSize,"x")!==false){
list($width,$height) = @getimagesize($file->getTempName());
$imageSize = sprintf("%sx%s",$width,$height);
if($imageSize != $this->imageSize){
$message=$this->wrongImageSize!==null?$this->wrongImageSize : Yii::t('yii','The file "{file}" cannot be uploaded. Only files with these size are allowed: {imagesize}.');
$this->addError($object,$attribute,$message,array('{file}'=>$file->getName(), '{extensions}'=>$this->imageSize));
}
}
}
}

我这种只是简单的判断是否与指定尺寸相符,如果需要检测小于指定范围的图片,那就需要多一点的判断了,也不会太难啦。主要是一个思路(感谢烂桔提供思路)

在Yii框架中使用Hprose或PHPRPC

在Yii框架中使用Hprose或PHPRPC

Yii:

Yii is a high-performance PHP framework best for developing Web 2.0 applications.

Yii comes with rich features: MVC, DAO/ActiveRecord, I18N/L10N, caching, authentication and role-based access control, scaffolding, testing, etc. It can reduce your development time significantly.

PHPRPC:

PHPRPC 是一个轻型的、安全的、跨网际的、跨语言的、跨平台的、跨环境的、跨域的、支持复杂对象传输的、支持引用参数传递的、支持内容输出重定向的、支持分级错误处理的、支持会话的、面向服务的高性能远程过程调用协议。

目前该协议的最新版本为 3.0。该版本目前已有以下几种语言的实现:

ASP,ActionScript,Delphi/C++Builder/Kylix,Java,JavaScript,NET,PHP,Python,Ruby,Perl,Lazarus(Free Pascal)

其中 ASP、.NET、Java、Ruby、Python 和 PHP 版本除了提供客户端实现外,还提供了服务器端实现。

HPROSE:

Hprose (High Performance Remote Object Service Engine) 是一个商业开源的新型轻量级跨语言跨平台的面向对象的高性能远程动态通讯中间件。它支持众多语言,例如 C++, .NET, Java, Delphi, Objective-C, ActionScript, JavaScript, ASP, PHP, Python, Ruby, Perl 等语言,通过 Hprose 可以在这些语言之间实现方便且高效的互通。

Hprose 易学易用,且功能强大,您只需很短时间的学习,就可以用它方便地构建出跨语言跨平台分布式的电信级应用系统。

如何在Yii中使用Hprose或者PHPRPC呢?我这里简单介绍一下Yii下hprose的应用方法

1、下载hprose的PHP版本,嗯,别看了,是混淆过的,但不影响你使用。

2、将下载后的hprose拷贝到yii项目的/protected/extension/hprose目录下

3、新建一个apicontroller:

f7fccadd1117ac3c390ed86fe8fba322

我这样的方式是最简单的,将一些actionIndex的方法都公开了,在实际应用中当然不可以这样。不过我这里是测试,当然是无所谓的

访问http://localhost/project/test/ (project是我的项目名称,test是controller, index是action,由于默认action是index,所以我省略了)

浏览器中返回了:

Fa4{s11"actionIndex"s11"afterAction"s5"hello"s3"sum"}z

由此其实我们也可以基本确认有四个方法可以使用actionIndex,afterAction,hello,sum,这主要是因为我把当前类当成发布对象了。(不主张啊不主张)

4、继续下一步,

<?php
include("./protected/extensions/hprose/hproseHttpClient.php");
$client = new HproseHttpClient("http://localhost/project/test");
$result = $client->sum(1,2,3,4,5);
print_r($result);

OK,浏览器输出了15,就这样完成了一个简单的HPROSE应用。

当然我这样的方式太简单了,文档在这里有下载,我就不再画蛇添足的提供了:http://www.hprose.com/documents.php。

因为只是简单的的一些应用,暂时也看不到hprose的性能比phprpc提升了多少。

---------------备注

由于Yii对于大小写敏感,因此在new HproseHttpServer();的时候,Hprose的H不能大写,否则,它会自动寻找HproseHttpServer.php,但由于PHP的hprose的文件中首字母都是小写。因此在new的时候就需要:new hproseHttpServer();

yii的一些小技巧

yii的一些小技巧

笔记。。。
Yii的cache大家用起来可能是比较爽,直接Yii::app()->cache->get,就over了。在这个时候,我们可以配置相应的cache方式,比如数据库,memcache,apc,eacc.....(太长,记不住),等等。但是,怎么样能够让memcache缓存与文本缓存或其他缓存共用呢?

所以,不要纠结于普通的想法。嗯,在main.php的cache数组元素下,建一个同级数组。如:
'fc' => array(
'class' => 'CFileCache',
'directoryLevel'=>1,
),
然后在项目中就可以直接Yii::app()->fc->get,或者Set了。是不是很方便 ?

Yii的Euploadify插件使用

Yii的Euploadify插件使用

Yii在自已内部已经实现了单文件上传和多文件上传的代码,只是很少会有人注意这些吧?
事实上更多时候,在多文件上传的时候,我们往往采用了swfupload来进行处理,但swfupload的参数太多了,用起来会非常复杂和痛苦。
所幸,有很多人知道这些事情,他们对swfupload重新进行了封装,并做了简化,比如这个uploadify。
官网上的例子也很简单,一个是立即上传,一个是自定义上传。其实 最主要的是uploadify的是它的回调函数很少也很方便,常用的就是onError,onCompleted,onAllCompleted,onSuccess之类的。
在Yii的Extension库中,也确实有一款插件叫做EUploadifyWidget。最面对一些变量进行了更多的封装,也就是让我们使用起来更方便。不过,在使用过程中,还是会发现,虽然它封装了很多操作,但其实有很多地方还是没有处理好,官网上的例子也没有处理好。
打开代码可以发现在run函里面有对options等的处理,根据实际需要进行调整就OK了(之所以要调整,其实也还有一个原因,是因为我在这次的项目中没有用到clientScript,而这个插件却用了它,所以我才会多进行了一些处理)
默认的路径还是需要做一些处理,路径中的baseURL是基于它自己的路径来处理的,还有需要更改的就是JS/CSS/swf等的路径需要注意,其他就Over了。

纯笔记

Yii CDbCriteria的常用方法

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;
/**
* 一些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; //是否唯一查询

有需要用到的可以查看一下。。。

Yii笔记

Yii笔记

本文纯粹是笔记,记下来怕忘了
1、终止当前操作,一般情况下是用exit,但用了Exit后无法看到trace的内容。所以要采用Yii::app()->end();
2、createUrl和createAbsoluteUrl,这两个函数,如果需要宣传自己的网址和内容,还是用createAbsoluteUrl函数吧。里面带了全部路径,而CreateUrl只会显示/home/xxx这样的路径,不利于SEO
3、widget默认的render无法使用theme中的模版,于是写一个类继承自CWidget,然后所有的widget都继承这个类,比如我这样实现了。。

class Widget extends CWidget{
private static $_viewPaths;
/**
* 重写CWidget中的getViewPath
*/
public function getViewPath($checkTheme=false)
{
$className=get_class($this);
if(isset(self::$_viewPaths[$className]))
return self::$_viewPaths[$className];
else
{
if($checkTheme && ($theme=Yii::app()->getTheme())!==null){
return self::$_viewPaths[$className] = $theme->getBasePath().DIRECTORY_SEPARATOR."widgets"; //这是我自己的路径
}
$class=new ReflectionClass($className);
return self::$_viewPaths[$className]=dirname($class->getFileName()).DIRECTORY_SEPARATOR.'views';
}
}
}

覆写父类方法,使得getViewPath找到我指定的目录,我目录在themes/classic/下建了一个widgets的目录。这样的好处很多。。而且对于CSS和JS等路径都可以和标准视图一致

先写这么多。。。

怒了,QueryCache

怒了,QueryCache

怒了。真的怒了。。。。
前两天我还一直在想,怎么让yii实现查询的时候进行缓存,当时考虑在beforeFind和afterFind后做处理,但看了代码才发现beforeFind,如果不显式传入criteria,就没有办法把查询参数传递进去,那我就没有办法判断当前查询的param 是否被缓存了。AfterFind,倒是可以做处理,因为$event->sender或者$this中都已经有了结果集了。。。但没有办法判断是否缓存,查询完的缓存意义也就不大了。不是吗?

刚才无意中看了一下Yii 1.1.17的changelog,居然看到了这个:query-caching,当时我就震精了。http://www.yiiframework.com/doc/guide/1.1/en/caching.data#query-caching

好象这次1.1.17更新的几个功能都不错。。。查看这里:http://www.yiiframework.com/news/45/yii-php-framework-1-1-7-is-released/

  1. RESTful URL Support
  2. Query Caching
  3. Parameter Binding for Class-based Actions
  4. Seamless Client-side Validation
  5. Passing Parameters to Relational Named Scopes
  6. Using 'through' with HAS_MANY and HAS_ONE
  7. Using Transactions in DB Migration
  8. Registering and Using Custom Script Packages

好象,除了1、7我兴趣不是特别大,其它的几个都不错,原来的Actions中的Action无法绑定参数的,现在也直接可以用了,也就是说Action可以更容易的被移出。代码也更易分离了。4是客户端验证,原来还要在提交后到服务端验证,现在又方便一点了。。
其它的还是看看官方吧,不一定介绍了。

闲下来的学习

最近,明显是空了很多,于是我看了一下以前的代码,再看看网上那些开源的代码,拿来与我自己曾经写的代码进行验证这样可以了解别人的优点。知道自己的缺点在哪里。

1、xweibo,这个玩意目前很流行,腾讯也出了个iweibo,反正说白了,如果你是用接口,那无非就那么点东西。根据接口拉拉数据,你也不用关系他们的数据结构和其他的代码等。当然如果你要整合到你自己的系统里就不是这么简单啦。所以,我在看xweibo是怎么个折腾法。。。。所幸,你看xweibo的index.php文件里,被注释了很多代码那就是xweibo的一些常用方法,看看就差不多了。。。

2、sablog for Yii前台基本完成,目前已经完成:文章列表、回复列表、标签云、标签云对应文章列表,首页,侧边栏也基本完成。待完成的有:友情链接页,文章内容页,高级搜索页,搜索结果页等(文章内容页里的东西最多,有考虑象以前想过的,本博客历史上的今天,关联文章,回复,等等,太多了。。当然还要考虑预留点广告位,方便自己塞广告。文章内容,也还得考虑那些程序的语法标签,附件,缩略图。。。。唉)

通过设置,现在的Url规则也尽量与原来一致,这样我如果切换的话,几乎就可以平移了。。

fe5406a55fcab5363e2b0936c5755a62

把官方这段贴上来,http://www.yiiframework.com/doc/guide/1.1/zh_cn/topics.url。。。不是照抄就能用的,得看清楚一些符号。。黑黑

我们使用一些例子来解释网址工作规则。我们假设我们的规则包括如下三个:

array(
'posts'=>'post/list',
'post/<id:\d+>'=>'post/read',
'post/<year:\d{4}>/<title>'=>'post/read',
)
  • 调用$this->createUrl('post/list')生成/index.php/posts。第一个规则适用。

  • 调用$this->createUrl('post/read',array('id'=>100))生成/index.php/post/100。第二个规则适用。

  • 调用$this->createUrl('post/read',array('year'=>2008,'title'=>'a sample post'))生成/index.php/post/2008/a%20sample%20post。第三个规则适用。

  • 调用$this->createUrl('post/read')产生/index.php/post/read。请注意,没有规则适用。

总之,当使用createUrl生成网址,路线和传递给该方法的GET参数被用来决定哪些网址规则适用。如果关联规则中的每个参数可以在GET参数找到的,将被传递给createUrl ,如果路线的规则也匹配路线参数,规则将用来生成网址。