通常一个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); } }
相关推荐
对于熟悉Yii2和layui的开发者来说,这是一个极好的起点,可以在此基础上进行二次开发,实现具体业务逻辑。对于初学者,这是一个学习RBAC和前后端分离开发的好例子,可以从中学到如何结合PHP框架与前端UI库来构建高效...
Yii框架是高效且灵活的PHP框架,专为Web 2.0应用开发而设计。自2008年1月薛强开始开发以来,Yii已经经历了多个版本迭代,从1.0.0到...通过深入学习和实践,开发者可以充分利用Yii的优势,提高开发效率和应用质量。
### Yii2.0中文学习手册知识点总结 #### 一、简介 - **Yii2.0**是一款基于PHP的高性能Web应用程序开发框架,以其简洁、高效、安全的特点深受开发者喜爱。本手册旨在帮助初学者和进阶用户快速掌握Yii2.0的核心概念与...
yii2学习笔记,一边看某课网一遍实践一遍总结,整理文档
Yii Yii框架 Yii框架快速入门,自己整理的很全的,很容易看懂
Yii2.0学习笔记完全版 Yii2 Yii2.0 Yii2.0学习 Yii2.0学习笔记
本篇学习笔记将详细介绍Yii框架的基本概念,包括请求处理流程、组件、事件与行为、错误和日志处理、国际化以及视图和控制台应用等方面。 ### 请求的处理流程 1. **项目入口脚本**:在Yii框架中,项目的入口脚本...
Yii框架是一款高效的、基于组件的PHP开发框架,用于...总之,Yii框架中文手册教程和YII模板资源是学习和开发Yii应用的宝贵资料。通过深入学习和实践,开发者可以充分利用Yii的强大功能,构建出高效、可扩展的Web应用。
综上所述,"Yii权威指南思维导图"是学习和掌握Yii框架不可或缺的辅助工具,它将复杂的框架结构和功能用简洁明了的图表展现出来,极大地提升了学习效率。通过仔细研究这个思维导图,开发者可以更深入地理解Yii的每一...
Yii2框架特别适合于初学者,因为它的易学易用,以及其提供了一个全面的文档,让初学者可以通过学习和实践快速掌握。 Yii2框架具有许多特性,使其在众多PHP框架中脱颖而出: 1. MVC架构:Yii2遵循模型-视图-控制器...
Yii框架是一款高效的PHP开发框架,特别适合用于构建大型企业级Web应用。它的名称"Yii"取自中文“易”字,寓意简洁、...无论是初学者还是经验丰富的开发者,这些中文文档和教程都是学习和掌握Yii框架不可或缺的资源。
这半个月的学习笔记详细记录了YII框架的基础知识和核心概念,对于初学者来说是一份宝贵的参考资料。YII,全称Yet Another Intelligent Idea,是一个高性能、组件驱动的PHP框架,特别适合用于开发大型、复杂的Web应用...
yii2-adminlte-theme 首先,将以下行添加到配置文件的组件中。 'components' => [ . . . 'view' => [ 'theme' => [ 'class' => 'thedollarsign\themes\adminlte\AdminLTETheme' , // Your menu file. '...
从标签"Yii 2.0"我们可以确认,这个压缩包的内容与Yii框架的第二个主要版本有关。 压缩包子文件的文件名称列表只给出了一项:"yii2-2.0.0",这很可能是指Yii 2.0的第一个稳定版本。通常,这个版本会包含框架的核心...
8. 社区支持:Yii拥有活跃的社区和大量的第三方扩展,开发者可以通过社区获得帮助和丰富的插件资源。 安装Yii框架的过程相对简单,通常包括以下步骤: 1. 从官方网站下载Yii框架压缩包。 2. 将压缩包解压至Web...
yii 学习笔记,其中包括数据缓存、缓存组件、缓存过期、缓存依赖的理解及yii2数据缓存的测试代码
9. **扩展性**:Yii的插件和模块系统允许开发者轻松添加新的功能,`CModule`类是模块的基类,` yiisoft/extensions `目录存放第三方扩展。 通过对Yii 1.1.14源代码的深入学习,开发者不仅可以提升自己的PHP编程技巧...
这个开发包包含了Yii框架的核心库、相关的文档和一个具体的博客应用实例,这对于初学者和有经验的开发者来说都是极好的学习资源。 首先,让我们深入了解一下Yii框架的核心特性: 1. **性能优化**:Yii 使用缓存...