-1

posts.php特定の投稿とそのコメントを表示するページを作成し、ユーザーがこの投稿に新しいコメントを動的に追加できるようにしました。

*"submit_comment"* を Ajax で実装したいのですが、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/関数を呼び出すか?

助言がありますか?例?

4

2 に答える 2

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>'
   }
?>

アプリケーションでルーティングがどのように構成されているかはわかりませんが、ajax 機能の main に似たメソッドを作成します。URL が Controller にルーティングされる方法について詳しく言及していただければ、より知識に基づいた提案ができるかもしれません。

于 2012-08-04T13:08:49.990 に答える
0

MVC の使い方を学ぶ前に、セマンティック HTML と目立たない JavaScript の書き方を学ぶ必要があります。ファイルから判断するposts.phpと、自分が何をしているのか本当にわかりません。

このページからすべてを読むことをお勧めします。HTML に関する非常に優れた資料が多数含まれています。次に、この講義を見てから、 http://yuiblog.com/crockford/ですべてを見てください。また、 Eloquent Javascriptの本 を読むことをお勧めします。

自家製のフレームワークを使用していますか、それともサードパーティ製品ですか?

ともかく。コメントを追加するための非 AJAX メソッドを作成することから始める必要があります。現在のセットアップでは、post_comment()メソッドを に追加することで発生する可能性が最も高いでしょうPosts_ModelPosts_Controller次に、リクエストを処理するために で別のメソッドを作成しPOSTます。

それが完了したら、AJAX を使用して記事の新しいコメントを投稿する作業を開始できます。'/views/Ajax/addComment.js'ファイルはファイルに追加する必要がありposts.phpます(「ビュー」と呼ばれるものですが、そうではありません)。その JS ファイルを含めるには、絶対パスを使用する必要があります。

AJAX リクエストはonsubmit<form name="commentForm">. フォームの要素からデータを収集し、XHR リクエストを作成します。その方法については、この記事をお読みください。

つまり、コードは SQL インジェクションに対して脆弱です。PDO/MySQLi を使用しているからといって、魔法のように保護されるわけではありません。実際に使用する方法も知っておく必要があります。この記事を読むことをお勧めします(はい、これは PDO 用ですが、理論は変わりません)。特にこのセクション。準備済みステートメントを適切に使用する方法と、それが重要な理由を説明する必要があります。MySQLi に相当するものについては、MySQLi::bind_param()マニュアル エントリを読む必要があります。

于 2012-08-04T16:15:47.340 に答える