当前位置:首页 > 开发 > 编程语言 > 编程 > 正文

YII学习第二十四天,Theme、Language和Module

发表于: 2013-02-22   作者:dcj3sjt126com   来源:转载   浏览次数:
摘要: 通常一个Yii的app目录结构如下:  引用 app  ----assets  ----images  ----css  ----protected  --------commands  --------components  --------config  --------contr

通常一个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学习第二十四天,Theme、Language和Module

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
自2011年接触OpenCV已经有几年了,一直停留在写一些小程序,利用手冊完毕一些任务,一直没有深入研
翻译《Pro Hadoop 》Jason Venner著,部分章节 JobTracker & TaskTracker The framework provides t
相比于其他数据库而言,SQLite的环境搭建十分简单,简单几步就可以完成: (1) 首先,从http://www.s
Theming是一个在Web应用程序里定制网页外观的系统方式。通过采用一个新的主题,可以非常方便的改变
Theming是一个在Web应用程序里定制网页外观的系统方式。通过采用一个新的主题,可以非常方便的改变
一.解析的基本概念 从事先规定好的格式中提取数据 解析的前提:提前约定好格式.数据提供方按照格式提
参考资料:http://www.w3cschool.cc/sqlite/sqlite-data-types.html 在SQLite中,数据类型的概念看
day24:多线程 【等待唤醒机制】 等待唤醒机制[Object] wait():让线程处于等待状态 notify():唤醒
早上在ruby-china发了个帖子,询问“现今PHP的框架中最接近RAILS的是什么?”大部分答曰"Yii”。所
学习yii初体验之yii项目的部署和搭建 首先我们建一个新的项目文件 建yii framework和requirements放
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号