第四章 Joomla!扩展开发--前端开发(二)
分析URL段
如果你现在想点击一条点评,那么你会看到类似这样的信息: "Fatal error: Call to undefned function reviewsParseRoute()",我们需要一个能分析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
}
ShowCommentForm() 带有三个参数,分别是组件名、点评的id和名字。如果用户已经登录了,那么名字就自动填充到表单的名字栏,如果没有登录,那么访客就要手工填写。还有一个返回点评组件(及点评列表)的链接。为了确保评论对应到正确的点评,我们传递了当前的点评id review_id,我们想将评论显示在点评的下面,所以在 reviews.php 中加入以下的高亮的代码:
if(!$row->published)
{
JError::raiseError( 404, JText::_( 'Invalid ID provided' ) );
}
HTML_reviews::showReview($row, $option);
$user =& JFactory::getUser();
if($user->name)
{
$name = $user->name;
}
else
{
$name = '';
}
HTML_reviews::showCommentForm($option, $id, $name);
调用输出 html 函数之前,我们需要取得当前登录的用户名(如果有登录的话)。保存文件后刷新页面,如果你在前端登录过,你的屏幕应该显示类似的页面(如果没有登录那么名字一栏显示为空):
暂时不提供图片显示,请参考《Joomla! extension development》
当我们填写和提交表单之前,我们需要加入处理输入数据和插入到数据库。在 reviews.php 文件中加入以下的高亮代码:
switch($task)
{
case 'view':
viewReview($option);
break;
case 'comment':
addComment($option);
break;
default:
showPublishedReviews($option);
break;
}
然后再同一文件中加入 addCommnet() 函数:
function addComment($option)
{
global $mainframe;
$row =& JTable::getInstance('comment', 'Table');
if (!$row->bind(JRequest::get('post')))
{
echo "<script> alert('".$row->getError()."');
window.history.go(-1); </script>\n";
exit();
}
$row->comment_date = date( 'Y-m-d H:i:s' );
$user =& JFactory::getUser();
if($user->id)
{
$row->user_id = $user->id;
}
if (!$row->store())
{
echo "<script> alert('".$row->getError()."');
window.history.go(-1); </script>\n";
exit();
}
$mainframe->redirect('index.php?option=' .
$option . '&id=' . $row->review_id .
'&task=view', 'Comment Added.');
}
大部分的代码我们都应该看起来很熟悉。我们得到一个当前用户的引用,将用户的ID写进数据库。目前,我们允许注册用户和匿名的评论,但现在记录这些信息有助于我们以后跟踪注册用户。当访客没有登录,$user 为空,user_id 字段默认为0。保存数据之前,设置 comment_date 为当前日期和时间。
显示评论
保存你的代码后,你就可以提交表单和返回点评页,但是,页面不会显示任何已经发表的评论。在其它的网站,你经常会看到评论会直接跟在内容的下面,接着就是添加更多评论的表单。我们会沿用这种方式,在 reviews.php 中加入以下高亮的代码以从数据库中返回所有的评论并循环显示出来:
HTML_reviews::showReview($row, $option);
$db =& JFactory::getDBO();
$db->setQuery("SELECT * FROM #__reviews_comments
WHERE review_id = '$id'");
$rows = $db->loadObjectList();
foreach($rows as $row)
{
HTML_reviews::showComment($row);
}
$user =& JFactory::getUser();
也要在 reviews.html.php 中加入相应输出单条的评论的函数:
function showComment($row)
{
?>
<br /><br />
<p><strong><?php echo $row->full_name;
?></strong> <em><?php
echo JHTML::Date($row->comment_date);
?></em></p>
<p><?php echo $row->comment_text; ?></p>
<?php
}
一旦你加入了一条或者两条评论后,刷新点评的详细页面,你应该会看到类似以下的页面: