很长时间都在使用Yii做SNS游戏后台,其类导入、全局变量生命、对象自动实例化、Behavior、Event都十分好用。
最近研究了一下其WEB方面都东西,主要从Theme、Language、Module方面入手。
通常一个Yii的app目录结构如下:
引用
app
----assets
----images
----css
----protected
--------commands
--------components
--------config
--------controllers
--------extensions
--------models
--------modules
--------views
----themes
--------classic
------------views
----------------layout
----------------system
----------------site
Theme是Yii系统支持的。当设置了Yii::app()->theme="xxxx"的时候,app根目录下的themes中的相应的theme就会起作用。比如设置Yii::app()->theme="classic",那么themes/classic/views就会替代protected/views作为视图资源存放的地方,除非视图文件不存在,才会启用protected/views下的视图文件。
Yii内置了翻译器,可以使用Yii::t()来进行翻译,这个可以通过Yii::app()->language来控制目标语言。
Module是一个模块,包含了controller、model、view。
在原生的Yii系统里是支持Theme和Module结合。比如系统里建立一个Module名字为test,在protected/modules下结构如下:
引用
protected
----modules
--------test
------------components
------------controllers
------------models
------------views
----------------default
----------------layouts
------------TestModule.php
这个时候设置了Yii::app()->theme="classic",就可以将protected/modules/test/views复制到themes/classic/views/下,并起名为test。
但是如果要再结合language做i18n支持,就不是那么容易了。首先将i18n相关语言使用Yii::t()来翻译,本身是一个效率低下的事情;其次,因为语言不同,势必会影响到界面排版,所以用一个view文件来控制就显得捉襟见肘。
解决的思路是在controller解析view文件路径的时候,加上language标识。优先级是先找themes下带language的路经,如果没有则找themes下不带language的路径,如果没有则找modules下的views的带language的路径,如果没有则找modules下的views的不带language的路径。
我的做法如下:
1、修改CController.php
public function resolveViewFile($viewName,$viewPath,$basePath,$moduleViewPath=null)
{
if(empty($viewName))
return false;
if($moduleViewPath===null)
$moduleViewPath=$basePath;
if(($renderer=Yii::app()->getViewRenderer())!==null)
$extension=$renderer->fileExtension;
else
$extension='.php';
if($viewName[0]==='/')
{
if(strncmp($viewName,'//',2)===0)
$viewFile=$basePath.$viewName;
else
$viewFile=$moduleViewPath.$viewName;
}
else if(strpos($viewName,'.'))
$viewFile=Yii::getPathOfAlias($viewName);
else {
$viewFileBak = $viewFile=$viewPath.DIRECTORY_SEPARATOR.$viewName;
if (isset(Yii::app()->language)) {
$viewFile=$viewPath.DIRECTORY_SEPARATOR.Yii::app()->language.DIRECTORY_SEPARATOR.$viewName;
}
}
if(is_file($viewFile.$extension))
return Yii::app()->findLocalizedFile($viewFile.$extension);
else if($extension!=='.php' && is_file($viewFile.'.php'))
return Yii::app()->findLocalizedFile($viewFile.'.php');
else {
if (isset($viewFileBak)) {
if(is_file($viewFileBak.$extension))
return Yii::app()->findLocalizedFile($viewFileBak.$extension);
else if($extension!=='.php' && is_file($viewFileBak.'.php'))
return Yii::app()->findLocalizedFile($viewFileBak.'.php');
}
}
return false;
}
2、在protected/components里新增TLController.php
/**
* Abstract controller class for Theme&Language Controller.<br>
* @author henry
*
*/
abstract class TLController extends CController {
/**
* @var array context menu items. This property will be assigned to {@link CMenu::items}.
*/
public $menu=array();
/**
* @var array the breadcrumbs of the current page. The value of this property will
* be assigned to {@link CBreadcrumbs::links}. Please refer to {@link CBreadcrumbs::links}
* for more details on how to specify this property.
*/
public $breadcrumbs=array();
public function init() {
parent::init();
if ($this->hasEventhandler('onControllerInit')) {
$this->onControllerInit(new CEvent($this));
}
//$this->layout = '/layouts/'.Yii::app()->language.'/column1';
}
/**
* Supported befaviors
* @return array
*/
public function behaviors() {
return array_merge(parent::behaviors(), array(
'themeBehavior'=>array(
'class'=>'application.behaviors.ThemeBehavior',
),
'langBehavior'=>array(
'class'=>'application.behaviors.LangBehavior',
),
));
}
public function onControllerInit($event) {
$this->raiseEvent('onControllerInit', $event);
}
}
3、在protected/behaviors增加2个Behavior:
//ThemeBehavior.php
class ThemeBehavior extends CBehavior {
const COOKIE_KEY = '__theme';
public function events() {
return array_merge(parent::events(), array(
'onControllerInit'=>'controllerInit',
));
}
public function controllerInit($event) {
$v = Yii::app()->request->getParam(self::COOKIE_KEY);
if (!isset($v)) {
$v = Yii::app()->request->cookies[self::COOKIE_KEY];
if (!isset($v)) {
$v = Yii::app()->theme->name;
} else {
$v = $v->value;
}
}
Yii::app()->theme = $v;
Yii::app()->request->cookies[self::COOKIE_KEY] = new CHttpCookie(self::COOKIE_KEY, $v);
}
}
//LangBehavior.php
class LangBehavior extends CBehavior {
const COOKIE_KEY = '__lang';
private $_lang = '';
public function events() {
return array_merge(parent::events(), array(
'onControllerInit'=>'controllerInit',
));
}
public function controllerInit($event) {
$v = Yii::app()->request->getParam(self::COOKIE_KEY);
if (!isset($v)) {
$v = Yii::app()->request->cookies[self::COOKIE_KEY];
if (!isset($v)) {
$v = Yii::app()->language;
} else {
$v = $v->value;
}
}
Yii::app()->language = $v;
Yii::app()->request->cookies[self::COOKIE_KEY] = new CHttpCookie(self::COOKIE_KEY, $v);
}
}
分享到:
相关推荐
Yii Framework API手册 英文原版
yii framework框架 + yii app模板(基本、高级)
Yii Framework 1.1.6 框架
Yii Framework是一个高性能的PHP5的web应用程序开发框架。通过一个简单的命令行工具 yiic 可以快速创建一个web应用程序的代码框架,开发者可以在生成的代码框架基础上添加业务逻辑,以快速完成应用程序的开发。
yii framework 中文完全手册
Yii是一个高性能的PHP5的web应用程序开发框架。通过一个简单的命令行工具 yiic 可以快速创建一个web应用程序的代码框架,开发者可以在生成的代码框架基础上添加业务逻辑,以快速完成应用程序的开发。
yii framework 1.1.14 chm文档,从官方html文档编译,展示效果很好.
PhpStorm6 创建yii framework项目全过程。
从 MVC,DAO/ActiveRecord,widgets,caching,等级式RBAC,Web服务,到主题化,I18N和L10N,Yii提供了今日Web 2.0应用开发所需要的几乎一切功能。事实上,Yii是最有效率的PHP框架之一。 Yii是一个高性能的PHP5的...
Yii Framework 1.10的API手册
YiiFramework 最新最完善的YII框架
yii framework 最全最新的中文手册
Yii Framework 2.0 Where条件拼接 pdf 应该囊括 了大部分的查询示例,like ,not,...
Yii Framework 2.0 权威指南 pdf格式 中文高清离线版 有书签
PHP实例开发源码—Yii Framework php框架.zip PHP实例开发源码—Yii Framework php框架.zip PHP实例开发源码—Yii Framework php框架.zip
yiiframework 纯中文手册 在官网的基础上翻译的更全面 更详细
Yii Framework v1.1.10类参考中文手册
2019年最近整理的YII Framework 2.0权威指南文档。在这里上伟希望能帮到大家。可以方便的在手机上,或没有网络的地方查看学习。
Yii Framework v2.0.49.3.zip
基于yii framework 商城,开源 php