如何使用JLayout来提高代码的重用性

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的使用了。


转载于:https://my.oschina.net/u/2330387/blog/483308

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值