天天看點

第三章 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