通常一个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); } }
相关推荐
这是开源PHP开发框架Yii全方位教程,想要学习yii框架吗,这个笔记可以快速让你了解yii,撑握yii
Yii2.0中文学习手册
yii2学习笔记,一边看某课网一遍实践一遍总结,整理文档
基于Yii2+layui的后台框架模板,实现了完善的RBAC权限控制-yii2-admin-theme
yii学习、PHP学习框架学习
Yii2.0学习笔记完全版 Yii2 Yii2.0 Yii2.0学习 Yii2.0学习笔记
Yii提供了今日Web 2.0应用开发所需要的几乎一切功能。Yii是最有效率的PHP框架之一。Yii是创始人薛强的心血结晶,于2008年1月1日开始开发。
Yii Yii框架 Yii框架快速入门,自己整理的很全的,很容易看懂
很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架
yii框架学习笔记,主要详解请求的处理流程,yii组件、事件和行为,国际化,日志,视图,以及控制台应用。 带注释的源代码下载:https://github.com/kaimixu/yii-book
yii2-adminlte-theme 首先,将以下行添加到配置文件的组件中。 'components' => [ . . . 'view' => [ 'theme' => [ 'class' => 'thedollarsign\themes\adminlte\AdminLTETheme' , // Your menu file. '...
yii 学习笔记,其中包括数据缓存、缓存组件、缓存过期、缓存依赖的理解及yii2数据缓存的测试代码
yii框架中文手册教程和YII模板 我很辛苦才找到的
教程名称:Yii2.0 打造京东商城...所以想要系统学习Yii2.0这个框架这套教程可以从实战项目带你入手。不错的学习YII框架的基础课程,电商系统的结构完整、框架资源太大,传百度网盘了,链接在附件中,有需要的同学自取。
采用的方式是分析框架的源代码,尝试从根上进行理解和阐述,并融入个人使用Yii开发的一些经验和教训。 通过本书,你将不仅仅了解到Yii怎么使用的实操技巧,还将掌握其实现的技术原理和内幕。 更为重要的是,接触...
从 MVC,DAO/ActiveRecord,widgets,caching,等级式RBAC,Web服务,到主题化,I18N和L10N,Yii提供了今日Web 2.0应用开发所需要的几乎一切功能。事实上,Yii是最有效率的PHP框架之一。 Yii是一个高性能的PHP5的...
它从一开始就为严谨的 Web 应用开发而精心设计,不是某个项目的副产品或第三方代码的组合,而是融合了作者丰富的 Web 应用开发经验和其它热门 Web 编程框架(或应用)优秀思想的结晶。 $Id: quickstart.what
yii2是php框架,非常易学。该书是yii2的入门资料之一。建议阅读完自带文档后,看本书。
yii2.0经典视频教程,绝对是初学者的入门首选
yii1.1.10 开发包(包含yii权威指南以及yii博客例子讲解)