第三章 Joomla!扩展开发--后端开发
来源:互联网 发布:手机淘宝历史版本6.6.0 编辑:程序博客网 时间:2024/05/18 09:08
创建和管理评论是我们组件的最大任务。我们会加入表单和数据库函数,然后就可以添加评论。
创建数据表
在建立界面来输入评论前,我们需要创建评论的数据表:
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 文件并输入一下代码:
<?phpdefined('_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,用以下的代码替换原来的内容:
<?phpdefined( '_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文件并加入以下代码:
<?phpdefined( '_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="..." onclick="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》
- 第三章 Joomla!扩展开发--后端开发
- 第三章 Joomla!扩展开发--后端开发(续1)
- 第三章 Joomla!扩展开发--后端开发(续2)
- 第一章 Joomla!扩展开发:概况
- 第四章 Joomla!扩展开发--前端开发(一)
- 第四章 Joomla!扩展开发--前端开发(二)
- Joomla扩展组件开发文档(component)
- Joomla扩展插件开发文档(plugin)
- Joomla扩展模块开发文档(module)
- 第二章 Joomla 组件开发入门
- Joomla开发--JDatabase
- joomla!团队开发!
- 开发Joomla的顺序
- Joomla 开发1
- Joomla模块开发
- joomla下面插件开发
- joomla模板开发
- Joomla插件开发规范
- java读写文件大全
- 如何在WINDOWS(XP)下使用copSSH配置GIT服务器+TortiseGIT客户端
- 类变量本身就是指针
- PHP安全防范!
- struts2+Spring3+hibernate3.3整合配置
- 第三章 Joomla!扩展开发--后端开发
- treeMap
- Running OpenStack in Production: Part 1: Hardware
- scu 四川大学oj 2745 零序列 典型线段树
- ssh最新整合配置(struts2.2.1+ hibernate3.6+spring3.0.5)
- 鼠标的划线问题
- scu四川大学oj 3099 A Simple Problem with Integers
- BW 心得与经验分享
- axvisual.com被PakH3XOr黑客黑掉。。。【他说:我不在这个方法删除任何文件,请提高你的安全管理】