主题
你可以利用主题(Theme),快速简便地切换页面的观感。
要使用主题,在控制器中指定主题名称:
- class ExampleController extends AppController {
- public $theme = 'Example';
- }
在 2.1 版更改: 2.1 之前的版本需要设置 $this->viewClass = 'Theme'
。2.1 版本不再需要,因为View
类支持主题。
你也可以在动作中或者在 beforeFilter
或 beforeRender
回调函数中设置或改变主题名称:
- $this->theme = 'AnotherExample';
主题视图文件需要放在 /app/View/Themed/
目录中。在 Themed 目录内,使用主题名称作为名字创建目录。例如,上面代码中的主题可以在目录/app/View/Themed/AnotherExample
中找到。
注解
重要的是请记住,CakePHP 接受驼峰命名的主题名称。
除此之外,/app/View/Themed/Example/
目录内的目录结构和 /app/View/
是完全一样的。
例如,Posts 控制器的 edit 动作的视图文件是/app/View/Themed/Example/Posts/edit.ctp
,布局文件则位于/app/View/Themed/Example/Layouts/
目录内。
如果一个视图文件不能在主题中找到,CakePHP 会在目录 /app/View/
中寻找。这样,你就可以创建主视图文件,然后简单地在主题目录中根据需要重写单个视图文件进行覆盖。
主题资源
除了视图文件,主题也可以包含静态资源。主题可以在它的 webroot 目录中包含任何必要的资源。这让主题的打包和分发更加容易。在开发时,对主题资源的请求是由Dispatcher
来处理的。为了提高生产环境中的性能,推荐使用符号链接(symlink)或者是复制主题资源到应用程序的 webroot 目录中。欲知详情,请往下看。
为了使用新主题的 webroot,在主题中创建下面这样的目录:
- app/View/Themed/<themeName>/webroot<path_to_file>
Dispatcher 将会负责在视图路径中寻找正确的主题资源。
所有 CakePHP 内置的助件能够识别主题并会自动创建正确的路径。如同视图文件,如果一个文件不在主题目录中,它会默认为主 webroot 目录:
- //在名为 'purple_cupcake' 的主题中
- $this->Html->css('main.css');
- //创建一个路径类似
- /theme/purple_cupcake/css/main.css
- //并连接到
- app/View/Themed/PurpleCupcake/webroot/css/main.css
提升插件和主题资源的性能
众所周知,通过 PHP 来提供资源肯定要慢于不用 PHP 来提供这些资源。尽管核心团队采取了措施让提供插件和主题的速度尽可能快,但是可能有些情况下对性能有更高的要求。在这种情况下,建议要么使用符号链接(symlink),要么将插件/主题资源复制到app/webroot
下与 CakePHP 使用的路径匹配的目录中。
app/Plugin/DebugKit/webroot/js/my_file.js
变为app/webroot/debug_kit/js/my_file.js
app/View/Themed/Navy/webroot/css/navy.css
变为app/webroot/theme/Navy/css/navy.css