创建URL段
在 Joomla!的组件和模块中创建内部链接的时候会调用 Jroute::_() 函数,这个函数将链接作为参数并且返回一个 SEF(搜索引擎友好)的链接。要创建SEF 链接,JRoute::_() 首先将链接分析成数组,然后删除 option 元素并将它的值加到新的URL 的第一段,这函数会在与option 的值相同目录内寻找 router.php,如果找到,将文件包含进来并调用以组件名开头以BuildRoute()结束的函数,我们这个例子是调用 ReviewsBuildRoute()。要创建ReviewsBuildRoute(),打开/component/com_reviews 目录,创建 router.php文件,然后加入以下的代码:
<?php
defined( '_JEXEC' ) or die( 'Restricted access' );
function ReviewsBuildRoute(&$query)
{
$segments = array();
if (isset($query['task']))
{
$segments[] = $query['task'];
unset($query['task']);
}
if(isset($query['id']))
{
$segments[] = $query['id'];
unset($query['id']);
}
return $segments;
}
?>
Jroute::_()函数决定了正在处理的链接是餐厅的点评,ReviewBuildRoute()函数会被调用并传递一个分析URL后返回的数组参数。为了创建SEF链接,我们需要返回URL段的有序数组。首先,赋值一个空数组给变量$segments;下一步检查数组 $query 是否存在 task元素,如果存在,我们把 task 的值加入到 $segments中的第一个元素,然后将它从 $query 中删除;下一步我们对 id做相同的操作;最后,我们返回 $segments 以便JRoute::_() 能创建 URL。
要得到正确的 SEF URL,这个函数的编写有两个很重要的方法要注意的,首先,变量 $query 要以引用传递(在变量前加上&)。因为我们创建段时,我们会从$query 中删除已经处理的元素,任何在 $query 中剩下来的元素都会被处理回到 URL中,也就是会以原来的 GET 元素出现在URL。如果我们没有以引用来传递,使用 unset() 只会影响局部的拷贝,URL中所有的elements 都会出现在 SEF$segments 后面。既然 SEF URL没有方法可以识别元素的值,那么唯一的方法就是靠我们预先定义好的顺序来做映射。当返回$segments,Jroute::_()从它返回每个元素,然后以斜线分隔加到 URL。如果在 $query 中有剩下来的元素会以 GET方式加到 URL后面。
我们已经有 router.php 来生成SEFURL,但是我们的组件输出函数还没有使用。打开/components/com_reviews/reviews.html.php文件并注意HTML_reviews的成员函数 showReviews() 中的高亮代码:
foreach($rows as $row)
{
$link = JRoute::_('index.php?option=' . $option . '&id=' .
$row->id . '&task=view');
echo '<tr><td><a href="' . $link . '">' .
$row->name . '</a></td></tr>';
}
同样也注意 HTML_reviews::showReview() 中的高亮代码:
<p><em>Notes:</em> <?php echo $row->notes; ?></p>
<?php $link = JRoute::_('index.php?option=' . $option); ?>
<a href="<?php echo $link; ?>">< return to the reviews</a>
现在,组件会根据我们在 ReviewsBuildRoute() 设定的模式来生成 SEF URL。
分析URL段
如果你现在想点击一条点评,那么你会看到类似这样的信息: "Fatal error: Call to undefned functionreviewsParseRoute()",我们需要一个能分析URL的函数。回到/components/com_reviews/router.php 并加入一下的函数:
function ReviewsParseRoute($segments)
{
$vars = array();
$vars['task'] = $segments[0];
$vars['id'] = $segments[1];
return $vars;
}
Joomla! 收到页面的请求后,它会调用 BuildParseRoute() 并传递一个相关的URL 段的数组参数。首先,初始化一个$vars 数组来存贮将要返回的变量,然后设置vars的元素 task 和 id 的值,分别与$segments的第一和第二段的值对应,最后返回这个数组。以这种方式,对剩下来的代码整个路由的过程都是透明的。
现在可以点击页面的点评链接,注意他们的URL会像这样:
http://www.oursite.com/reviews/view/1 或者
http://www.oursite.com/index.php/reviews/view/1 如果URL像这样
http://www.oursite.com/component/reviews/view/1 这只是一个 non_SEF URL
添加评论
我们说某间餐厅很好(或者不好),大多数访客都会相信我们的话。然而,可能有一些会不同意的。为什么不给他们一个机会评论一下他们在这间餐厅的经验呢?我们需要一个地方来存贮他们的评论,根据一下的SQL命令来操作:
CREATE TABLE 'jos_reviews_comments' (
'id' int(11) NOT NULL auto_increment,
'review_id' int(11) NOT NULL,
'user_id' int(11) NOT NULL,
'full_name' varchar(50) NOT NULL,
'comment_date' datetime NOT NULL,
'comment_text' text NOT NULL,
PRIMARY KEY
('id')
)
如果你想用 phpMyAdmin 也可以:
暂时不提供图片显示,请参考《Joomla! extension development》
暂时不提供图片显示,请参考《Joomla! extension development》
暂时不提供图片显示,请参考《Joomla! extension development》
我们将加入另一个数据库类来处理基本的功能。既然我们已经在 administrator/components/
com_reviews/tables 中有点评类了,那么在这里再增加第二个。创建 comment.php,加入以下的代码:
<?php
defined('_JEXEC') or die('Restricted access');
class TableComment extends JTable
{
var $id = null;
var $review_id = null;
var $user_id = null;
var $full_name = null;
var $comment_date = null;
var $comment_text = null;
function __construct(&$db)
{
parent::__construct( '#__reviews_comments',
'id', $db );
}
}
?>
我们已经建立地方来存贮评论了,现在需要增加一个表单来让访客来填写。打开 reviews.html.php 文件并在HTML_reviews中加入以下的函数代码:
function showCommentForm($option, $review_id, $name)
{
?>
<br /><br />
<form action="index.php" method="post">
<table>
<tr>
<td>
<strong>Name:</strong>
</td>
<td>
<input class="text_area" type="text" name="full_name"
id="full_name" value="<?php echo $name; ?>" />
</td>
</tr>
<tr>
<td>
<strong>Comment:</strong>
</td>
<td>
<textarea class="text_area" cols="20" rows="4"
name="comment_text" id="comment_text"
style="width:500px"></textarea>
</td>
</tr>
</table>
<input type="hidden" name="review_id"
value="<?php echo $review_id; ?>" />
<input type="hidden" name="task"
value="comment" />
<input type="hidden" name="option"
value="<?php echo $option; ?>" />
<input type="submit" class="button" id="button"
value="Submit" />
</form>
<?php
}
[
本帖最后由 andycai 于 2008-4-19 18:32 编辑 ]