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/


TAG: 教程

Open Toolbar