QeePHP基础教学-建置留言簿之回复功能
2008-04-12 15:19:16
/ 个人分类:教程
今天将上次的留言版扩充,增加的回复的功能。
先看看结果吧:

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="<?php echo $content['email']; ?>">E-mail</a> | <a href="<?php echo $content['website']; ?>">Website</a> | <a class="replyButton" rel="<?php echo $kay ?>">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="<?php echo $this->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="<?php echo $content['guestbook_id'] ?>" /> </form> </div> </div> <?php } ?> </div>
<div id="postForm"> <h2>Leave a message</h2> <form id="guestbook" action="<?php echo $this->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; }
|
请加入下面这段Javascrīpt来控制回复窗体的出现:
|
<scrīpt type="text/javascrīpt" src="http://code.jquery.com/jquery-latest.js"></scrīpt> <scrīpt type="text/javascrīpt"> $(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(); }); }); </scrīpt>
|
我们这次的目标 - 回复功能也已经完成,QeePHP帮我们简化了许多事情,表关联也只要多定义三行(里面还有一堆缩排),就能够自行处理。
原文地址:http://qeeify.com/index.php/2008/03/26/qeephp-tutoeais-guestbook-2.html
更多信息,请访问 FleaPHP/QeePHP 开源开发框架官方网站:http://www.fleaphp.org/。
相关阅读:
- 应该是一个好下属而不是一个好上司 (chenz1117, 2008-3-30)
- 开博有喜 (knowledgebase, 2008-4-01)
- [精华] Perl 中的正则表达式 (chenz1117, 2008-4-09)
- 在 FleaPHP 应用程序中使用第三方组件 (qeeify, 2008-4-12)
- QeePHP 版 MVCBlog (qeeify, 2008-4-12)
- 开始创建 QeePHP 应用程序(1) (qeeify, 2008-4-12)
- 开始创建 QeePHP 应用程序(2) (qeeify, 2008-4-12)
- 开始创建 QeePHP 应用程序(3) (qeeify, 2008-4-12)
- 开始创建 QeePHP 应用程序(4) (qeeify, 2008-4-12)
- QeePHP基础教学-建置留言簿 (qeeify, 2008-4-12)
论坛模式
推荐
收藏
等级(0)
编辑
管理
查看(735)
评论(0)
TAG:
教程