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最基本的使用例子:
1
|
$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文件进行输出。
如果我们传递一个非空的参数到第二个参数。代码如下:
1
|
$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;
1
2
3
4
5
6
|
<?php
defined (
'JPATH_BASE'
)
or
die
;
?>
<div id=
"helloword"
>
<h1>Hello ZMAX程序人!</h1>
</div>
|
下一步就是在任何的layout文件中进行调用。代码如下:
1
2
3
4
|
<?php
$layout
=
new
JLayoutFile(
'joomla.content.hellowrold'
)
echo
$layout
->render()
?>
|
只需要在前台查看,就可以看到结果了。如果你需要给layout传递参数,那么你可以这样改进代码
1
2
3
4
5
6
|
<?php
defined(
'JPATH_BASE'
)
or
die
;
?>
<div id=
"helloworld"
>
<h1>Hello World <?php
echo
$displayDate
[
"name"
]?></h1>
</div>
|
在调用的时候一需要传递传递一个保护name属相的数组就可以了。
1
2
3
4
5
|
<?php
$layout
=
new
JLayoutFile(
'joomla.content.helloworld'
);
$data
=
array
(
'name'
=>
'Bob'
);
echo
$layout
->render(
$data
);
?>
|
这就完成了最简单的layout的使用了。