JLayout需要解决的问题就是代码的重用,同时也要提供更好覆盖重写机制。要理解JLayout,首先需要明白我们现在的情况究竟遇到了什么问题。在开发的时候,我需要在前台后台公用一些代码,或者在两个模块之间公用一些代码。一个典型的例子就是打印。

 

曾经我做个一个案例,客户需要将前台提交的表单在后台能够打印。这就需要前台后台公用代码了。在这种情况下,一般的解决方法就是copy代码。另外一个常见的问题就是在后台开发中,很多组件都需要过滤功能,基本上代码都是一样。但是每次都得copy代码,感觉非常不爽。这就是layout需要解决的问题。

 

直到3.0版本,布局文件还是只能在一个视图中使用,不能通用。在3.0后(包括3.0)Joomla增加了JLayout类接口去解决这个问题。它封装了数据和布局,因此可以使得一个layout可以在多个地方使用。joomla后台的过滤部分就是一个很好的例子。

JLayout包含一个接口和两个类:

JLayout接口定义了escape(过滤)和render(渲染)这两个方法,这个很JView类很相似。

JLayoutBase实现了一个基本的layout类,在这个类中是硬编码的layout????

JLayoutFile 这个是最经常使用的类,这个类负责包装和渲染某一个文件中的布局,并且在输出之前进行了模板的输出覆盖。

下面是JLayoutFile最基本的使用例子:

$layout = new JLayoutFile('joomla.sidbars.submenu' ,$basePath = null); $sidebarHtml = $layout->render($data);

 

上面的代码创建了JLayoutFile对象,然后执行render方法,render方法中将需要输出的参数传递进行。第一个参数‘joomla.sidebar.submenu’用来指定文件的路径,最后的submenu部分就是文件的名称。在joomla.siderbars之前都是相对路径。你可以在第二个参数中设置一个基本路径。如果$basePath没有设置,那么joomla将会在/layouts目录下搜索布局文件。在上面的例子中,joomla会从/layouts/joomla/sidebars/目录中查找submenu.php文件进行输出。

如果我们传递一个非空的参数到第二个参数。代码如下:

$layout = new JLayoutFile('my_layout',$basePath=JPATH_ROOT."/components/com_something/layouts") $html = $layout->render($data);

那么系统就会加载JPATH_ROOT.'/components/com_something/layouts/'目录下的my_layout.php文件了。


使用JLayout对模板输出覆盖的影响

当执行render方法的时候,JLayoutFIle会检查是否在当前的模板下面是否有一个layouts目录。以我们上面的代码为例。如果你想在模板中重载sidebar布局,那么你就应该在你模板的html目录下面新建一个layouts目录,并且在下面新建joomla/sidebars/submenu.php文件。


 

Layout的存储位置

理论上layout文件可以储存在任何地方,只要你给出正确的路径即可。然后,为了避免可能的命名冲突问题,我们有如下建议:

默认存储你的layout文件在你的组件的admin目录下。比喻 /administrator/componets/com_zmaxlogin/layouts

如果扩展并没有后台,那么你就在你的扩展的更目录下新建一个layouts。/moduels/mod_zmaxqqonline/layouts

另外需要注意,这个文件夹的名称必须为layouts,这个是硬编码的。在更目录下的layouts文件夹是系统使用的。最后有一个建议,请在你的组件的layouts下面新建一个你的组件的标示符。比喻com_zmaxlogin的admin目录下 应该有一个layouts/com_zmaxlogin/.....之所以要这样做,主要是为了更加方便设计者设计模板。有了这个标示符,设计者可以精确的控制每一个组件的设计。


如何定义layout

 定义layout的代码比较简单。下面是一个例子

新建一个文件/layouts/joomla/content/helloworld.php;

<?php
defined ('JPATH_BASE') or die;
?>
<div id="helloword">
<h1>Hello ZMAX程序人!</h1>
</div>

 下一步就是在任何的layout文件中进行调用。代码如下:

<?php 
$layout = new JLayoutFile('joomla.content.hellowrold')
echo $layout->render()
?>

 只需要在前台查看,就可以看到结果了。如果你需要给layout传递参数,那么你可以这样改进代码

<?php 
defined('JPATH_BASE') or die;
?>
<div id="helloworld">
<h1>Hello World <?php echo $displayDate["name"]?></h1>
</div>

 在调用的时候一需要传递传递一个保护name属相的数组就可以了。

<?php
$layout      = new JLayoutFile('joomla.content.helloworld');
$data = array('name' => 'Bob');
echo $layout->render($data);
 ?>

 这就完成了最简单的layout的使用了。



收藏
0个人 收藏

关注Joomla中国微信公众号,随时获得最新的Joomla新闻资讯!