登录 注册

登录

问题 Joomla!扩展开发第五章来了--模块开发

更多
2008年08月20日 23:48 #1 作者: huayicai
几个月后的第五章终于出来了,呵呵

hi.baidu.com/andycai 第一至五章PDF版下载
(第一至五章)
Joomla!扩展开发--目录
hi.baidu.com/andycai/blog/item/2036d816aa31601c972b430e.html
Joomla!扩展开发--概况
hi.baidu.com/andycai/blog/item/f0dbae1ed8f92f1b4134171b.html
Joomla!扩展开发--组件开发入门
hi.baidu.com/andycai/blog/item/236d2e97b65fe96954fb9663.html
Joomla!扩展开发--后端开发
hi.baidu.com/andycai/blog/item/4b8bbefdd2693c1209244d00.html
hi.baidu.com/andycai/blog/item/75582038a1200520b8998f02.html
hi.baidu.com/andycai/blog/item/442ad2b4f9fcc2778bd4b203.html
Joomla!扩展开发--前端开发
hi.baidu.com/andycai/blog/item/ed6df0dce691a6a4cd116682.html
hi.baidu.com/andycai/blog/item/c22ec280b9aa10d29123d98c.html

第五章
模块开发
我们有一个有效的系统来管理点评和评论。但是访客需要到组件去浏览点评。网站的首页可能会有一些介绍网站的文章。但是如果我们可以直接显示点评的内容,那应该是挺不错的。模块可以帮你,它可以获取数据并显示在页面上的任何地方。这一章我们将会覆盖模块开发的以下主题:
在数据库注册模块
获取和和设置参数
使用帮助类集中数据访问和输出
使用布局(layouts)来选择显示选项
显示最近的点评
显示随机的点评


在数据库注册模块
与组件一样,我们需要在数据库注册模块以便可以在后端引用并有效的使用,命令行中输入以下SQL 语句:
INSERT INTO jos_modules (title, ordering,

position, published, module, showtitle, params)

VALUES ('Restaurant Reviews', 1, 'left', 1,

'mod_reviews', 1, 'style=simple\nitems=3\nrandom=1');
如果使用 phpMyAdmin,可以输入如下图:
暂时不提供图片显示,请参考《Learning Joomla! extension development》 或者中文PDF版

如果你在 jos_modules 表中增加了记录后并在前端的页面刷新,可是你看到页面没有变化,即使在 published字段中设置了1,但新增的模块没有在首页出现。要修正这个问题,我们要去到后端(后台)菜单“扩展” |“模块管理”,然后单击“Restaurants Reviews”链接,在菜单指派下,选择“全部”并单击保存。
暂时不提供图片显示,请参考《Learning Joomla! extension development》 或者中文PDF版

那么在前端(前台)首页的左边栏应该会出现以下相似的页面:
暂时不提供图片显示,请参考《Learning Joomla! extension development》 或者中文PDF版

创建和配置一个基本模块
模块是很简单也很灵活的,你能够创建一个模块只是输出一些静态的文本或是一个像天气报告一样的远程数据库查询。尽管你可以创建复杂的模块,但是最适合是显示数据和简单的表格。你不应该为复杂的记录和 session 管理使用模块,如果要做的话,应该使用组件或者是插件。要创建我们的点评模块,需要在/modules 目录下创建 mod_reviews 文件夹,同时创建 mod_reviews.php文件。首先,我们会创建一个基本的模块,用来显示最近的点评。在 mod_reviews.php 中加入以下的代码:
<?php
defined('_JEXEC') or die('Restricted access');
$items = $params->get('items', 1);
$db =& JFactory::getDBO();
$query = "SELECT id, name FROM #__reviews WHERE

published = '1' ORDER BY review_date DESC";
$db->setQuery( $query, 0, $items );
$rows = $db->loadObjectList();
foreach($rows as $row)
{

echo '<a href="' . JRoute::_('index.php?option=com_reviews&id='

. $row->id . '&task=view') . '">' . $row->name .

'</a>
';
}
?>
保存文件后刷新首页,然后会看到类似以下的页面:

暂时不提供图片显示,请参考《Learning Joomla! extension development》 或者中文PDF版
但模块加载时,$param 对象会自动可用,可以获取和设置参数。但我们增加一行记录到 jos_modules ,params 字段包含三个值:一个是 items (值是3),一个是 style (值是 simple),最后一个是 random (值是1)。
我们通过 get 函数将参数 items 的值赋给$items,如果参数值不存在,默认赋值1。如果你想覆盖模块的参数值,可以使用set($name,$value)。获取一个数据库对象的引用后,我们写一个查询来从 jos_reviews 中选择 id 和name,并且以发布日期的倒序排序。我们使用 setQuery() 中的第二和第三个参数来生成一个 limit语句,它会自动地加到查询中。这也能确保使用数据库类型的正确语法。一旦查询被创建,我们会加载所有相关数据库记录并给每条点评提供一个链接。
使用帮助
我们不想我们的模块只简单的显示点评的链接,显示链接的同时显示点评的摘要是很有帮助的,或者显示随机的点评。但按我们现在的代码不适合处理这些问题。但我们可以集中数据功能到一个帮助类中,在 /modules/mod_reviews 下创建 helper.php 文件并加入以下代码:
<?php
defined('_JEXEC') or die('Restricted access');
class modReviewsHelper
{


function getReviews(&$params)

{

$items = $params->get('items', 1);

$db =& JFactory::getDBO();

$query = "SELECT id, name, quicktake FROM #__reviews

WHERE
published = '1' ORDER BY review_date DESC";

$db->setQuery( $query, 0, $items );

$rows = $db->loadObjectList();

return $rows;

}

function renderReview(&$review, &$params)

{

$link = JRoute::_

("index.php?option=com_reviews&task=view&id=" .

$review->id);

require(JModuleHelper::getLayoutPath

('mod_reviews', '_review'));

}
}
?>
函数 getReviews() 实现了和原来的模块相同的数据库操作,不同的是它只返回记录(rows),这个方法可以让我们从显示的逻辑中分离数据库功能。Quicktake 列被加入到查询中,用来集合更长的点评显示格式的必要的内容。
我们打算用 renderReview()来输出单条点评,要创建点评的链接,我们传递index.php?option=com_reviews& task=view&id=和 点评的 id 进 Jroute::_() 来生成搜索引擎友好的链接。最后我们用 require() 和 JModuleHelper的成员函数 getLayoutPath() 来包含将要创建的 _review 模板。



尝试不同的布局
帮助类本身没有产生任何的输出,相反,方法 renderReview() 格式化链接并调用 JmoduleHelper 的getLayoutPath() 方法来包含名为 _reviews 的布局文件。在 /modules/mod_reviews 下创建文件夹tmpl,在 tmpl 里创建 _review.php 并加入以下的代码:
<?php defined('_JEXEC') or die('Restricted access'); ?>
<a href="<?php echo $link ?>"><?php echo $review->name; ?></a>

_review以下划线开头是一种约定,表示只提供给内部使用,而不提供给管理员。附加的内部布局,我们可以根据不同的现实选项创建其他的布局。先创建 default,在 /modules/mod_reviews/tmpl 下增加 default.php 并加入以下的代码:
<?php
defined('_JEXEC') or die('Restricted access');
foreach ($list as $review){

modReviewsHelper::renderReview($review, $params);
}
?>
注意这个布局的是通过一个点评的列表,调用帮助类函数来显示一条点评,然后加载 _review 模板。使用相同的方法我们也可以创建无序列表的布局,在 /modules/mod_reviews/tmpl 下增加 bulleted.php 并加入以下代码:
<?php defined('_JEXEC') or die('Restricted access'); ?>
<ul>
<?php
foreach ($list as $review)
{

echo "<li>";

modReviewsHelper::renderReview($review, $params);

echo "</li>";
}
?>
</ul>
无序列表使用相同的基本逻辑作为默认的布局,唯一的不同是它使用无序列表来显示内容。通过帮助函数来加载点评布局,确保链接的格式是一致的。
现在我们有两个不同的显示选项和一个帮助类,但是没有代码在模块中使用,打开 mod_reviews.php 并用以下的代码代替它原来的内容:
<?php
defined('_JEXEC') or die('Restricted access');
require(dirname(__FILE__).DS.'helper.php');
$list = modReviewsHelper::getReviews($params);
require(JModuleHelper::getLayoutPath('mod_reviews'));
?>
首先 require() 调进帮助类,第二步,获取最近的点评,最后,我们使用 getLayoutPath()来显示布局。当第二个参数没有被指定,那默认值是 default。保存文件并刷新首页,现在可以看到以下的截屏。回到mod_reviews.php,编辑 getLayoutPath() 以便使用 bulleted 布局来代替默认:
require(JModuleHelper::getLayoutPath('mod_reviews', 'bulleted'));
保存并刷新后,页面如下:

暂时不提供图片显示,请参考《Learning Joomla! extension development》 或者中文PDF版

如果我们在每个链接下面显示一部分点评的内容,感觉会更好。回到 /modules/mod_reviews/tmpl/_review.php 并加入以下的代码:
<a href="<?php echo $link ?>"><?php echo $review->name;

?></a>

<p>"<?php echo $review->quicktake ?>"</p>

在后端编辑你的点评,在 Quicktake 字段输入一些内容,刷新浏览器你会看到一下的变化:

暂时不提供图片显示,请参考《Learning Joomla! extension development》 或者中文PDF版

回到 mod_reviews.php 并设置 getLayoutPath() 的第二个参数为 default,保存后刷新浏览器,你会看到如下页面:

暂时不提供图片显示,请参考《Learning Joomla! extension development》 或者中文PDF版

组合起来
我们的模块在就突出最近晚餐的选择是非常好的,而我们的访客可能需要看到以往的点评,让我们来调整一下。用以下高亮的代码来代替原来 $list 这一行:
<?php
defined('_JEXEC') or die('Restricted access');
require(dirname(__FILE__).DS.'helper.php');
$random = $params->get('random', 0);
if($random)
{

$list = modReviewsHelper::getRandomReview();
}
else
{

$list = modReviewsHelper::getReviews($params);
}
require(JModuleHelper::getLayoutPath

('mod_reviews', 'default'));
?>
代替简单的取出所有的点评,我们现在使用基于模块的参数来取数据。$params 对象会自动的转换成全局的变量,它预载了模块的设置。我们使用get() 来将 random 参数的值赋给 $random,如果没有值就赋默认值 0。下一步我们测试 $random的值,如果它是非零的话,getRandomReview() 会被调用,函数等一会会加入到 modReviewsHelper中。否则,我们使用之前的方法获取点评。
打开 helper.php 并加入以下的函数到 modReviewsHelper 类:
function getRandomReview()
{

$db =& JFactory::getDBO();

$query = "SELECT id, name, quicktake FROM #__reviews";

$db->setQuery( $query );

$rows = $db->loadObjectList();

$i = rand(0, count($rows) - 1 );

$row = array( $rows[$i] );

return $row;
}
首先取得当前数据库连接的引用,查询语句从 jos_reviews 表中加载 id、name 和 quicktake三列的所有行记录。所有记录都加载到变量 $rows 中,利用 rand() 函数在 $rows 中随机取出一行,$row变量被赋予一个数组,数组包含一个元素,就是前面取出来的随机记录,把 $row[$i]包含到一个数组里面是必要的,因为在输出的时候这是期望的格式。
保存文件并刷新浏览器,然后重复地刷新,如果运气够好的话,你会看到随机的出现单条的点评。

暂时不提供图片显示,请参考《Learning Joomla! extension development》 或者中文PDF版
下列用户已致谢:: jerry_law

登录 或者   注册一个会员帐号 来参与讨论

更多
2008年08月21日 07:52 #2 作者: Joomla之门
很好!

建议将整个教程打包为一个 PDF 文件,欢迎上传到本站的下载栏目,在下载页面我会保留你的姓名、链接及版权声明。谢谢!

付费下载 Joomla 3 扩展汉化版: 我要付费支持 Joomla 之门!

登录 或者   注册一个会员帐号 来参与讨论