basic ajax voting support. has a bad counting bug somewhere

git-svn-id: https://semanticscuttle.svn.sourceforge.net/svnroot/semanticscuttle/trunk@445 b3834d28-1941-0410-a4f8-b48e95affb8f
This commit is contained in:
cweiske 2009-10-28 08:02:17 +00:00
parent a63765a4ad
commit a3ba58dfc0
5 changed files with 105 additions and 14 deletions

View File

@ -13,11 +13,13 @@ if (isset($row['hasVoted']) && !$row['hasVoted']) {
} else {
$classes = 'vote-badge';
}
echo '<span class="' . $classes . '">';
echo '<span class="' . $classes . '" id="bmv-' . $row['bId'] . '">';
if (isset($row['hasVoted']) && !$row['hasVoted']) {
echo '<a class="vote-for" rel="nofollow" href="'
. createVoteURL(true, $row['bId']) . '">+</a>';
. createVoteURL(true, $row['bId']) . '"'
. ' onclick="javascript:vote(' . $row['bId'] . ',1); return false;"'
. '>+</a>';
} else {
echo '<span class="vote-for-inactive">+</span>';
}
@ -26,7 +28,9 @@ echo '<span class="voting">' . $row['bVoting'] . '</span>';
if (isset($row['hasVoted']) && !$row['hasVoted']) {
echo '<a class="vote-against" rel="nofollow" href="'
. createVoteURL(false, $row['bId']) . '">-</a>';
. createVoteURL(false, $row['bId']) . '"'
. ' onclick="vote(' . $row['bId'] . ',-1); return false;"'
. '>-</a>';
} else {
echo '<span class="vote-against-inactive">-</span>';
}

View File

@ -80,19 +80,51 @@ class SemanticScuttle_Service_Bookmark extends SemanticScuttle_DbService
/**
* Load a single bookmark and return it
*
* @param integer $bid Bookmark ID
* @param boolean $include_tags If tags shall be loaded
*
* @return mixed Array with bookmark data or false in case
* of an error.
*/
function getBookmark($bid, $include_tags = false)
{
if (!is_numeric($bid))
return;
if (!is_numeric($bid)) {
return false;
}
$sql = 'SELECT * FROM '. $this->getTableName() .' WHERE bId = '. $this->db->sql_escape($bid);
$userservice = SemanticScuttle_Service_Factory::get('User');
if (!($dbresult = & $this->db->sql_query($sql)))
message_die(GENERAL_ERROR, 'Could not get vars', '', __LINE__, __FILE__, $sql, $this->db);
$query_1 = '*';
$query_2 = $this->getTableName() . ' as B';
if ($row = & $this->db->sql_fetchrow($dbresult)) {
//Voting system
//needs to be directly after FROM bookmarks
if ($GLOBALS['enableVoting'] && $userservice->isLoggedOn()) {
$currentuser = $userservice->getCurrentUser();
$vs = SemanticScuttle_Service_Factory::get('Vote');
$query_1 .= ', !ISNULL(V.bId) as hasVoted, V.vote as vote';
$query_2 .= ' LEFT JOIN ' . $vs->getTableName() . ' AS V'
. ' ON B.bId = V.bId'
. ' AND V.uId = ' . (int)$currentuser['uId'];
}
$sql = 'SELECT ' . $query_1 . ' FROM '
. $query_2
.' WHERE B.bId = '. $this->db->sql_escape($bid);
if (!($dbresult = & $this->db->sql_query($sql))) {
message_die(
GENERAL_ERROR, 'Could not get bookmark',
'', __LINE__, __FILE__, $sql, $this->db
);
}
if ($row = $this->db->sql_fetchrow($dbresult)) {
if ($include_tags) {
$b2tservice = SemanticScuttle_Service_Factory :: get('Bookmark2Tag');
$b2tservice = SemanticScuttle_Service_Factory::get('Bookmark2Tag');
$row['tags'] = $b2tservice->getTagsForBookmark($bid);
}
$output = $row;

21
www/ajaxVote.php Normal file
View File

@ -0,0 +1,21 @@
<?php
/**
* We re-use vote.php but set the ajax flag
*/
$GLOBALS['ajaxRequest'] = true;
require 'vote.php';
$bs = SemanticScuttle_Service_Factory::get('Bookmark');
$ts = SemanticScuttle_Service_Factory::get('Template');
$bmrow = $bs->getBookmark($bookmark);
header('Content-Type: text/xml; charset=utf-8');
echo '<voteresult><bookmark>' . $bookmark . '</bookmark>'
. '<html xmlns="http://www.w3.org/1999/xhtml">';
$ts->loadTemplate(
'bookmarks-vote.inc.tpl.php',
array('row' => $bmrow)
);
echo '</html></voteresult>';
?>

View File

@ -42,7 +42,7 @@ function deleteConfirmed(ele, input, response) {
post.style.display = 'none';
deleted = false;
} else {
loadXMLDoc('<?php echo ROOT; ?>ajaxDelete.php?id=' + input);
loadXMLDocProc('<?php echo ROOT; ?>ajaxDelete.php?id=' + input);
post.style.display = 'none';
}
}
@ -97,7 +97,7 @@ function getTitle(input, response){
title.style.backgroundImage = 'none';
title.value = response;
} else if (input.indexOf('http') > -1) {
loadXMLDoc('<?php echo ROOT; ?>ajaxGetTitle.php?url=' + input);
loadXMLDocProc('<?php echo ROOT; ?>ajaxGetTitle.php?url=' + input);
} else {
return false;
}
@ -105,11 +105,25 @@ function getTitle(input, response){
}
var xmlhttp;
function loadXMLDoc(url) {
function loadXMLDocProc(url) {
loadXMLDoc(url, processStateChange);
}
function vote(bookmark, vote) {
if (vote == 1) {
vote = 'for';
} else {
vote = 'against';
}
loadXMLDoc(
'<?php echo ROOT; ?>ajaxVote.php/' + vote + '/' + bookmark,
processVotingResult
);
}
function loadXMLDoc(url, callback) {
// Native
if (window.XMLHttpRequest) {
xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = processStateChange;
xmlhttp.onreadystatechange = callback;
xmlhttp.open("GET", url, true);
xmlhttp.send(null);
// ActiveX
@ -131,6 +145,20 @@ function processStateChange() {
eval(method + '(\'\', result)');
}
}
function processVotingResult() {
if (xmlhttp.readyState != 4 || xmlhttp.status != 200) {
return;
}
var response = xmlhttp.responseXML.documentElement;
var bookmark = response.getElementsByTagName('bookmark')[0]
.firstChild.nodeValue;
var bmnode = document.getElementById('bmv-'+bookmark);
bmnode.parentNode.replaceChild(
response.getElementsByTagName('html')[0].firstChild,
bmnode
);
}
function playerLoad() {
var anchors = document.getElementsByTagName('a');

View File

@ -65,5 +65,11 @@ if ($vs->hasVoted($bookmark, $user)) {
}
$vs->vote($bookmark, $user, $type == 'for' ? 1 : -1);
if (isset($GLOBALS['ajaxRequest']) && $GLOBALS['ajaxRequest']) {
//we are in ajax mode and return the badge in ajaxVote.php
return;
}
header('Location: ' . $from);
?>