跳转到目录

向模板传递数据

应用程序试图在加载模板之前将所有有用的数据传递给模板。您可能想要访问未提供开箱即用的内容。

本节将描述如何在模板加载之前hook到应用程序中,以便向模板提供额外的数据。

这些技术要求理解PHP和应用程序的体系结构。本指南只提供所需的基本代码。您可能需要进一步查看应用程序的文档,以完全理解这里的代码示例。

向每个模板传递数据

在模板显示之前,它会触发一个事件,TemplateManager::显示,您可以将其挂接起来,以便在模板加载之前将额外的数据传递给它。

下面的例子将创建一个新的Smarty变量,{$ myCustomData},可在所有模板中使用。

DocsThemePlugin扩展ThemePlugin/** *初始化主题*/公共函数初始化()HookRegistry::注册“TemplateManager:显示”数组这个美元“loadTemplateData”));/** *调用TemplateManager::display钩子时触发。* * @param string $hookname * @param array $args [$templateMgr, $template, $sendContentType, $charset, $output] */公共函数loadTemplateDatahookName美元args美元//获取TemplateManagertemplateMgr美元args美元0];//将一个自定义的数据块附加到TemplateManagermyCustomData美元“这是我的定制数据。它可以是任何PHP变量。”templateMgr美元->分配“myCustomData”myCustomData美元);返回

也许您希望在站点的页脚中显示最新的公告,因此希望每个模板都能使用该数据。下面的例子添加了一个新的Smarty变量,{$公告},每个模板。

DocsThemePlugin扩展ThemePlugin/** *初始化主题*/公共函数初始化()HookRegistry::注册“TemplateManager:显示”数组这个美元“loadTemplateData”));/** *调用TemplateManager::display钩子时触发。* * @param string $hookname * @param array $args [$templateMgr, $template, $sendContentType, $charset, $output] */公共函数loadTemplateDatahookName美元args美元//获取TemplateManagertemplateMgr美元args美元0];//如果启用了最新的3个公告,则附加它们美元的请求应用程序::得到()->getRequest();美元的杂志美元的请求->getJournal();如果美元的杂志&&美元的杂志->getSetting“enableAnnouncements”announcementDao美元DAORegistry::getDAO“AnnouncementDAO”);美元的公告= &announcementDao美元->getNumAnnouncementsNotExpiredByAssocIdASSOC_TYPE_JOURNAL美元的杂志->getId(),3.);templateMgr美元->分配“公告”美元的公告->toArray());返回

将数据传递给单个模板

但您可能不想让每个模板都可以使用该数据。也许你只是想在你的article.tpl模板。

我们可以检查美元的模板这是在决定附加公告之前调用的。

DocsThemePlugin扩展ThemePlugin/** *初始化主题*/公共函数初始化()HookRegistry::注册“TemplateManager:显示”数组这个美元“loadTemplateData”));/** *调用TemplateManager::display钩子时触发。* * @param string $hookname * @param array $args [$templateMgr, $template, $sendContentType, $charset, $output] */公共函数loadTemplateDatahookName美元args美元//获取TemplateManager和模板文件名templateMgr美元args美元0];美元的模板args美元1];//如果没有加载正确的模板,则不要做任何事情如果美元的模板! =“前端/页面/ article.tpl”返回//如果启用了最新的3个公告,则附加它们美元的请求应用程序::得到()->getRequest();美元的杂志美元的请求->getJournal();如果美元的杂志&&美元的杂志->getSetting“enableAnnouncements”))announcementDao美元DAORegistry::getDAO“AnnouncementDAO”);美元的公告= &announcementDao美元->getNumAnnouncementsNotExpiredByAssocIdASSOC_TYPE_JOURNAL美元的杂志->getId(),3.);templateMgr美元->分配“公告”美元的公告->toArray());返回

值得注意的是只有一些模板是直接用这个钩子调用的。这些是位于下面的顶级模板/前端/页面/ < template_name >。tpl.您会发现这些模板文件加载了额外的子模板。但这些不是通过钩子传递的。每次加载页面时,只能挂接到主模板调用。

Baidu