Как создать простое голосование по 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
}
?>