阅读时间 3 分钟 (666 个单词)

快速开发技术 – 模板中的模板!

你是否曾对 Joomla! 模板的线性方法感到沮丧?我在 Joomla! 中开发了几个网络应用程序,如果能在一个模板中包含另一个模板(例如内部菜单系统、特定组件的特殊页脚等)将非常有用,过去我使用传统的 PHP 包含语句来克服这个限制。虽然这种方法可行,但通过扩展 Joomla! 的 JView 类来支持这种功能,我们可以得到更美观、更易于维护的代码。

注意:本文主要针对为自己的 Joomla! 安装进行定制开发的人。如果你正在进行第三方扩展开发,你需要对你的解决方案更有创造性。

如果你还记得,我几个月前写过一篇文章,介绍了如何扩展 Joomla! 的内部类以减轻重复性任务——如果你以前没有这样做,我建议你阅读原始文章。本文不会重新讨论为什么应该扩展核心类,而是一个考察实际案例,这将使你的开发受益。

在关于扩展 Joomla! MVC 架构的原始文章中,我们在库文件夹中创建了一个名为“Custom”的新库,并创建了一个名为“CustomView”的类,它扩展了 JView。我们今天将使用相同的类,并创建一个名为“loadSubTemplate”的新方法,该方法基于 JView 的“loadTemplate”方法。

那么我们在新方法“loadSubTemplate”中需要做什么?我们的目标是加载一个单独的模板文件并捕获所有输出,而不是直接“echo”——这有几个原因,但这也意味着你需要在子模板需要出现的地方显式地“echo”输出。

由于这些模板将在组件之间共享,我通常将这些子模板分组到视图文件夹中的一个名为“shared”的单独文件夹中。这并不是必需的——我仅仅认为这是一种良好的组织方式,但这里最重要的是一致性:如果你正在开发多个扩展,那么在设计上的长期一致性将为你带来好处,特别是在扩展 Joomla! 框架以适应你的需求时。

以下是“loadSubTemplate”函数的代码,已在Joomla! 1.5上测试。

<?php
class CustomView extends JView
{    
public function loadSubTemplate($name)
{
jimport( 'joomla.filesystem.path' );

//查找子模板文件
$fileToFind  = $this->_createFileName('template', array('name' => $name));
$subTemplate = JPath::find($this->_basePath.DS.'views'.DS.'shared', $fileToFind);

if($this->_subTemplate)
{
//准备捕获子模板输出
ob_start();

//包含子模板
include($subTemplate);

//获取输出
$output = ob_get_contents();

//清理输出缓冲区,以免污染后续渲染
ob_end_clean();

//返回输出
return $output;
}
else
{
return JError::raiseError( 500, '子模板 "' .$name. '" 未找到.' );
}
}
//.....
}
?>

现在,确保你的视图类是扩展CustomView而不是JView,否则我们将无法访问此方法!在你的组件目录结构中,“views”内部创建一个名为“shared”的文件夹,并在其中创建一个名为“subpage1.php”的文件。你可以把这个文件当作普通模板来处理,它将能够访问与普通模板相同的函数和变量。以下是包含子模板的代码。

<?php echo $this->loadSubTemplate('subpage1'); ?>

在进一步操作之前,请注意,我们不会为每个子模板加载单独的视图类 - 我们只加载模板。这意味着你最初创建的视图是整个过程的“主视图”,包括任何子模板。你将能够使用在视图类中使用assign()或assignRef()推送到模板的任何变量。

你可能已经注意到了,我提供的代码不支持模板覆盖。这是一个简单的修复,但我将其留给你作为一个挑战,以正确实现模板覆盖。就这样!你已经成功在模板内嵌套了另一个模板!

在Joomla社区杂志上发表的一些文章代表作者对特定主题的个人观点或经验,可能不代表Joomla项目的官方立场。

0
免费下载Joomla! 2.5 - 指南...
 

评论

已经注册? 登录这里
尚未发表评论。成为第一个发表评论的人

通过接受,您将访问https://magazine.joomla.net.cn/之外第三方提供的服务