`
thesp2
  • 浏览: 54502 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Yii Framework结合Theme、Language和Module

    博客分类:
  • PHP
阅读更多
很长时间都在使用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 API手册是针对开发者的一款详尽参考资料,它包含了Yii框架的所有核心组件、类库以及扩展的使用方法和接口信息。Yii是一个高性能、基于组件的PHP框架,用于开发Web 2.0应用。API(Application ...

    yii framework框架 + yii app模板(基本、高级).zip

    yii framework框架 + yii app模板(基本、高级)

    Yii Framework框架中事件和行为的区别及应用实例分析

    主要介绍了Yii Framework框架中事件和行为的区别及应用,结合实例形式分析了Yii Framework框架中事件和行为的相关概念、原理、区别及应用操作技巧,需要的朋友可以参考下

    Yii Framework 2.0 权威指南 pdf格式 中文高清离线版 有书签

    ### Yii Framework 2.0 权威指南知识点详解 #### 一、Yii框架概述 - **定义**:Yii是一款高效能、基于组件的PHP框架,主要用于加速现代Web应用的开发进程。其名称“Yii”(发音类似于“易”)在中国文化中有“极致...

    Yii Framework 1.1.6

    Yii Framework 1.1.6 是一个高效、可扩展的 PHP 开发框架,它为开发者提供了构建大型Web应用所需的工具和功能。这个版本是Yii框架的稳定版本之一,发布于2011年,旨在提高开发效率并降低维护成本。 在Yii 1.1.6中,...

    Yii Framework v2.0.8.rar

    Yii Framework是一个高性能的PHP5的web应用程序开发框架。通过一个简单的命令行工具 yiic 可以快速创建一个web应用程序的代码框架,开发者可以在生成的代码框架基础上添加业务逻辑,以快速完成应用程序的开发。

    yii framework 中文完全手册

    这个“yii framework 中文完全手册”提供了详尽的指南,帮助开发者理解和利用Yii的强大功能。在深入探讨之前,我们先简单介绍一下Yii框架的基本概念。 Yii,发音为"易",寓意“简易”,是一个快速、安全且专业的...

    Yii Framework v1.1.19

    Yii是一个高性能的PHP5的web应用程序开发框架。通过一个简单的命令行工具 yiic 可以快速创建一个web应用程序的代码框架,开发者可以在生成的代码框架基础上添加业务逻辑,以快速完成应用程序的开发。

    yii framework 1.1.14 chm文档

    yii framework 1.1.14 chm文档,从官方html文档编译,展示效果很好.

    Yii Framework v1.10 Class Reference

    Yii Framework 1.10的API手册

    YII Framework框架教程之使用YIIC快速创建YII应用详解

    主要介绍了YII Framework框架教程之使用YIIC快速创建YII应用的方法,详细分析说明了YII Framework框架使用YIIC命令行创建应用的相关技巧与注意事项,需要的朋友可以参考下

    yii framework 中文手册

    yii framework 最全最新的中文手册

    PhpStorm6 创建yii framework项目

    通过上述步骤,我们可以看到,PhpStorm6和Yii框架的结合使用为Web应用的开发提供了一个高效的环境。从通过命令行工具创建项目,到在PhpStorm中进行项目的导入和配置,每一步都是为了能够更好地发挥出Yii框架和...

    YiiFramework

    Yii Framework 是一个高性能的,基于组件的PHP框架,用于开发Web 2.0应用程序。它以其高效性、灵活性和易用性而...通过深入学习和理解Yii的各个组件和特性,开发者可以大大提高开发效率,同时保证应用的质量和安全性。

    yiiframework 中文 手册

    本中文手册旨在提供全面且详细的指南,帮助开发者更好地理解和利用 Yii 的各种功能。 一、Yii 框架概述 Yii 提供了丰富的特性,如 MVC(模型-视图-控制器)架构模式、数据库访问对象(DAO)、ActiveRecord(对象...

    PHP实例开发源码-Yii Framework php框架.zip

    PHP实例开发源码—Yii Framework php框架.zip PHP实例开发源码—Yii Framework php框架.zip PHP实例开发源码—Yii Framework php框架.zip

    php_Yii Framework v2.0.4.zip.zip

    4. **表单和验证**:Yii提供了方便的表单构建和验证功能,可以轻松创建和验证用户输入。 5. **安全特性**:包括防止SQL注入、跨站脚本攻击(XSS)的防护,以及认证和授权机制,确保应用的安全性。 6. **缓存管理**...

    Yii Framework v1.1.10类参考中文手册

    Yii Framework v1.1.10类参考中文手册

    新下载的yii2,yii framework

    Yii2是不断更新和维护的,每个新版本可能包含性能优化、新的功能特性或对已有功能的改进,因此保持框架的更新对于利用最新的技术和提高开发效率至关重要。 描述中的“新下载的yii2”进一步强调了用户正准备开始使用...

    Yii Framework 2.0 Where条件拼接 pdf

    总而言之,Yii Framework 2.0通过Active Record模式和强大的查询构建器为开发者提供了一套完善的数据库操作解决方案,通过where条件拼接等高级查询功能极大地简化了复杂查询的构建过程,使得开发者能够更专注于业务...

Global site tag (gtag.js) - Google Analytics