From a3ba58dfc048c948230317191c67101c4aa80bfb Mon Sep 17 00:00:00 2001 From: cweiske Date: Wed, 28 Oct 2009 08:02:17 +0000 Subject: [PATCH] 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 --- data/templates/bookmarks-vote.inc.tpl.php | 10 +++-- src/SemanticScuttle/Service/Bookmark.php | 46 +++++++++++++++++++---- www/ajaxVote.php | 21 +++++++++++ www/jsScuttle.php | 36 ++++++++++++++++-- www/vote.php | 6 +++ 5 files changed, 105 insertions(+), 14 deletions(-) create mode 100644 www/ajaxVote.php 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 ''; +echo ''; if (isset($row['hasVoted']) && !$row['hasVoted']) { echo '+'; + . createVoteURL(true, $row['bId']) . '"' + . ' onclick="javascript:vote(' . $row['bId'] . ',1); return false;"' + . '>+'; } else { echo '+'; } @@ -26,7 +28,9 @@ echo '' . $row['bVoting'] . ''; if (isset($row['hasVoted']) && !$row['hasVoted']) { echo '-'; + . createVoteURL(false, $row['bId']) . '"' + . ' onclick="vote(' . $row['bId'] . ',-1); return false;"' + . '>-'; } else { echo '-'; } 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'; - 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; 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 @@ +getBookmark($bookmark); + +header('Content-Type: text/xml; charset=utf-8'); +echo '' . $bookmark . '' + . ''; +$ts->loadTemplate( + 'bookmarks-vote.inc.tpl.php', + array('row' => $bmrow) +); + +echo ''; +?> \ 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('ajaxDelete.php?id=' + input); + loadXMLDocProc('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('ajaxGetTitle.php?url=' + input); + loadXMLDocProc('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( + '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