【问题标题】:How to use AJAX in an MVC - php Blog? - adding comments dynamically如何在 MVC 中使用 AJAX - php Blog? - 动态添加评论
【发布时间】:2012-08-04 12:25:59
【问题描述】:

我写了一个posts.php 页面,其中显示了某个帖子及其 cmets,使用户能够为该帖子动态添加新评论。

我想使用 Ajax 实现 *"submit_comment"*,但我真的不知道如何在 MVC 中实现。

这是我的 Posts.php:

<script type="application/javascript" src="Ajax/addComment.js"> </script> 
src="../views/Ajax/addComment.js"> </script> <title> Posts
(View)</title> </head>

<body> <div id="main"> <div class="container"> <?=$data['header'];?>

<div id="content">  
    <!-- Main Post -->
    <div class="content-background">
    <h2> <?=$data['title'];?></h2>
    <h4> <?=$data['date'];?> </h4>
    <p> <?=$data['content'];?></p>
    </div>

    <div id="form-content">
      <form name="commentForm" method="post">
      Enter your name:  <input type="text" name="username" id="username">&nbsp; <br />
      Enter your comment: </br> <textarea name="comment" id="comment" cols="10" rows="10"> </textarea> <br />

      <input value='Submit' type='button'  onclick='JavaScript:commentRequest2("<?=$data['id']?>")'
name='submit'>      


      </form>
    </div>
    <div id="commentArea">
        <?=include_once("comments_area.php");?>
    </div><!-- end commentArea -->


    </div>  </div> </div>


</body> </html>

这是我的 Posts_Controller.php:

<?php
/**
 * This file handles the retrieval and serving of posts posts
 */
class Posts_Controller
{
    /**
     * This template variable will hold the 'view' portion of our MVC for this 
     * controller
     */
    public $template = 'posts';

    /**
     * This is the default function that will be called by router.php
     * 
     * @param array $getVars the GET variables posted to index.php
     */
    public function main(array $getVars)
    {
        $postsModel = new Posts_Model;

            }
            else{
        //get the post
        $post = $postsModel->get_main_post("`id`='", $getVars['id'], "LIMIT", "1");
        //get the comments
        $comments = $postsModel->get_comments("`postID`='", $getVars['id']);
        //create a new view and pass it our template
        $header = new View_Model('header_template');
        $view = new View_Model($this->template);


        //assign post data to view
        $view->assign('header', $header->render(FALSE));
        $view->assign('title' , $post['title']);
        $view->assign('content' , $post['content']);
        $view->assign('date' , $post['date']);
        $view->assign('by' , $post['added_by']);
        $view->assign('id' , $post['id']);
        $view->assign('commentsArr' , $comments);
        $view->render();
            }
    }
}

这是我的 Posts_Model.php:

<?php
/**
 * The Posts Model does the back-end heavy lifting for the Posts Controller
 */
class Posts_Model
{
    /**
     * Holds instance of database connection
     */
    private $db;

    public function __construct()
    {
        $this->db = new MysqlImproved_Driver;
    }

    /**
     * Fetches article based on supplied name
     * 
     * @param string $author
     * 
     * @return array $article
     */
    public function get_main_post($cond1, $var1, $cond2 ="", $var2 = "")
    {        
        //connect to database
        $this->db->connect();

        //sanitize data
        $var1 = $this->db->escape($var1);
        $var2 = $this->db->escape($var2);
        $cond = $cond1.$var1."'"; 
        $cond.= " ".$cond2." ".$var2;  

        //prepare query
        $this->db->prepare
        (
            "
            SELECT *  FROM `posts`
            WHERE $cond
            ;
            "
        );

        //execute query
        $this->db->query();

        $article = $this->db->fetch('array');

        return $article;
    }


    public function get_comments($cond1, $var1, $cond2 ="", $var2 = "")
    {        
        //connect to database
        $this->db->connect();

        //sanitize data
        $var1 = $this->db->escape($var1);
        $var2 = $this->db->escape($var2);
        $cond = $cond1.$var1."'"; 
        $cond.= " ".$cond2." ".$var2;  

        //prepare query
        $this->db->prepare
        (
            "
            SELECT *  FROM `comments`
            WHERE $cond
            ;
            "
        );

        //execute query
        $this->db->query();
        $resultArr[0] = 0;
        $i = 1;
        while( $result = $this->db->fetch('array')){
            $resultArr[$i] = $result;
            $i++;
        }
        $resultArr[0] = $i;

        return $resultArr;
    }

}
?>

我应该在哪里添加 addComment.js? (V、M 还是 C?) addComment 应该做什么?调用什么 URL/函数?

有什么建议吗?例子?

【问题讨论】:

    标签: php ajax model-view-controller


    【解决方案1】:

    在您的控制器中创建一个函数,允许您将 javascript 文件添加到视图中。然后在你的控制器中调用它。它将文件路径添加到数组中,并在视图显示之前将其分配给模板。

    $view->addJavascript('/Ajax/addComment.js');
    

    或者你可以使用

    $js_files[] = '/Ajax/addComment.js';
    $view->assign('js_files', $js_files);
    

    那么在你看来你可以使用

    <?
       foreach($data['js_files'] as $file)
       {
           echo '<script type="application/javascript" src="'.$file.'"> </script>'
       }
    ?>
    

    不确定您的路由在您的应用程序中的结构,但您会创建一个类似于 main 用于 ajax 功能。如果您提到更多关于 URL 如何路由到控制器的信息,那么我可能会提出更有根据的建议。

    【讨论】:

      【解决方案2】:

      在你尝试学习如何使用 MVC 之前,你应该学习如何编写语义 HTML 和不显眼的 JavaScript!从posts.php文件来看,你真的不知道自己在做什么。

      我建议阅读来自this page 的所有内容。它将包含很多关于 HTML 的非常好的材料。然后观看this lecture,然后观看http://yuiblog.com/crockford/ 上的所有内容。另外,我建议您阅读Eloquent Javascript 书。

      您使用的是自制框架还是某个第 3 部分产品?

      无论如何。您应该首先创建一个非 AJAX 方法来添加 cmets。在您当前的设置中,很可能通过在Posts_Model 中添加post_comment() 方法来实现。然后在Posts_Controller中创建一个单独的方法,用于处理POST的请求。

      完成后,您可以开始使用 AJAX 为文章发布新的 cmets。你的'/views/Ajax/addComment.js' 文件应该添加到posts.php 文件中(你称之为“视图”,但它不是)。您应该使用绝对路径来包含该 JS 文件。

      AJAX 请求应通过附加到onsubmit 事件的&lt;form name="commentForm"&gt; 事件处理程序执行。您从表单的元素中收集数据并创建 XHR 请求。要了解如何操作,请阅读this article。

      也就是说,您的代码容易受到 SQL 注入的攻击。仅仅因为您使用 PDO/MySQLi,它不会神奇地保护您。您实际上也需要知道如何使用它。我建议阅读this article(是的,它适用于 PDO,但理论不会改变)。特别是this section。它应该向您解释如何正确使用准备好的语句以及为什么它很重要。对于 MySQLi 等效项,您必须阅读 MySQLi::bind_param() manual entry。

      【讨论】:

        猜你喜欢
        • 2021-10-04
        • 2013-07-29
        • 1970-01-01
        • 2021-02-02
        • 2019-10-16
        • 2013-06-20
        • 2014-07-06
        • 2019-10-21
        • 2013-12-31
        相关资源
        最近更新 更多