0

我只是想用 CakePHP 2.0 和 Ajax 创建一个简单的投票。我是这个框架的新手,所以我觉得真的很难......

我只想创建一个带有投票操作的链接,该链接将调用控制器中的操作来更新数据库表中的“numberVotes”字段。

我正在尝试,但我不知道我是否做得很好。我现在有这个:

//posts/view.ctp $this->Html->script('votar', array('inline' => false)); //它将它加载到布局中

echo '<div id=\'vote\'>';
    echo $this->element('vote', array('id' => $post['Post']['id']));
echo '</div>'

元素/vote.ctp

if(!empty($voting)){
echo "You have voted!!!";   
}else{
echo '<a href="#" onclick="votar(\''.$id.'\');return false;">Vote here!!</a>
}

webroot/js/vote.js

//XMLHttpRequest  Ajax
function newAjax()
{ 
var xmlhttp=false; 
try 
{ 
    xmlhttp=new ActiveXObject("Msxml2.XMLHTTP"); 
}
catch(e)
{ 
    try
    { 
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
    catch(E) { xmlhttp=false; }
}
if (!xmlhttp && typeof XMLHttpRequest!='undefined') { xmlhttp=new XMLHttpRequest();     } 
return xmlhttp; 
}


function voting(num) {
var url;
var obCon = document.getElementById('vote');
var ajax = newAjax();

url = 'http://localhost:8888/mysite/posts/voting/' + num;
alert(url);
ajax.open("GET", url);  

ajax.onreadystatechange=function(){
    if(ajax.readyState==4){
        if(ajax.status==200){
            obCon.innerHTML=ajax.responseText;

        }else if(ajax.status==404){
            obCon.innerHTML = "Page not found";
        }else{
            obCon.innerHTML = "Error:"+ajax.status; 
        }
    }
}
ajax.send(null);

}

//控制器/PostsController.php

public function voting($id = null){
            ... //stuff to add the vote in the DB
    $this->set(array('id' => $id, 'voting' => 'yes'));
    $this->render('/Elements/vote', false);
}

我确定我没有将 CakePHP 的强大功能用于 ajax……但我不知道我可以在哪里应用它或如何应用它。有什么建议吗?

谢谢。

4

1 回答 1

1

我并不完全清楚您希望如何设置这个投票系统,但这里有一些示例可以让您朝着正确的方向前进:

使用 CakePHP 的 JS 助手来设置整个 AJAX 请求。

我们将 AJAX 请求绑定到 ID 为“link-id”的链接的点击事件。这个请求将像普通请求一样进入您的控制器,但会(嗯,它应该)使用 Cake 的默认 AJAX 布局,这意味着请求的结果应该只是一大块 html,我们将使用它来替换其中的所有内容#content div。

这在视图文件中:

<?php
$this->Js->get('#link-id');
$this->Js->event(
    'click',
    $this->Js->request(
        array('action' => 'vote', $post_id), //this is effectively www.yourdomain.com/posts/vote/1 (if the post_id is 1)
        array('async' => true, 'update' => '#content')
    )
);
?>

您的控制器应如下所示:

<?php
function vote($id) {
    //update your number in the database
    if(/* the update was a success */){
        $this->set('message', 'Thank you for voting!');
    } else {
        $this->set('message', 'Try again.');
    }

    //then in vote.ctp, echo $message somewhere
    //the result of vote.ctp will replace #content on your page
}
?>
于 2012-01-19T03:11:12.500 回答