heming是一个在Web应用程序里定制网页外观的系统方式。经过采用一个新的主题,网页应用程序的总体外观能够当即和戏剧性的改变。php
在Yii,每一个主题由一个目录表明,包含view文件,layout文件和相关的资源文件,如图片, CSS文件, JavaScript文件等。主题的名字就是他的目录名字。所有主题都放在在同一目录WebRoot/themes
下 。在任什么时候候,只有一个主题能够被激活。css
提示:默认的主题根目录
WebRoot/themes
可被配置成其余的。只须要配置themeManager应用部件的属性basePath和baseUrl为你所要的值。html
要激活一个主题,设置Web应用程序的属性theme为你所要的名字。能够在application configuration中配置或者在执行过程当中在控制器的动做里面修改。api
注:主题名称是区分大小写的。若是您尝试启动一个不存在的主题,
yii:
:app()->theme
将返回null
。安全
主题目录里面内容的组织方式和application base path目录下的组织方式同样。例如,全部的view文件必须位于views
下 ,布局view文件在views/layouts
下 ,和系统view文件在views/system
下。例如,若是咱们要替换PostController
的create
view文件为classic
主题下,咱们将保存新的view文件为WebRoot/themes/classic/views/post/create.php
。网络
对于在module里面的控制器view文件,相应主题view文件将被放在views
目录下。例如,若是上述的PostController
是在一个命名为forum
的模块里 ,咱们应该保存create
view 文件为WebRoot/themes/classic/views/forum/post/create.php
。若是 forum
模块嵌套在另外一个名为support
模块里 ,那么view文件应为WebRoot/themes/classic/views/support/forum/post/create.php
。app
注:因为
views
目录可能包含安全敏感数据,应当配置以防止被网络用户访问。yii
当咱们调用render或renderPartial显示视图,相应的view文件以及布局文件将在当前激活的主题里寻找。若是发现,这些文件将被render渲染。不然,就后退到viewPath和layoutPath 所指定的预设位置寻找。ide
baseurl属性,咱们就能够为此图像文件生成以下url,
yii">提示:在一个主题的视图,咱们常常须要连接其余主题资源文件。例如,咱们可能要显示一个在主题下
images
目录里的图像文件。使用当前激活主题的baseurl属性,咱们就能够为此图像文件生成以下url,布局yii: :app()->theme->baseUrl . '/images/FileName.gif'
Below is an example of directory organization for an application with two themes basic
and fancy
.
WebRoot/ assets protected/ .htaccess components/ controllers/ models/ views/ layouts/ main.php site/ index.php themes/ basic/ views/ .htaccess layouts/ main.php site/ index.php fancy/ views/ .htaccess layouts/ main.php site/ index.php
In the application configuration, if we configure
return array( 'theme'=>'basic', ...... );
then the basic
theme will be in effect, which means the application's layout will use the one under the directorythemes/basic/views/layouts
, and the site's index view will use the one underthemes/basic/views/site
. In case a view file is not found in the theme, it will fall back to the one under theprotected/views
directory.
Starting from version 1.1.5, views used by a widget can also be themed. In particular, when we callCWidget::render() to render a widget view, Yii will attempt to search under the theme folder as well as the widget view folder for the desired view file.
To theme the view xyz
for a widget whose class name is Foo
, we should first create a folder named Foo
(same as the widget class name) under the currently active theme's view folder. If the widget class is namespaced (available in PHP 5.3.0 or above), such as \app\widgets\Foo
, we should create a folder namedapp_widgets_Foo
. That is, we replace the namespace separators with the underscore characters.
建立一个Foo挂件的theme view xyz,咱们应该在theme's view文件夹下建立Foo文件夹。
We then create a view file named xyz.php
under the newly created folder. To this end, we should have a filethemes/basic/views/Foo/xyz.php
, which will be used by the widget to replace its original view, if the currently active theme is basic
.
//this feature has been available since version 1.1.3.
When using a widget provided by third party or Yii, we often need to customize it for specific needs. For example, we may want to change the value of CLinkPager::maxButtonCount from 10 (default) to 5. We can accomplish this by passing the initial property values when calling CBaseController::widget to create a widget. However, it becomes troublesome to do so if we have to repeat the same customization in every place we useCLinkPager.
$this->widget('CLinkPager', array( 'pages'=>$pagination, 'maxButtonCount'=>5, 'cssFile'=>false, ));
Using the global widget customization feature, we only need to specify these initial values in a single place, i.e., the application configuration. This makes the customization of widgets more manageable.
To use the global widget customization feature, we need to configure the widgetFactory as follows:
return array( 'components'=>array( 'widgetFactory'=>array( 'widgets'=>array( 'CLinkPager'=>array( 'maxButtonCount'=>5, 'cssFile'=>false, ), 'CJuiDatePicker'=>array( 'language'=>'ru', ), ), ), ), );
In the above, we specify the global widget customization for both CLinkPager and CJuiDatePicker widgets by configuring the CWidgetFactory::widgets property. Note that the global customization for each widget is represented as a key-value pair in the array, where the key refers to the wiget class name while the value specifies the initial property value array.
Now, whenever we create a CLinkPager widget in a view, the above property values will be assigned to the widget, and we only need to write the following code in the view to create the widget:
$this->widget('CLinkPager', array( 'pages'=>$pagination, ));
We can still override the initial property values when necessary. For example, if in some view we want to setmaxButtonCount
to be 2, we can do the following:
$this->widget('CLinkPager', array( 'pages'=>$pagination, 'maxButtonCount'=>2, ));
这个对pageSize无效。
参考:http://www.yiiframework.com/forum/index.php/topic/11510-cgridview-how-to-set-default-page-size/
http://danaluther.blogspot.com/2012/02/leveraging-widgets-widget-factory-and.html