QeePHP基础教学-建置留言簿之回复功能
时间:2008-04-12 来源:qeeify
今天将上次的留言版扩充,增加的回复的功能。
先看看结果吧:
1.建立数据表
CREATE TABLE IF NOT EXISTS `reply` (
`reply_id` int(10) NOT NULL AUTO_INCREMENT,
`guestbook_id` int(10) NOT NULL,
`content` text COLLATE utf8_unicode_ci NOT NULL,
`created` int(10) NOT NULL,
PRIMARY KEY (`reply_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ;
2.修改上次的数据表(这是全新建立)
如果要使用升级的话,请将上次的主键id改成主键guestbook_id
执行SQL语法:
CREATE TABLE IF NOT EXISTS `guestbook` (
`guestbook_id` int(10) NOT NULL AUTO_INCREMENT,
`nickname` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
`email` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,
`website` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,
`content` text COLLATE utf8_unicode_ci NOT NULL,
`created` int(10) NOT NULL DEFAULT '0',
PRIMARY KEY (`guestbook_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ;
3.新增控制器方法
我们在\app\controller\default_controller.php新增以下代码:
protected function actionReply() {
if($this->request->isPOST()) {
$create = new Reply();
$create->guestbook_id = $this->request->id;
$create->nickname = htmlspecialchars($this->request->nickname);
$create->content = htmlspecialchars($this->request->content);
$create->save();
return new QResponse_Redirect($this->url->make());
}else{
echo "Error...";
}
}
4.修改视图
我们将\app\view\default\index.php修改成以下代码:
h1>::Guestbook::/h1>
div id="messageList">
h2>Message List/h2>
?php foreach($guestbook as $kay => $content){ ?>
div class="content">
div>span class="nickname">Nickname:?php echo $content['nickname']; ?>/span>
[ ?php echo date("Y-m-d", $content['created']);?> ]
| a href="">E-mail/a>
| a href="">Website/a>
| a class="replyButton" rel="">Reply/a>/div>
div>?php echo $content['content']; ?>/div>
?php if(isset($content['reply'])) { ?>
?php foreach($content['reply'] as $reply) { ?>
div class="reply">?php echo $reply['content']; ?>/div>
?php } ?>
?php } ?>
div class="replyForm">
h2>Reply/h2>
form action="url->make(null, 'Reply');?>" method="post">
textarea id="content" name="content" rows="3" cols="60">/textarea>
input type="submit" value="Submit" />input name="id" type="hidden" value="" />
/form>
/div>
/div>
?php } ?>
/div>
div id="postForm">
h2>Leave a message/h2>
form id="guestbook" action="url->make(null, 'Create');?>" method="post">
p>label for="nickname">Nickname/label>input id="nickname" name="nickname" type="text" size="20" />/p>
p>label for="email">E-mail/label>input id="email" name="email" type="text" size="20" />/p>
p>label for="website">Website/label>input id="website" name="website" type="text" size="20" />/p>
p>textarea id="content" name="content" rows="10" cols="65">/textarea>/p>
p>input type="submit" value="Submit" />/p>
/form>
/div>
5.新增模型
将以以下方法覆盖\app\table\guestbook.php原本之方法。
内容如下:
static function __define() {
return array(
// 用什么数据表保存对象
'table_name' => 'guestbook',
// 指定数据表记录字段与对象属性之间的映射关系
// 没有在此处指定的字段,QeePHP 会自动设置将字段映射为对象的可读写属性
'fields' => array(
// 主键应该是只读,确保领域对象的“不变量”
'guestbook_id' => array('readonly' => true),
// 对象创建时间应该是只读
'created' => array('readonly' => true),
/**
* 添加对象间的关联
*/
'reply' => array(
'has_many' => 'Reply',
),
),
);
}
新增:\app\table\reply.php
?php
class Reply extends QDB_ActiveRecord_Abstract {
/**
* 返回对象的定义
*
* @static
*
* @return array
*/
static function __define() {
return array(
// 用什么数据表保存对象
'table_name' => 'reply',
// 指定数据表记录字段与对象属性之间的映射关系
// 没有在此处指定的字段,QeePHP 会自动设置将字段映射为对象的可读写属性
'fields' => array(
// 主键应该是只读,确保领域对象的“不变量”
'guestbook_id' => array('readonly' => true),
// 对象创建时间应该是只读
'created' => array('readonly' => true),
/**
* 添加对象间的关联
*/
'reply' => array(
'has_many' => 'Reply',
),
),
);
}
/**
* 开启一个查询,查找符合条件的对象或对象集合
*
* @static
*
* @return QDB_ActiveRecord_Select
*/
static function find() {
$args = func_get_args();
return parent::__find(__CLASS__, $args);
}
/**
* 实例化所有符合条件的对象,并调用这些对象的 destroy() 方法,返回成功删除的对象的数量
*
* @static
*
* @param mixed $where
*
* @return int
*/
static function destroyWhere() {
$args = func_get_args();
return parent::__destroyWhere(__CLASS__, $args);
}
/**
* 对数据进行验证,返回所有未通过验证数据的名称错误信息
*
* @param array $data
* @param array|string $fields
*
* @return array
*/
static function validate(array $data, $props = null) {
return parent::__validate(__CLASS__, $data, $props);
}
}
?>
7.修改模板
修改模板:\app\view\_layouts\default_layout.php,将下面的样式写在default_layout.php。
CSS:
body {
width: 600px;
margin: 10px auto;
font-size: 0.85em;
background: #EEF3F7;
overflow: scroll;
}
h1 {
padding-left: 15px;
font-size: 3em;
}
h2 {
margin-bottom: 5px;
padding-bottom: 3px;
padding-left: 10px;
background: #EFF7FF;
border-bottom: 2px solid #96C2F1;
border-right: 2px solid #96C2F1;
font-size: 2em;
}
#messageList {
margin: 15px;
}
#messageList .content {
margin-bottom: 7px;
padding: 3px;
background: #EFF7FF;
border: 1px solid #96C2F1;
border-bottom: 2px solid #96C2F1;
border-right: 2px solid #96C2F1;
}
#messageList .content div:first-child {
background: #B2D3F5;
}
#messageList .reply {
margin-bottom: 7px;
padding: 3px;
background: #EFEFEF;
border: 1px solid #96C2F1;
border-bottom: 2px solid #96C2F1;
border-right: 2px solid #96C2F1;
}
.nickname {
width: 200px;
display: block;
float: left;
}
#postForm,
#replyForm {
margin: 15px;
}
#postForm form,
#replyForm form {
background: #EFF7FF;
padding: 0 3px;
border: 1px solid #96C2F1;
border-bottom: 2px solid #96C2F1;
border-right: 2px solid #96C2F1;
}
#postForm label,
#replyForm label {
width: 60px;
margin-right: 5px;
float: left;
display: block;
text-align: right;
}
input, textarea{
border: 1px solid;
}
请加入下面这段JavaScript来控制回复窗体的出现:
script type="text/javascript" src="http://code.jquery.com/jquery-latest.js">/script>
script type="text/javascript">
$(document).ready(function(){
$(".replyForm").hide();
$(".replyButton").toggle(function(){
var id = $(this).attr('rel');
$(".replyForm:eq(" + id + ")").show();
}, function(){
var id = $(this).attr('rel');
$(".replyForm:eq(" + id + ")").hide();
});
});
/script>
我们这次的目标 - 回复功能也已经完成,QeePHP帮我们简化了许多事情,表关联也只要多定义三行(里面还有一堆缩排),就能够自行处理。
原文地址:
http://qeeify.com/index.php/2008/03/26/qeephp-tutoeais-guestbook-2.html
更多信息,请访问 FleaPHP/QeePHP 开源开发框架官方网站:
http://www.fleaphp.org/
。
相关阅读 更多 +
排行榜 更多 +