百度首页 | 百度空间
 
文章列表
 
2008年05月03日 星期六 09:52
http://www.rubyonrails.org/
http://www.ruby-lang.org/zh_CN/
http://www.ruby-lang.org.cn/forums/
http://rubyforge.org/
http://rc.org.cn/
http://www.javaeye.com/blogs/category/Ruby
http://www.mackframework.com/
http://www.artima.com/buzz/community.jsp?forum=123
http://dreamhead.blogbus.com/
http://xruby.javaeye.com/
http://blog.nona.name/
http://bd7lx.javaeye.com/
http://www.javaeye.com/subject/Rails-EveryDay
类别:Ruby | 评论(1) | 浏览()
 
2008年04月27日 星期日 21:36

Steps to Enable Mouse Wheel Scrolling in Ubuntu on VMware

Launch a Terminal

Type:

sudo vim /etc/X11/xorg.conf

Scroll down (it’s not far, perhaps 20 - 30 lines) till you see a block that looks like this:

Section "InputDevice"
Identifier "Configured Mouse"
Driver "vmmouse"
[.. blah blah blah ..]
EndSection

Replace that whole section with this:

Section "InputDevice"
Identifier "Configured Mouse"
Driver "vmmouse"
Option "CorePointer"
Option "Device" "/dev/input/mice"
Option "Protocol" "IMPS/2"
Option "Buttons" "5"
Option "ZAxisMapping" "4 5"
EndSection

类别:Linux | 评论(1) | 浏览()
 
2008年04月24日 星期四 22:39
Ubuntu8.04 已经正式发布了,我已经抢先下载咯。

周末就重装了,现在用的还是7.04呢,就等它正式发布了,呵呵。

P.S. 下个月就轮到Fedora 9 发布啦
类别:Linux | 评论(0) | 浏览()
 
2008年04月20日 星期日 11:59
From: 褪墨

他的成就和人格魅力影响了一代人和整个世界,他就是拥有梦幻般传奇经历的苹果电脑公司的创始人斯蒂夫乔布斯。这位个人电脑领域的梦想家引领并改变了整个计算机硬件和软件产业。

这个精力充沛魅力无限的家伙同时也是一个很会鼓动人心的激励大师,甚至在他的平常对话中,经典的语句也常常脱口而出。

这里摘取了一些他的经典语录,希望这些乔氏语录对你有所帮助:

  • 领袖和跟风者的区别就在于创新。

  • 成为卓越的代名词,很多人并不能适合需要杰出素质的环境。

  • 成就一番伟业的唯一途径就是热爱自己的事业。如果你还没能找到让自己热爱的事业,继续寻找,不要放弃。跟随自己的心,总有一天你会找到的。

  • 并不是每个人都需要种植自己的粮食,也不是每个人都需要做自己穿的衣服,我们说着别人发明的语言,使用别人发明的数学……我们一直在使用别人的成果。使用人类的已有经验和知识来进行发明创造是一件很了不起的事情。

  • 佛教中有一句话:初学者的心态;拥有初学者的心态是件了不起的事情。

  • 我们认为看电视的时候,人的大脑基本停止工作,打开电脑的时候,大脑才开始运转。

  • 我是我所知唯一一个在一年中失去2.5亿美元的人……这对我的成长很有帮助。

  • 我愿意把我所有的科技去换取和苏格拉底相处的一个下午。

  • 活着就是为了改变世界,难道还有其他原因吗?

  • 你的时间有限,所以不要为别人而活。不要被教条所限,不要活在别人的观念里。不要让别人的意见左右自己内心的声音。最重要的是,勇敢的去追随自己的心灵和直觉,只有自己的心灵和直觉才知道你自己的真实想法,其他一切都是次要。

Go to my Gdocument...

类别:默认分类 | 评论(1) | 浏览()
 
2008年04月20日 星期日 00:26
Joomla!扩展开发的翻译是断断续续,有空就翻译一下,也不能保证能定期发布,更不能保证整本书什么时候能翻译完成。
已经将前四章的完整翻译内容制作成PDF,带完整的书签,最重要的是带上了完整的图片,由于图片比较多,所以网上的在线版本没有把图片附上,阅读的时候可能需要参考原英文版的电子书,现在制作的PDF已经附上了书中完整的图片,阅读起来就更加方便了。

PDF下载:《Joomla!扩展开发》PDF版

声明:本书是本人的兴趣而翻译的,完全是免费提供阅读,由于是一次翻译下来的,如果有人觉得质量不怎样或者读不懂的情况,请读者自行翻译。如果有涉及到版权问题,请邮件我,本人会在24小时内删除。
类别:Php | 评论(4) | 浏览()
 
2008年04月19日 星期六 18:08
第四章        前端开发(续二)

分析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

}

一旦你加入了一条或者两条评论后,刷新点评的详细页面,你应该会看到类似以下的页面:

暂时不提供图片显示,请参考《Joomla! extension development》

类别:Php | 评论(0) | 浏览()
 
2008年04月19日 星期六 18:05

第四章        前端开发

既然已经在后端加入了点评的数据,那么现在需要将数据显示到前端。


点评列表

在第二章里,我们访问 http://localhost/joomla/index.php?option=com_reviews,页面与下图相似:

暂时不提供图片显示,请参考《Joomla! extension development》

我们将会在页面显示带有超链接的点评列表,所以我们要预先在后端加上一些点评的数据。首先,在 /component/com_reviews/reviews.php 文件中插入以下的代码:

jimport('joomla.application.helper');

require_once( JApplicationHelper::getPath( 'html' ) );

JTable::addIncludePath(JPATH_ADMINISTRATOR.DS.

                 'components'.DS.$option.DS.'tables');

switch($task)

{

default:

    showPublishedReviews($option);

    break;

}

function showPublishedReviews($option)

{

$db =& JFactory::getDBO();

$query = "SELECT * FROM #__reviews WHERE

          published = '1' ORDER BY review_date DESC";

$db->setQuery( $query );

$rows = $db->loadObjectList();

if ($db->getErrorNum())

{

    echo $db->stderr();

    return false;

}

HTML_reviews::showReviews($rows, $option);

}

与后端的方法相似,require_once( JApplicationHelper::getPath( 'html' ) ); 导进文件reviews.html.php,传递 JPATH_ADMINISTRATOR.DS.'components'.DS.$option.DS.'tables' Jtable::addIncludePath(); 导进数据表类。最后 switch() 语句设置了默认的 case 来显示所有发布的点评。这里的 SQL 语句确保只有发布的点评被选择并且以点评日期的倒序来排序。在刷新页面之前,我们需要在 /component/com_reviews/reviews.html.php 中加入 HTML_reviews 类:

<?php

class HTML_reviews

{

function showReviews($rows, $option)

{

    ?><table><?php

  foreach($rows as $row)

    {

      $link = 'index.php?option=' .

                         $option . '&id=' . $row->id . '&task=view';

      echo

'<tr>

    <td>

      <a href="' . $link . '">' . $row->name . '</a>

    </td>

</tr>';

    }

    ?></table><?php

}

}

?>

showReview() 函数接收一个数据对象的行和一个组件名为参数,使用 <table> 来显示数据,在 <tr> 作循环显示数据结果并在每一行加入链接,保存文件后刷新页面,你会看到相似的页面:

暂时不提供图片显示,请参考《Joomla! extension development》


显示一个点评

如果你没有写任何的代码来处理 “view” “task”,当你单击一条链接后,你看到的是相同的页面,在views.php 中加入以下代码:

function viewReview($option)

{

$id = JRequest::getVar('id', 0);

$row =& JTable::getInstance('review', 'Table');

$row->load($id);

if(!$row->published)

{

    JError::raiseError( 404, JText::_( 'Invalid

                                    ID provided' ) );

}

HTML_reviews::showReview($row, $option);

}

先,用 getVar() 获取请求的 id,它能检查变量的各种攻击。外部的数据处理要很小心,特别是处理公共访问的网站的数据,在我们的代码中统一使用 getVar() 将会提供一个合理的安全层。如果 id 的值丢失或者不合法,第二个参数 0 将会作为默认值提供给 id

然后,我们从后端得到一个数据表类,加载相应 id 的记录后,我们检查选择的记录是否被发布,如果不是发布的,我们用 JError 的成员函数 raiseError() 来输出找不到信息的 404 页面:

暂时不提供图片显示,请参考《Joomla! extension development》

这个检查确保不让用户随便输入 id 来获取点评,而且如果记录不存在也会显示以上的页面。viewReview() 函数会做所有的事情来加载请求的点评,但是我们仍然需要加入代码来调用这个函数,加入下面的高亮代码到 switch() 中:

switch($task)

{

case 'view':

    viewReview($option);

    break;

default:

    showPublishedReviews($option);

    break;

我们也需要在我们的输出类创建一个显示函数,在 reviews.html.php 文件中加入 showReview() 函数到 HTML_reviews

function showReview($row, $option)

{

?>

<p class="contentheading"><?php echo $row->name; ?></p>

<p class="createdate"><?php echo JHTML::Date

                              ($row->review_date); ?></p>

<p><?php echo $row->quicktake; ?></p>

<p><strong>Address:</strong> <?php echo $row->address; ?></p>

<p><strong>Cuisine:</strong> <?php echo $row->cuisine; ?></p>

<p><strong>Average dinner price:</strong> $<?php echo

                           $row->avg_dinner_price; ?></p>

<p><strong>Credit cards:</strong> <?php echo

                               $row->credit_cards; ?></p>

<p><strong>Reservations:</strong> <?php echo

                               $row->reservations; ?></p>

<p><strong>Smoking:</strong> <?php

    if($row->smoking == 0)

    {

      echo "No";

    }

    else

    {

      echo "Yes";

    }

?></p>

<p><?php echo $row->review; ?></p>

<p><em>Notes:</em> <?php echo $row->notes; ?></p>

<?php $link = 'index.php?option=' . $option ; ?>

<a href="<?php echo $link; ?>">&lt; return to the reviews</a>

<?php

}

showReview() 函数传进一个数据库行对象和组件的名字作为参数,这行记录的大部分字段都以HTML格式显示,也包含许多逻辑。Smoking 字段陪赋给合适的 Yes 或者 No 值。调用 JHTML::Date() 来格式化从数据库取出来的时间戳。最后,显示一个可以返回点评列表的链接,保存文件后,再次点击点评的链接,你会看到以下相似的页面:

暂时不提供图片显示,请参考《Joomla! extension development》

创建搜索引擎友好链接

现在浏览我们的点评的链接(http://localhost/joomla/index.

php?option=com_reviews&id=1&task=view&Itemid=1)出现了很长的 GET 字符串,用户肯定都会讨厌看到这么长的链接,更重要的是这样的链接对于搜索引擎收集我们的网站是没有帮助的,搜索引擎对这样的链接更友好:http://www.ourdomain.com/reviews/view/1,为了实现这样的链接,我们定义了一个路由来产生和解析 Search-Engine Friendly (SEF) 即搜索引擎友好的链接,去到后台的菜单“网站 | 配置”,将“搜索引擎友好URL”设置为 Yes,如果你使用的是 Apache 作为你的 Web 服务器并且启用了 mod_rewrite 模块,你也能够设置“使用 mod_rewrite”为 Yes,它会在你的URL中删除 index.php,你所做的设置应该像下图:

暂时不提供图片显示,请参考《Joomla! extension development》

如果你不能设置 mod_rewrite 模块,那么你的URL会像这样:http://www.yoursite.com/index.php/search/engine/friendly/link

       保存你刚才所做的设置,假设你是设置了 mod_rewrite 模块,然后重命名 .htaccess.txt .htaccess,如果你看到提示说你的配置不能写,那么打开根目录下的 configuration.php 文件,设置 $sef 成员变量的值为1即可。


创建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 没有方法可以识别元素的值,那么唯一的方法就是靠我们预先定义好的顺序来做映射。当返回 $segmentsJroute::_() 从它返回每个元素,然后以斜线分隔加到 URL。如果在 $query 中有剩下来的元素会以 GET 方式加到 URL后面。

我们已经有 router.php 来生成 SEF URL,但是我们的组件输出函数还没有使用。打开/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; ?>">&lt; return to the reviews</a>

现在,组件会根据我们在 ReviewsBuildRoute() 设定的模式来生成 SEF URL

类别:Php | 评论(0) | 浏览()
 
2008年03月31日 星期一 17:38
A wonderful editor, see the new Intype as this following:

类别:Computer | 评论(1) | 浏览()
 
2008年03月30日 星期日 20:10
第三章        后端开发 (续2)

这个函数定义了一个名为 adminForm(作为JavaScript应用) 并指向 index.php 的表单,接着显示一个带有 adminlist 类的表格,第一行为表格的头部,第一列是一个复选框 “check all”,它会自动地选择页面上的所有记录。

接着使用传进来的记录数组来循环显示每一行的数组。要注意的是变量 $k,它在每次循环中会在 0 1 之中更换值,它的作用好是用来更换每个 <tr> 的类,从而控制了每行显示的背景色。

大部分的成员变量会直接输出,但是有两个比较特殊,JHTML::(‘grid.id) 函数将返回一个能被后端 JavaScript 识别的复选框,JHTML::_('grid.published') 函数返回一个基于 成员变量 published 的值的图片,当 published 的值是 1 时,将返回打勾的图片,否则返回打“X”的图片。

在表格下面,有四个隐藏的变量,第一个处理 option 的值,以便路由到正确的组件,第二个是 task,它是在提交表单之前以便让工具栏中的 JavaScript 能给它赋值。第三个是 boxchecked,当有任意一行的复选框被选择,boxchecked 被置为 1,当所有行的复选框被清除,boxchecked 被置为 0,它是用来辅助 JavaScript 来处理列表。

当完成了 HTML 代码的输出,最后一步就是更新文件admin.reviews.php中的 switch() 语句,加入下面的高亮代码:

switch($task)

{

case 'add':

editReview( $option );

    break;

case 'save':

    saveReview( $option );

    break;

default:

    showReviews( $option );

    break;

}

在浏览器中输入URL http://localhost/joomla/administrator/index.

php?option=com_reviews,一个相似的页面如下:

暂时不提供图片显示,请参考《Joomla! extension development》

编辑记录

我们将扩展原有的代码来编辑记录,而不是写一个新的功能。在文件 admin.reviews.php 中的 editReview() 函数中用以下的高亮代码来代替:$row=&JTable:getInstance(‘Review’, ‘Table’)

function editReview( $option )

{

$row =& JTable::getInstance('review', 'Table');

$cid = JRequest::getVar( 'cid', array(0), '', 'array' );

$id = $cid[0];

$row->load($id);

当执行 editReview () 函数时,我们取得 TableReview 对象来处理数据,然后会从表单中取得记录ID的数组变量 cid,既然在同一个时间只编辑一条记录,那我们只选择第一个数组元素来加载相应的记录。更新文件 admin.reviews.php 中的 switch() 语句如下:

case 'edit':

case 'add':

editReview( $option );

    break;

你应该要提供能够让用户通过点击来编辑各自的记录的链接。在文件 admin.reviews.html.php HTML_reviews::showReviews() 函数下加入一下高亮的代码:

jimport('joomla.filter.output');

$k = 0;

for ($i=0, $n=count( $rows ); $i < $n; $i++)

{

$row = &$rows[$i];

$checked = JHTML::_('grid.id', $i, $row->id );

$published = JHTML::_('grid.published', $row, $i );

$link = JFilterOutput::ampReplace( 'index.php?option=' .

                  $option . '&task=edit&cid[]='. $row->id );

?>

<tr class="<?php echo "row$k"; ?>">

    <td>

      <?php echo $checked; ?>

    </td>

    <td>

      <a href="<?php echo $link; ?>">

      <?php echo $row->name; ?></a>

    </td>

    <td>

      <?php echo $row->address; ?>

    </td>  

    <td>

      <?php echo $row->reservations; ?>

    </td>

    <td>

      <?php echo $row->cuisine; ?>

    </td>  

    <td>

      <?php echo $row->credit_cards; ?>

    </td>

    <td align="center">

      <?php echo $published;?>

    </td>

为了兼容 XHTML,我们需要确保符号 & 使用 &amp; 来代替,我们使用 ampReplace() 来处理,它是 JFilterOutput 类的成员函数,JFilterOutput 通过调用 jimport(‘joomla.filter.output’) 来加载。Joomla! 提供了许多不同的库,例如 XML处理和RSS输出等。我们使用 jimport() 函数来按需要加载代码,而不是每次加载Joomla! 是都加载所用的库。你需要更新工具栏的代码,首先,去到文件 toolbar.reviews.php 中的 switch() 语句:

case 'edit':

case 'add':

    TOOLBAR_reviews::_NEW();

    break;

既然已经加入“编辑”函数,我们可以在工具栏加入“编辑”按钮,他可以根据每一行记录选择的复选框的来编辑内容,而不单只是点击链接。打开文件 toolbar.reviews.html.php ,添加以下的高亮代码:

TOOLBAR_reviews::_DEFAULT():

JToolBarHelper::unpublishList();

JToolBarHelper::editList();

JToolBarHelper::deleteList();


保存所有的文件,然后刷新页面
http://localhost/joomla/administrator/index.php?option=com_reviews,每一行的记录的name 栏都会带有链接,点击链接你会看到如下的页面:

暂时不提供图片显示,请参考《Joomla! extension development》

你可能已经注意到了在编辑页面的工具栏上有个“应用”按钮,它允许人们保存内容的同时,页面依然保留在编辑的状态,为了是应用按钮生效,需要在文件 admin.reviews.php 中做两个改变,在 switch() 语句中加入一下的高亮代码:

case 'apply':

case 'save':

saveReview( $option, $task );

    break;

saveReview() 函数中加入 $task 参数:

function saveReview( $option, $task )

saveReview() 函数的最后一行更改为如下:

current $task:

switch ($task)

{

    case 'apply':

      $msg = 'Changes to Review saved';

      $link = 'index.php?option=' . $option .

         '&task=edit&cid[]='. $row->id;

      break;

    case 'save':

    default:

      $msg = 'Review Saved';

      $link = 'index.php?option=' . $option;

      break;

}

$mainframe->redirect($link, $msg);


删除记录

增加删除的功能是相当的简单,在文件 admin.reviews.php switch() 语句中加入以下的 case 语句:

case 'remove':

removeReviews( $option );

    break;

当然也要增加 removeReviews() 函数:

function removeReviews( $option )

{

global $mainframe;

$cid = JRequest::getVar( 'cid', array(), '', 'array' );

$db =& JFactory::getDBO();

if(count($cid))

{

    $cids = implode( ',', $cid );

    $query = "DELETE FROM #__reviews WHERE id IN ( $cids )";

    $db->setQuery( $query );

    if (!$db->query())

    {

      echo "<script> alert('".$db->getErrorMsg()."');

      window.history.go(-1); </script>\n";

    }

}

$mainframe->redirect( 'index.php?option=' . $option );

}

我们从表单中再一次取得 cid 变量,然后检查数组中是否有 id 元素。如果有 id 元素,那么用逗号将数组中的元素连成字符串,然后用这个字符串来建立 SQL 语句,在执行过程中,除非发生错误,否则重定向到列表页面。

类别:Php | 评论(0) | 浏览()
 
2008年03月30日 星期日 20:09
第三章        后端开发 (续)

我们的
editReview() 函数根据传过来的数据表行对象,结合了HTML来输出内容。所以editReview() 函数总是用来显示外观,输出内容之前函数包含了一组帮助函数来增强UI元素。


说明:

JHTML::_() 做了什么?

Joomla!提供了很多自动生成HTML元素的函数,如下拉列表、复选框等。为了提供执行的效率,这些函数只有在需要的时候才会读到内存里。这个工作有 _() 函数来完成。


首先,
JFactory::getEditor() 函数返回 HTML 编辑器,JHTML::_(‘behavior.calendar’) 函数会在header 中加入JavaScript CSS ,这是用在评论日期字段中弹出日历的代码:

class HTML_reviews

{

function editReview( $row, $lists, $option )

{

    $editor =& JFactory::getEditor();

    JHTML::_('behavior.calendar');


编辑器对象的成员函数
display() 返回选择的富文本编辑器的HTML ,如果富文本编辑器不存在就返回<textarea> 元素。

            <td>

            <?php

            echo $editor->display( 'quicktake', $row->quicktake ,

                '100%', '150', '40', '5' ) ;

            ?>

          </td>

display() 函数带有以下的参数:表单变量名、值、宽、高、列数和行数。当没有使用HTML编辑器,最后两个参数是 <textarea> 的大小。


处理数据

管理员填完表单并且当即保存按钮后,我们需要保存信息到数据库里。开始,在admin.reviews.php中创建 saveReview() 函数:

function saveReview( $option )

{

global $mainframe;

$row =& JTable::getInstance('review', 'Table');

if (!$row->bind(JRequest::get('post')))

{

echo "<script> alert('".$row->getError()."');

window.history.go(-1); </script>\n";

exit();

}

$row->quicktake = JRequest::getVar( 'quicktake', '', 'post',

'string', JREQUEST_ALLOWRAW );

$row->review = JRequest::getVar( 'review', '', 'post',

'string', JREQUEST_ALLOWRAW );

if(!$row->review_date)

$row->review_date = date( 'Y-m-d H:i:s' );

if (!$row->store())

{

echo "<script> alert('".$row->getError()."');

window.history.go(-1); </script>\n";

exit();

}

$mainframe->redirect('index.php?option=' .

$option, 'Review Saved');

}


    首先,将全局变量
$mainframe 传进来, $mainframe 对象提供很多成员函数来控制 session 变量和 headers。然后将 TableReview 类的一个实例赋值给 $row ,类的名字由第一个参数和第二个参数组合而成,第二个参数是第一个参数的前缀。第二步,使用bind() 成员函数来加载表单中所有变量到 $row 中。

bind() 函数传一个关联数组参数并且要数组的所有元素都要和对象的成员变量完全匹配。为了减少SQL注入的风险,我们使用 Jrequest::get() 来清除 $_POST 的值,这个过程会过滤掉所有能够控制SQL的字符。

       如果 bind() 失败了会弹出一个JavaScript的警告对话框并返回到前一个页面。绑定后就可以直接操作 $row 的成员变量。既然 quicktake review 字段都接受HTML内容,那么它们需要对 bind() 函数进行清除 HTML 的特殊处理。要做这样处理,可以使用 Jrequest 的成员函数 getVar() 并传递表单的变量名、默认值、请求的数组、期望的格式和各自JREQUEST_ALLOWRAW标识。以防评论没有选择日期,我们赋了当前日期给评论日期。

最后,调用 store() 函数,把所有的成员变量都转化成 UPDATE INSERT 语句(由id的值决定是UPDATE还是INSERT)。因为是第一次创建记录,id没有值,所以会构建INSERT 查询语句。如果有SQL错误就返回上一页,通常这一类的SQL错误都是由于 $row 额外的成员变量而没有在数据表类中引起的。那么如果发现有SQL错误,第一时间就是要检查确保你的成员变量的拼写要与数据表的列一致。否则,如果SQL执行成功,将使用 $mainframe redirect() 函数返回组件的页面。

此时,admin.review.php 中的 switch() 语句只是执行添加任务。既然我们已经有了表单和函数,那么添加一个分支来保存我们的数据。添加以下粗体的代码:

switch($task)

{

case 'add':

editReview( $option );

    break;

case 'save':

saveReview( $option );

    break;

}

保存文件后访问这个地址:http://localhost/joomla/administrator/index.

php?option=com_reviews&task=add

你填好表单后点击保存,你能看到类似以下的页面:

暂时不提供图片显示,请参考《Joomla! extension development》

说明:

为什么我们不能点击“新建”按钮?

工具栏的按钮需要有名字为 adminForm 的表单才能有效,既然现在没有表单,那么点击任何的按钮都产生JavaScript错误的。当你加上 adminForm 表单后,按钮马上就生效了。

如果一切正常,那么你可以在 phpMyAdmin 中找到类似以下的数据:

暂时不提供图片显示,请参考《Joomla! extension development》


创建列表

既然我们的管理员不会有访问phpMyAdmin 的权限,我们需要创建显示评论的列表。开始我们在admin.reviews.php中添加以下函数:

function showReviews( $option )

{

$db =& JFactory::getDBO();

$query = "SELECT * FROM #__reviews";

$db->setQuery( $query );

$rows = $db->loadObjectList();

if ($db->getErrorNum()) {

      echo $db->stderr();

      return false;

}

HTML_reviews::showReviews( $option, $rows );

}

这个函数加载了将被显示的数据,我们得到了一个当前数据库连接的引用,然后调用它的成员函数 setQuery() setQuery() 函数带一个 SQL 语句的字符串为参数,但只做存储之后使用而不是立即执行。当调用 loadObjectList() 函数,之前设置的SQL 语句就会执行并返回记录到一个数组中。如果运行过程出现错误,那么将显示错误和停止组件运行。

如果一切正常,那么把记录结果的数组传给 admin.reviews.htlm.php 中的成员函数 showReviews(),如下:

function showReviews( $option, &$rows )

{

?>

<form action="index.php" method="post" name="adminForm">

<table class="adminlist">

    <thead>

      <tr>

        <th width="20">

          <input type="checkbox" name="toggle"

               value="" onclick="checkAll(<?php echo

               count( $rows ); ?>);" />

        </th>

        <th class="title">Name</th>

        <th width="15%">Address</th>

        <th width="10%">Reservations</th>

        <th width="10%">Cuisine</th>

        <th width="10%">Credit Cards</th>

        <th width="5%" nowrap="nowrap">Published</th>

      </tr>

    </thead>

    <?php

    $k = 0;

    for ($i=0, $n=count( $rows ); $i < $n; $i++)

    {

      $row = &$rows[$i];

      $checked = JHTML::_('grid.id', $i, $row->id );

      $published = JHTML::_('grid.published', $row, $i );

      ?>

      <tr class="<?php echo "row$k"; ?>">

        <td>

          <?php echo $checked; ?>

        </td>

        <td>

          <?php echo $row->name; ?>

        </td>

        <td>

          <?php echo $row->address; ?>

        </td>

        <td>

          <?php echo $row->reservations; ?>

        </td>

        <td>

          <?php echo $row->cuisine; ?>

        </td>

        <td>

          <?php echo $row->credit_cards; ?>

        </td>

        <td align="center">

          <?php echo $published;?>

        </td>

      </tr>

      <?php

      $k = 1 - $k;

    }

    ?>

</table>

<input type="hidden" name="option"

                    value="<?php echo $option;?>" />

<input type="hidden" name="task" value="" />

<input type="hidden" name="boxchecked" value="0" />

</form>

<?php

}

类别:Php | 评论(0) | 浏览()
 
     
 
 
文章分类
 
 
 
Ria(25)
 
 
 
 
 
Ruby(2)
 
 
Php(88)
 
Linux(11)
 
Jquery(34)
 
     
 
文章存档
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
     
 
最新文章评论
   

输入框 没用
 
 
 

谢谢提醒,已经通知我朋友了
 
 
     


©2008 Baidu