Как создать простое голосование по ajax в CakePHP 2.0 - PullRequest
0 голосов
/ 18 января 2012

Я просто пытаюсь создать простое голосование с 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>'

Elements / voice.ctp

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

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

Спасибо.

1 Ответ

1 голос
/ 19 января 2012

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

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

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