joseym / li3_smarty
Smarty PHP 插件用于 Lithium PHP ... 如果你喜欢这类东西
Requires
- php: >=5.3
- joseym/li3_installer: master
This package is not auto-updated.
Last update: 2024-09-14 14:23:52 UTC
README
为 Lithium PHP 框架添加 Smarty 模板引擎支持。
我无法声称自己是 smarty 或 PHP 模板语言的粉丝,但我的雇主需要使用 smarty。
所以,唉,这里有一个插件可以正确地运行 lithium 通过 smarty。
安装
有几种方法可以获取并使用此项目
直接克隆
-
将插件克隆/下载到你的应用的
libraries
目录。 -
这对于开发来说很棒,但需要你手动去这个目录拉取任何未来的更改
创建子模块
在你的应用的 libraries
目录中输入以下内容
git submodule add https://github.com/joseym/li3_smarty.git li3_smarty
你还可以将其添加到你的应用路径中,只需确保将其放置在
libraries/li3_smarty
而不是li3_smarty
。
这是管理多个插件的好方法。如果你以这种方式添加所有库,那么你可以通过从你的库目录(或你创建了子模块的地方)运行此命令来保持所有库的最新状态
git submodule update
这会出去拉取你已加载到子模块中的所有仓库。 方便!
Composer
这是一个新的项目,Lithium 还没有 Packagist 软件包(希望很快会有)
这并不意味着我们不能使用它!这仅仅意味着我们可能需要额外走几步才能让 Composer 与 Lithium 一起运行。 请参阅 @daschl 的这篇非常有教育意义的文章,并让我们尽最大努力使 Lithium 尽可能易于使用!
修改你的项目的 composer.json
文件
{ "require": { ... "joseym/li3_smarty": "master" ... } }
将其添加到库中
通过向你的应用的 config/bootstrap/libraries.php
添加以下内容来告诉你的应用加载插件
<?php Libraries::add('li3_smarty'); ?>
这具有与子模块类似的好处,但是与 composer 一起,你不需要了解太多关于插件的信息,只需它的供应商名称(joseym
)、库名称(li3_smarty
)以及你想要的分支(master
)。Packagist 处理其余部分!
配置
一切应该预先配置好以直接工作。然而:如果你觉得需要添加额外的模板路径或将编译的模板存储在其他地方,你也可以这样做!只需将选项数组传递给 Libraries::add 调用即可
<?php Libraries:add('li3_smarty', array( 'compile_dir' => PATH_TO_COMPILE_DIRECTORY, 'cache_dir' => PATH_TO_CACHE_DIRECTORY, 'template_dir' => array( ADDITIONAL_TEMPLATE_DIRECTORY ), 'plugin_dir' => array( ADDITIONAL_PLUGIN_DIRECTORY ) )); ?>
请注意,编译和缓存目录需要可由你的 Apache(或你使用的任何 Web 服务器)写入
使用
此插件是为了模仿核心 Li3 变量分配而编写的 - 因此你可以像平常一样传递变量到视图中
一些示例代码
PagesController.php
<?php ... class PagesController extends \lithium\action\Controller { public function home(){ $var = "test variable!"; $this->set(compact('var')); } ?>
然后在你的视图中
home.html.tpl
I want to display my {$var}
这将渲染 "我想显示我的 test variable!
"
你可能已经注意到视图以 .tpl 结尾,这是插件解析模板为 smarty 模板所必需的。
继承
可以说,smarty 提供的最有用的一件事是其模板继承。
此插件将视图视为布局,因此你的视图需要扩展适当的布局才能正确渲染。
将其视为
$this->content()
的反向,你告诉你的视图使用哪个布局,而不是在哪个布局中包含视图。
default.html.tpl
注意:布局也是
.tpl
文件
<html> <head>...</head> <body> {block name="content"}{/block} </body> </html>
home.html.tpl
{extends file="default.html.tpl"} {block name="content"} <p>This is the view content that needs to be passed to <code>default.html.tpl</code></p> <p>Also ... I want to display my {$var}</p> {/block}
现在 https:///home
会渲染为
<html> <head>...</head> <body> <p>This is the view content that needs to be passed to <code>default.html.tpl</code></p> <p>Also ... I want to display my `test variable!`</p> </body> </html>
扩展 Smarty
如果您想给smarty添加非常酷的功能,那么您可以通过编写一个smarty插件来实现。
如果您选择编写一些这样的插件,可以将它们放置在以下位置,它们将被自动包含并准备好在您的布局/视图中使用:
extensions/plugins
- 在您的lithium应用程序内部li3_smarty/plugins
- 我会在这里添加我认为应该与这个lithium插件一起分发的插件。
我不会深入讲解如何或为什么编写这些,如果您想了解更多关于这个功能的信息,请查看smarty插件文档(它们是为smarty编写的辅助工具)。
Lithium 辅助工具
这 ... 是有点棘手的。
Smarty禁用了您在视图中使用PHP的能力,并且不再支持“escape”块函数,该函数允许您添加原始PHP。因此,需要额外的努力来将Lithium PHP视图功能暴露给smarty。
丢失Lithium PHP辅助工具就像失去两只脚和四个手指,包括两只大拇指 ... 我必须想出一种方法来将辅助工具暴露给smarty模板。
我已经编写了一个名为helper
的smarty插件,它将所有Lithium辅助方法暴露给smarty模板。
辅助工具使用
Lithium 链接辅助工具
<?= $this->html->link('My Github', 'http://www.github.com/joseym', array('class' => 'external')); ?>
Smarty 链接辅助工具
... <body> {helper init="html:link" title="My Github" href="http://www.github.com/joseym" options=['class' => 'external']} </body> ...
上述两个都会返回 <a href="http://www.github.com/joseym" class="external">My Github</a>
辅助工具要求
我将为您分解smarty辅助工具方法
- helper :
required
这将调用helper smarty插件 - init :
required
这是您要使用的类:方法;在我的例子中,我正在使用html
类和link
辅助工具 -html:link
- title : optional 这以及任何其他参数都是可选的,并取决于您使用的Lithium辅助工具
- href : optional 与
title
相同,它是smarty辅助工具方法的可选参数,但对于Lithium html链接辅助工具是必需的。
注意:辅助工具参数可以命名为任何名称,我们也可以像
name
和url
一样命名title
和href
。唯一必须像上面那样命名的键名是init
和options
- options : optional 一个关联数组,包含可选参数,如Lithium中使用
如果您传递了一个选项数组,则其键必须称为
options
,以便smarty插件正确使用。
这就足够了,我已经测试了几种不同的核心辅助工具,它们按预期工作,如果您发现某个辅助工具无法使用此方法正常工作,请记录一个问题,我将尽快尝试添加支持。
使用元素
同样,由于Smarty使模板中无法使用PHP变得不可能,这意味着为了在由Smarty提供的视图中调用Lithium elements
,需要将元素渲染方法暴露给smarty。我们再次通过扩展smarty通过插件函数来完成此操作。
元素使用
假设您有一个menu
元素,您需要传递用户数据。为了这个例子,我们将元素文件命名为menu.html.tpl
,因为它是一个HTML/Smarty文件。
Lithium 元素
我假设您已经了解元素,它们非常方便,它们是非常有用的。
<?= $this->view()->render(array('element' => 'menu'), array('user' => $currentUser)); ?>
Smarty 元素
... <body> {element file="menu" data=['user' => $currentUser]} </body> ...
关于Smarty元素的几点说明
-
文件参数是元素名称,文件扩展名
.html.tpl
会自动添加。 -
data
数组用于从视图传递变量到元素。这是可选的。
考虑以下情况:元素 + Smarty 模板继承。您在主布局中定义一个默认元素,并用 smarty 的
{block}
包围它,然后,在模板链的后面添加不同的元素或更新当前元素的参数。功能强大!
协作
一如既往,我欢迎您的合作,使事情“更加完美”,如果您觉得需要,请进行分叉并贡献。