第三章 后端开发
创建和管理评论是我们组件的最大任务。我们会加入表单和数据库函数,然后就可以添加评论。
创建数据表
在建立界面来输入评论前,我们需要创建评论的数据表:
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="..."
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》
分享到:
相关推荐
• 第三节:前端服务开发体验 • 系统应用前端开发详解 3 STM32-阿里云IoT 联合课件开发 第四章 . 第二节 后端服务开发 第四章.第二节 内容简介 • 认识后端框架 • Mysql数据库介绍 • MyBatis框架 • SpringBoot...
这个系统为初学者提供了了解和学习Python后端开发,尤其是Django框架的实践机会。在深入探讨相关知识点之前,我们先来了解一下Django的基本概念。 Django是一个高级的、免费的开源Web框架,遵循模型-视图-控制器...
#### 第3章 数据库优化 **数据库索引优化** - **合理设计索引**:根据查询模式创建索引,减少查询时的数据扫描量。 - **定期检查索引使用情况**:确保索引的有效性,必要时进行调整或重建。 **查询优化** - **...
• 第三节:前端服务开发体验 • 前端框架,初始化首个前端项目,组件的使用和数据流转,部署 3 STM32-阿里云IoT 联合课件开发 第四章 . 第三节 前端服务开发 第四章.第三节 内容简介 • 前端基础概念和知识 • 认识...
【标题】:“01-第五章-看病就诊前后端开发【后端】1” 在这一章节中,我们探讨的是一个名为“Open-his”的看病就诊系统的后端开发过程,主要涉及医生排班功能的实现。这个系统是为医疗机构设计的,帮助医生管理和...
第3章 数据库操作技术 第4章 SQL语句应用技术 第5章 复杂查询技术 第6章 数据库高级应用 第3篇 图表统计篇 第7章 JFreeChart绘图基础 第8章 基础图表技术 第9章 扩展图表技术 第10章 基于Cewolf组件的图表编程 第4篇...
第三章 组件设计 第四章 组件分类 第五章 调试 第六章 部署 第二部分 前端组件 第七章 WINDOWS窗体组件 第八章 使用WEBBROWSER组件创建前端 第九章 自定义控件 第十章 用户控件 第十一章 数据库前端 第十...
计算机后端-Java-Java核心基础-第18章 项目实战 18. 项目三TeamView中显示开发团队成
计算机后端-Java-Java核心基础-第18章 项目实战 18. 项目三TeamView中显示开发团队成
计算机后端-Java-Java核心基础-第18章 项目实战 20. 项目三TeamView中删除开发团队成
在《网站项目设计与开发实战(第3章)》中,我们主要探讨的是网站开发过程中的关键技术和实践方法。这是一份由北大青鸟提供的学习资料,旨在帮助开发者深入理解并掌握网站构建的核心技巧。本章的内容可能涵盖了一...
第一部分(第1~3章)介绍了编程语言方面的知识,包括常用语法、类与常用STL的使用。 第二部分(第4~5章)介绍了编译原理和调试方法相关的知识,编译原理包括编译与链接的具体过程、Makefile的编写、目标文件的...
第三章 功能模块详解 3.1 新闻发布与管理 新闻发布模块允许管理员上传和编辑新闻,包括标题、内容、图片和分类等信息。同时,系统需提供新闻审核机制,确保发布的新闻内容合法合规。 3.2 用户注册与登录 用户...
第3章-使用ElementUI开发管理后台-1 第4章 路由与状态管理 第5章 网站前台-活动与招聘 第6章 网站前台-登陆与用户中心 第7章 网站前台-吐槽与问答 后端目录: 第1章-系统设计与工程搭建 第2章-查询与缓存 第3章-...
分享课程——《跟我一起写DApp(转型区块链开发推荐课程)》,课程内容上主要分为3部分:项目...第三章:以太坊go-sdk使用 第四章:后端应用开发实战 第五章:联盟链fisco-bcos使用介绍 第六章:基于fisco-bcos应用实战
在"第三章实验代码"中,我们可以期待看到以下几个关键知识点: 1. 数据结构与算法:作为程序设计的基础,数据结构用于高效存储和组织数据,而算法则是解决问题的具体步骤。在旅游资源管理中,可能会用到如链表、树...
章 后端架构选型、离线及实时计算 在深度学习领域,处理大量数据的能力是至关重要的。随着数据量的急剧增长,单机计算已无法满足高效分析的需求,因此分布式计算成为了解决这一问题的关键。分布式计算允许数据在多...
### 数据库开发实例精粹第三章 #### 章节概述 本章节主要围绕企业级应用中的数据库开发进行深入探讨,旨在通过具体的案例来帮助读者理解如何在实际项目中有效地设计、开发与维护数据库系统。 #### 核心内容解读 ...
深入理解Bootstrap 目录:第1章 入门准备 第2章 整体架构 第3章 CSS布局 第4章 CSS组件 第5章 JavaScript插件 第6章 实战:扩展现有组件 第7章 实战:Win8磁贴组件开发 第8章 实战:组合应用开发 第9章 第三方扩展 ...
总的来说,"JSP项目开发之第7章 物流信息网"涵盖了Web开发中的多个关键环节,包括前端展示、后端处理、数据库设计、安全控制以及用户体验优化。通过学习和实践这个项目,开发者不仅能掌握JSP技术,还能了解到如何...