Как создать простое голосование по ajax в CakePHP 2.0

Я просто пытаюсь создать простой голос с CakePHP 2.0 и Ajax. Я новичок в этом контексте, поэтому мне очень трудно...

Я просто хочу создать ссылку с действием голосования, которое будет вызывать действие в контроллере для обновления поля "число голосов" в таблице базы данных.

Я пробую это, но я не знаю, делаю ли я это хорошо. У меня есть это сейчас:

//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);

}

//Controllers/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... но я не знаю, где я могу применить его или как это сделать. Любое предложение?

Благодарю.

1 ответ

Решение

Мне не совсем ясно, как именно вы хотите настроить эту систему голосования, но вот несколько примеров, которые помогут вам двигаться в правильном направлении:

Используйте JS-помощник CakePHP для настройки всего AJAX-запроса.

Мы свяжем запрос AJAX с событием щелчка ссылки с идентификатором 'link-id'. Этот запрос будет проходить к вашему контроллеру, как обычный запрос, но будет (ну, он должен) использовать макет 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
}
?>
Другие вопросы по тегам