第三章 Joomla!扩展开发:后端开发
創建和管理評論是我們組件的最大任務。我們會加入表單和數據庫函數,然后就可以添加評論。
創建數據表
在建立界面來輸入評論前,我們需要創建評論的數據表:
CREATE TABLE 'jos_reviews'
(
'id' int(11) NOT NULL auto_increment,
'name' varchar(255) NOT NULL,
'address' varchar(255) NOT NULL,
'reservations' varchar(31) NOT NULL,
'quicktake' text NOT NULL,
'review' text NOT NULL,
'notes' text NOT NULL,
'smoking' tinyint(1) unsigned NOT NULL default '0',
'credit_cards' varchar(255) NOT NULL,
'cuisine' varchar(31) NOT NULL,
'avg_dinner_price' tinyint(3) unsigned NOT NULL default '0',
'review_date' datetime NOT NULL,
'published' tinyint(1) unsigned NOT NULL default '0',
PRIMARY KEY ('id')
);
創建數據表類
我們能夠編寫獨立的函數來處理評論數據的添加、更新和刪除。我想這些功能你都不想重復地編寫。幸運地是,Joomla!團隊已經為你做了。JTable 這個類提供了處理單個數據表的記錄的創建、讀取、更新和刪除操作。要利用JTable,我們需要寫一個指定到jos_reviews表的擴展。在administrator/components/com_reviews 文件夾下,創建一個tables文件夾,然后在里面創建 review.php 文件并輸入一下代碼:
<?php
defined('_JEXEC') or die('Restricted access');
class TableReview extends JTable
{
var $id = null;
var $name = null;
var $address = null;
var $reservations = null;
var $quicktake = null;
var $review = null;
var $notes = null;
var $smoking = null;
var $credit_cards = null;
var $cuisine = null;
var $avg_dinner_price = null;
var $review_date = null;
var $published = null;
function __construct(&$db)
{
??? parent::__construct( '#__reviews', 'id', $db );
}
}
?>
我們繼承了JTable類,并加入數據表的所有字段作為類的成員變量,成員變量都初始化為null。然后覆蓋類的構造函數 __construct() ,__construct() 會帶有一個數據庫對象為參數,并調用父類的構造函數,以數據表名(以#__為前綴)、主鍵和數據庫對象為參數值。
說明:
為什么要使用 #__ 為數據表的前綴?
在Joomla!編寫查詢和定義JTable 擴展時,使用 #__ 代替 jos_。Joomla! 執行查詢時會自動將 #__ 替換為 管理員選擇的數據庫前綴。這樣的好處是可以在同一個數據庫中運行多套Joomla!。你隨便修改數據庫的前綴也不用修改代碼。
?
?????? TableReview?類繼承了 bing()、store()、load() 和 delete() 等函數,這四個函數可以讓你不用寫一行的SQL 就可以管理數據庫的記錄。
?
創建評論表單
???????創建好了數據表,我們需要有一個友好的界面來增加評論。第一步,然我們創建一個表單來輸入數據,我們想從邏輯中分離HTML,配置表單的必要代碼會寫在 admin.reviews.php中,admin.reviews.html.php中則包含實際的HTML代碼。打開admin.reivews.php,用以下的代碼替換原來的內容:
<?php
defined( '_JEXEC' ) or die( 'Restricted access' );
require_once( JApplicationHelper::getPath( 'admin_html' ) );
JTable::addIncludePath(JPATH_COMPONENT.DS.'tables');
switch($task)
{
case 'add':
editReview( $option );
??? break;
}
function editReview( $option )
{
$row =& JTable::getInstance('Review', 'Table');
$lists = array();
$reservations = array(
??? '0' => array('value' => 'None Taken',
?????????? 'text' => 'None Taken'),
??? '1' => array('value' => 'Accepted',
?????????? 'text' => 'Accepted'),
??? '2' => array('value' => 'Suggested',
?????????? 'text' => 'Suggested'),
??? '3' => array('value' => 'Required',
?????????? 'text' => 'Required'),
);
$lists['reservations'] = JHTML::_('select.genericList',
$reservations, 'reservations', 'class="inputbox" '. '', 'value',
?????????????????????????????????????? 'text', $row->reservations );
$lists['smoking'] = JHTML::_('select.booleanlist', 'smoking',
????????????????????????????? 'class="inputbox"', $row->smoking);
$lists['published'] = JHTML::_('select.booleanlist', 'published',
??????????????????????????? 'class="inputbox"', $row->published);
HTML_reviews::editReview($row, $lists, $option);
}
?>
???????我們使用require_once( JApplicationHelper::getPath( 'admin_html' ) ) 來包含admin.reviews.html.php文件。getPath() 函數帶一個字符串參數并返回與組件文件一致的絕對路徑。盡管我們沒有指定組件名,但是它會自動包含適當的文件,即使是改變了組件名也一樣。使用require_once() 確保文件只被包含一次。
?????? addIncludePath()?成員函數會包含我們的數據表類,addIncludePath() 會自動包含所有我們定義在tables目錄下的數據表類,太強大了,是吧?文件名和路徑的構建都是跨平臺兼容的。Joomla!設置JPATH_COMPONENT 為后端代碼的絕對路徑。DS常量是指定的操作系統的目錄分隔符。switch() 語句檢查 $task 變量,然后基于它的值來運行適當的函數。最后,editReview() 函數準備了一些HMTL元素然后傳給顯示函數 HTML_reviews::editReview()。
???????現在我們創建 admin.reviews.html.php文件并加入以下代碼:
<?php
defined( '_JEXEC' ) or die( 'Restricted access' );
class HTML_reviews
{
function editReview( $row, $lists, $option )
{
??? $editor =& JFactory::getEditor();
??? JHTML::_('behavior.calendar');
??? ?>
??? <form action="index.php" method="post"?
???????????????? name="adminForm" id="adminForm">
????? <fieldset class="adminform">
??????? <legend>Details</legend>
??????? <table class="admintable">
??????? <tr>
????????? <td width="100" align="right" class="key">
??????????? Name:
????????? </td>
????????? <td>
??????????? <input class="text_area" type="text" name="name"?
?????????????? id="name" size="50" maxlength="250"?
?????????????? value="<?php echo $row->name;?>" />
????????? </td>
??????? </tr>
??????? <tr>
????????? <td width="100" align="right" class="key">
??????????? Address:
????????? </td>
????????? <td>
??????????? <input class="text_area" type="text" name="address"?
?????????????? id="address" size="50" maxlength="250"?
?????????????? value="<?php echo $row->address;?>" />
????????? </td>
??????? </tr>
??????? <tr>
????????? <td width="100" align="right" class="key">
??????????? Reservations:
????????? </td>
????????? <td>
??????????? <?php
??????????? echo $lists['reservations'];Chapter 3
??????????? ?>
????????? </td>
??????? </tr>
??????? <tr>
????????? <td width="100" align="right" class="key">
??????????? Quicktake:
????????? </td>
????????? <td>
??????????? <?php
??????????? echo $editor->display( 'quicktake', $row->quicktake ,?
????????????????????????????????????? '100%', '150', '40', '5' ) ;
??????????? ?>
????????? </td>
??????? </tr>
??????? <tr>
????????? <td width="100" align="right" class="key">
??????????? Review:
????????? </td>
????????? <td>
??????????? <?php
??????????? echo $editor->display( 'review', $row->review ,?
???????????????????????????????????? '100%', '250', '40', '10' ) ;
??????????? ?>
????????? </td>
??????? </tr>?
??????? <tr>
????????? <td width="100" align="right" class="key">
??????????? Notes:
????????? </td>
????????? <td>
??????????? <textarea class="text_area" cols="20" rows="4"?
?????????????? name="notes" id="notes" style="width:500px"><?php echo?
?????????????? $row->notes; ?></textarea>
????????? </td>
??????? </tr>
??????? <tr>
????????? <td width="100" align="right" class="key">
??????????? Smoking:
????????? </td>
????????? <td>
??????????? <?php
??????????? echo $lists['smoking'];
??????????? ?>Back-End Development
????????? </td>
??????? </tr>
??????? <tr>
????????? <td width="100" align="right" class="key">
??????????? Credit Cards:
????????? </td>
????????? <td>
??????????? <input class="text_area" type="text" name="credit_cards"?
?????????????? id="credit_cards" size="50" maxlength="250"?
?????????????? value="<?php echo $row->credit_cards;?>" />
????????? </td>
??????? </tr>
??????? <tr>
????????? <td width="100" align="right" class="key">
??????????? Cuisine:
????????? </td>
????????? <td>
??????????? <input class="text_area" type="text" name="cuisine"?
?????????????? id="cuisine" size="31" maxlength="31"?
?????????????? value="<?php echo $row->cuisine;?>" />
????????? </td>
??????? </tr>
??????? <tr>
????????? <td width="100" align="right" class="key">
??????????? Average Dinner Price:
????????? </td>
????????? <td>
??????????? $<input class="text_area" type="text"?
???????????????? name="avg_dinner_price"?
???????????????? id="avg_dinner_price" size="5" maxlength="3"?
???????????????? value="<?php echo $row->avg_dinner_price;?>" />
????????? </td>
??????? </tr>
??????? <tr>
????????? <td width="100" align="right" class="key">
??????????? Review Date:
????????? </td>
????????? <td>
??????????? <input class="inputbox" type="text" name="review_date"?
?????????????? id="review_date" size="25" maxlength="19"?
?????????????? value="<?php echo $row->review_date; ?>" />Chapter 3
??????????? <input type="reset" class="button" value="..."?
?????????????? οnclick="return showCalendar('review_date',?
?????????????? 'y-mm-dd');" />
????????? </td>
??????? </tr>
??????? <tr>
????????? <td width="100" align="right" class="key">
??????????? Published:
????????? </td>
????????? <td>
??????????? <?php
??????????? echo $lists['published'];
??????????? ?>
????????? </td>
??????? </tr>
??????? </table>
????? </fieldset>
????? <input type="hidden" name="id"?
??????? value="<?php echo $row->id; ?>" />
????? <input type="hidden" name="option"?
??????? value="<?php echo $option;?>" />
????? <input type="hidden" name="task"?
??????? value="" />
??? </form>
??? <?php
}
}
?>
在瀏覽器地址欄輸入http://localhost/joomla/administrator/index.
php?option=com_reviews&task=add,然后你會看到:
暫時不提供圖片顯示,請參考《Joomla! extension development》
我們的 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="" οnclick="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
}
這個函數定義了一個名為 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();
保存所有的文件,然后刷新頁面?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/ikodota/articles/2220911.html
總結
以上是生活随笔為你收集整理的第三章 Joomla!扩展开发:后端开发的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学会这十九招就会成为股市高手
- 下一篇: 六种方式实现hibernate查询