应用程序试图在加载模板之前将所有有用的数据传递给模板。您可能想要访问未提供开箱即用的内容。
本节将描述如何在模板加载之前hook到应用程序中,以便向模板提供额外的数据。
这些技术要求理解PHP和应用程序的体系结构。本指南只提供所需的基本代码。您可能需要进一步查看应用程序的文档,以完全理解这里的代码示例。
在模板显示之前,它会触发一个事件,TemplateManager::显示
,您可以将其挂接起来,以便在模板加载之前将额外的数据传递给它。
下面的例子将创建一个新的Smarty变量,{$ myCustomData}
,可在所有模板中使用。
类DocsThemePlugin扩展ThemePlugin{/** *初始化主题*/公共函数初始化(){HookRegistry::注册(“TemplateManager:显示”,数组(这个美元,“loadTemplateData”));}/** *调用TemplateManager::display钩子时触发。* * @param string $hookname * @param array $args [$templateMgr, $template, $sendContentType, $charset, $output] */公共函数loadTemplateData(hookName美元,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] */公共函数loadTemplateData(hookName美元,args美元){//获取TemplateManagertemplateMgr美元=args美元[0];//如果启用了最新的3个公告,则附加它们美元的请求=应用程序::得到()->getRequest();美元的杂志=美元的请求->getJournal();如果(美元的杂志&&美元的杂志->getSetting(“enableAnnouncements”){announcementDao美元=DAORegistry::getDAO(“AnnouncementDAO”);美元的公告= &announcementDao美元->getNumAnnouncementsNotExpiredByAssocId(ASSOC_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] */公共函数loadTemplateData(hookName美元,args美元){//获取TemplateManager和模板文件名templateMgr美元=args美元[0];美元的模板=args美元[1];//如果没有加载正确的模板,则不要做任何事情如果(美元的模板! =“前端/页面/ article.tpl”){返回假;}//如果启用了最新的3个公告,则附加它们美元的请求=应用程序::得到()->getRequest();美元的杂志=美元的请求->getJournal();如果(美元的杂志&&美元的杂志->getSetting(“enableAnnouncements”)){announcementDao美元=DAORegistry::getDAO(“AnnouncementDAO”);美元的公告= &announcementDao美元->getNumAnnouncementsNotExpiredByAssocId(ASSOC_TYPE_JOURNAL,美元的杂志->getId(),3.);templateMgr美元->分配(“公告”,美元的公告->toArray());}返回假;}}
值得注意的是只有一些模板是直接用这个钩子调用的。这些是位于下面的顶级模板/前端/页面/ < template_name >。tpl
.您会发现这些模板文件加载了额外的子模板。但这些不是通过钩子传递的。每次加载页面时,只能挂接到主模板调用。