如何让Typecho使用blade模板引擎
开篇
在博客开博之前,我就写了一篇:新平台,启用blade模板,是的,你看到的现在的皮肤感觉和官方没有两样,其实是我使用blade模板完全重新制作了一份。
Blade模板功能介绍
目录结构:
.
|____functions.php
|____404.php
|____index.php
|____archive.php
|____cache
| |____.gitignore
|____post.php
|____grid.css
|____screenshot.png
|____img
| |____icon-search.png
| |____icon-search@2x.png
|____style.css
|____page.php
|____views
| |____index.blade.php
| |____404.blade.php
| |____comments.blade.php
| |____post.blade.php
| |____page.blade.php
| |____archive.blade.php
| |____sidebar.blade.php
| |____layouts.blade.php
|____normalize.css
|____blade.php
抛开css/image和functions.php这些内容不看,你看到的,似于是和官方的相比只多了两个目录+一个blade.php文件,这其中,cache是blade用来生成编译后的缓存目录,views目录就是我们的blade模板。
Blade
打开blade.php,会发现其中的代码不多,就几行
<?php
if (!defined('__TYPECHO_ROOT_DIR__')) {
exit;
}
if (!class_exists('TypechoPlugin\BladeOne') && !Typecho\Plugin::exists('Blade')) {
exit('请先启用Blade模板插件');
}
use TypechoPlugin\BladeOne;
try {
$views = __DIR__.'/views';
$cache = __DIR__.'/cache';
$blade = new BladeOne($views, $cache, BladeOne::MODE_DEBUG);
$blade->includeScope = true;
$blade->pipeEnable = true;
$blade->setBaseUrl($this->options->themeUrl);
echo $blade->run((isset($viewFile) ? $viewFile : 'index'), [
'view' => $this,
'options' => $this->options,
'user' => $this->user,
// 'converter' => $converter,
]);
} catch (Exception $e) {
exit($e->getMessage());
}
这个BladeOne,来自于EFTEC/BladeOne,这个模板是我从yii时代就开始用了,因为那时候用过laravel后,就感觉离不开这玩意了,于是我就自己抠了一份laravel的blade库,但后面发现要改的内容太多了,这时候发现了这个EFTEC/BladeOne
后,就在非laravel项目中使用上了它。
对于普通用户来说,我们只需要下载他的lib
目录下的BladeOne.php
这一个文件就行了,如果你不想单独写插件,就将文件放到usr/plugins目录下,同时修改一下BladeOne.php的命名空间,以及对应HelloWorld插件的标准typecho插件注释,这时候你到后台管理
的插件
模块下,你就会发现BladeOne
是一个即插即用插件了。
插件是启用了,但模板并不知道,对吧?所以我们在blade.php中加了一个判断 if (!class_exists('TypechoPlugin\BladeOne') || !Typecho\Plugin::exists('Blade'))
,如果没有引入Blade,就直接不能使用,这样也挺方便。
在上面的blade.php中,有几个变量和参数
$views / $cache 代表了模板目录和编译后的缓存目录,这个可以自己随便定义,我只是用了一个相对标准的目录罢了
BladeOne的第三个参数,默认是使用BladeOne::MODE_DEBUG,事实上他有4个参数,如果觉得没问题或者已经修改的很稳定了。就使用MODE_FAST,否则MODE_AUTO也OK
接下来的三个参数就是blade中的用法了
$blade->includeScope = true。这个默认是false,你也可以删除这一行,删除后,传入的变量就只能在当前的blade模板里使用。https://github.com/EFTEC/BladeOne/wiki/Template-inheritance
$blade->pipeEnable 在linux下面大家都知道,管道的用法,例如最常见的cat xxx.log|grep "php"
,这个也是类似的用法,比如{{$name | ucwords }}
就可以直接首字母大写了,是不是很方便?
$blade->setBaseUrl($this->options->themeUrl),这个是为了使用@asset / @relative
等方法,参考:asset官方用法,一般情况下,我们其实不会调用其他项目目录里的文件,所以@asset
就足够了,例如当前目录下的img/logo.png
,正常写法是<?php echo $this->options->themeUrl('img/logo.png');?>
,在使用 blade并且设置了baseUrl时,就可以@asset('img/logo.png')
,一个模板文件下来,至少少写上百个字符了。
最重要的赋值
echo $blade->run((isset($viewFile) ? $viewFile : 'index'), [
'view' => $this,
'options' => $this->options,
'user' => $this->user,
]);
在这里我定义了一个变量$viewFile,如果这个变量不存在,默认就是使用index.blade.php模板,然后传入了3个参数 view/options/user
,因为这三个变量确实是几乎每个模板都会用得到。为什么要传入呢?主要还是由于blade已经不再是标准PHP模板了,所以他里面就不能用 $this
变量(以前在Yii中也是这样的用法)
其他文件的写法
着重介绍完blade.php的内容,那么其他和官方模板一致文件名的内容又是怎样的呢?这里就只介绍index.php了
<?php
if (!defined('__TYPECHO_ROOT_DIR__')) {
exit;
}
$viewFile = "index";
include 'blade.php';
LOOK,是不是很简单?去掉那个判断,其实就2行代码,甚至if判断都可以不需要,因为在blade.php中也有判断。这里其实就只定义一下$viewFile,代表告诉入口文件,我应该用哪个模板。
结尾
blade的引擎,刚才提到的BladeOne的github上面,有详细的用法,如果你觉得不够详细,也可以看laravel关于blade的文档。
本篇就不做详细介绍了