天天看点

第三章 Joomla!扩展开发--后端开发(续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; ?>" target="_blank" rel="external nofollow" >

      <?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 语句,在执行过程中,除非发生错误,否则重定向到列表页面。

转载于:https://www.cnblogs.com/vicenteforever/articles/1629966.html