summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorGravatar cweiske2009-10-28 08:02:17 +0000
committerGravatar cweiske2009-10-28 08:02:17 +0000
commita3ba58dfc048c948230317191c67101c4aa80bfb (patch)
tree75dc0309ac92381e3df31820894aa79f320b9e1f
parenta63765a4ad05b83f4c4ffcb7790b528f09f20a43 (diff)
downloadscuttle-a3ba58dfc048c948230317191c67101c4aa80bfb.tar.gz
scuttle-a3ba58dfc048c948230317191c67101c4aa80bfb.zip
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
-rw-r--r--data/templates/bookmarks-vote.inc.tpl.php10
-rw-r--r--src/SemanticScuttle/Service/Bookmark.php46
-rw-r--r--www/ajaxVote.php21
-rw-r--r--www/jsScuttle.php36
-rw-r--r--www/vote.php6
5 files changed, 105 insertions, 14 deletions
diff --git a/data/templates/bookmarks-vote.inc.tpl.php b/data/templates/bookmarks-vote.inc.tpl.php
index 5979827..d59feb4 100644
--- a/data/templates/bookmarks-vote.inc.tpl.php
+++ b/data/templates/bookmarks-vote.inc.tpl.php
@@ -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>';
}
diff --git a/src/SemanticScuttle/Service/Bookmark.php b/src/SemanticScuttle/Service/Bookmark.php
index 3a7edd9..1054360 100644
--- a/src/SemanticScuttle/Service/Bookmark.php
+++ b/src/SemanticScuttle/Service/Bookmark.php
@@ -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';
+
+ //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 ($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;
diff --git a/www/ajaxVote.php b/www/ajaxVote.php
new file mode 100644
index 0000000..27eb62c
--- /dev/null
+++ b/www/ajaxVote.php
@@ -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>';
+?> \ No newline at end of file
diff --git a/www/jsScuttle.php b/www/jsScuttle.php
index 6aba422..6807e4a 100644
--- a/www/jsScuttle.php
+++ b/www/jsScuttle.php
@@ -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');
diff --git a/www/vote.php b/www/vote.php
index 6dda31b..406b7d0 100644
--- a/www/vote.php
+++ b/www/vote.php
@@ -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);
?> \ No newline at end of file