查看文章 |
第三章 后端开发 (续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,我们需要确保符号 & 使用 & 来代替,我们使用 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(); 暂时不提供图片显示,请参考《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 语句,在执行过程中,除非发生错误,否则重定向到列表页面。 |