第三章 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>
            {1}lt;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》


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值