как сделать так чтоб фильтрация была не по последнему IP а по зарегистрированным пользователям. пытался менять в скрипте userIP на $user->username предварительно $user =& JFactory::getUser() но не получилось Код Код (CODE): <?php /** * Core Design Ajax Vote plugin for Joomla! 1.5 * @author Daniel Rataj, <info@greatjoomla.com> * @package Joomla * @subpackage Content * @category Plugin * @version 1.0.3 * @copyright Copyright (C) 2007 - 2008 Core Design, http://www.greatjoomla.com * @license http://creativecommons.org/licenses/by-nc/3.0/legalcode Creative Commons */ // Set flag that this is a parent file define('_JEXEC', 1); // no direct access defined('_JEXEC') or die('Restricted access'); define('DS', DIRECTORY_SEPARATOR); define('JPATH_BASE', dirname(dirname(dirname(dirname(dirname(dirname(__file__))))))); require_once (JPATH_BASE . DS . 'includes' . DS . 'defines.php'); require_once (JPATH_BASE . DS . 'includes' . DS . 'framework.php'); jimport('joomla.database.database'); jimport('joomla.database.table'); jimport('joomla.enviroment.request'); jimport('joomla.plugin.plugin'); $mainframe = &JFactory::getApplication('site'); $mainframe->initialise(); // define language JPlugin::loadLanguage('plg_content_cdajaxvote', JPATH_ADMINISTRATOR); // end // get configuration $conf = new JConfig(); $host = $conf->host; $user = $conf->user; $password = $conf->password; $database = $conf->db; $prefix = $conf->dbprefix; $driver = $conf->dbtype; $debug = $conf->debug; unset($conf); // end // get database $options = array('driver' => $driver, 'host' => $host, 'user' => $user, 'password' => $password, 'database' => $database, 'prefix' => $prefix); $db = &JDatabase::getInstance($options); unset($options); if (JError::isError($db)) { jexit(loadMessage(JText::_('UNABLE_TO_CONNECT'), 'wrong')); } if ($db->getErrorNum() > 0) { jexit(loadMessage(JText::_('UNABLE_TO_CONNECT'), 'wrong')); } // end $task = JRequest::getString('plgCdAjaxvoteAction', '', 'POST', 'string'); $user_rating = JRequest::getVar('user_rating', 0, 'POST', 'int'); $article_id = JRequest::getVar('article_id', 0, '', 'int'); switch ($task) { case 'login_first': jexit(loadMessage(JText::_('PLEASE_LOGIN_FIRST'), 'wrong')); break; case 'intro_only': jexit(loadMessage(JText::_('INTRO_ONLY'), 'wrong')); break; case 'update': if (isset($user_rating) and isset($article_id) and !empty($user_rating) and ! empty($article_id)) { vote($article_id, $user_rating); } else { jexit('Restricted access'); } break; case 'resetvoting': if (isset($article_id) and !empty($article_id)) { resetVoting($article_id); } else { jexit('Restricted access'); } break; default: jexit('Restricted access'); break; } unset($task, $user_rating, $article_id); function vote($article_id, $rate) { global $db; if ($rate >= 1 && $rate <= 5) { $userIP = $_SERVER['REMOTE_ADDR']; $query = 'SELECT *' . ' FROM #__content_rating' . ' WHERE content_id = ' . (int) $article_id; $db->setQuery($query); $rating = $db->loadObject(); if (!$rating) { // There are no ratings yet, so lets insert our rating $query = 'INSERT INTO #__content_rating ( content_id, lastip, rating_sum, rating_count )' . ' VALUES ( ' . (int)$article_id . ', ' . $db->Quote($userIP) . ', ' . (int)$rate . ', 1 )'; $db->setQuery($query); if (!$db->query()) { jexit(loadMessage(JText::_('UNABLE_TO_CONNECT'), 'wrong')); } else { jexit(loadMessage(JText::_('Спасибо за Ваш голос!'), 'success')); } } else { if ($userIP != ($rating->lastip)) { // We weren't the last voter so lets add our vote to the ratings totals for the article $query = 'UPDATE #__content_rating' . ' SET rating_count = rating_count + 1, rating_sum = rating_sum + ' . (int)$rate . ', lastip = ' . $db->Quote($userIP) . ' WHERE content_id = ' . (int)$article_id; $db->setQuery($query); if (!$db->query()) { jexit(loadMessage(JText::_('UNABLE_TO_CONNECT'), 'wrong')); } else { jexit(loadMessage(JText::_('Спасибо за Ваш голос!'), 'success')); } } else { jexit(loadMessage(JText::_('Вы уже оценивали данную статью!'), 'wrong')); } } } else { jexit(); } } function resetVoting($article_id) { global $db; $query = 'SELECT *' . ' FROM #__content_rating' . ' WHERE content_id = ' . (int) $article_id; $db->setQuery($query); $rating = $db->loadObject(); if (!$rating) { jexit(loadMessage(JText::_('VOTE_DELETE_EMPTY'), 'wrong')); } else { $query = 'DELETE FROM #__content_rating' . ' WHERE content_id = ' . (int)$article_id . ' LIMIT 1'; $db->setQuery($query); if (!$db->query()) { jexit(loadMessage(JText::_('UNABLE_TO_CONNECT'), 'wrong')); } else { jexit(loadMessage(JText::_('VOTE_DELETE_SUCCESSFULLY'), 'success')); } } } function loadMessage($message, $status) { if (!isset($status)) { $status = 'wrong'; } switch ($status) { case 'success': return '<div id="cd_ajaxvote_status_message" class="cd_ajaxvote_status_success">' . $message . '</div>'; break; case 'wrong': return '<div id="cd_ajaxvote_status_message" class="cd_ajaxvote_status_wrong">' . $message . '</div>'; break; default: return; break; } return; } ?>
неужели на форуме нет ни одного человека который в джумле разбирается? вот Код (CODE): // There are no ratings yet, so lets insert our rating $query = 'INSERT INTO #__content_rating ( content_id, lastip, rating_sum, rating_count )' . ' VALUES ( ' . (int)$article_id . ', ' . $db->Quote($userIP) . ', ' . (int)$rate . ', 1 )'; $db->setQuery($query); if (!$db->query()) { jexit(loadMessage(JText::_('UNABLE_TO_CONNECT'), 'wrong')); } else { jexit(loadMessage(JText::_('Спасибо за Ваш голос!'), 'success')); } } else { if ($userIP != ($rating->lastip)) { // We weren't the last voter so lets add our vote to the ratings totals for the article $query = 'UPDATE #__content_rating' . ' SET rating_count = rating_count + 1, rating_sum = rating_sum + ' . (int)$rate . ', lastip = ' . $db->Quote($userIP) . ' WHERE content_id = ' . (int)$article_id; который в базу пишет IP всего то надо заменить чтоб писал ник пользователя, и потом проверял есть ли такой чтоб повторно не галосовал. на php сам бы сделал, а тут свои функции и синтаксис
Da_Vinchi, люди разбирающиеся есть, но видимо, никто такого раньше не делал, а экспериментировать нет времени. Если Вы действительно знаете php, то в чем проблема? перепишите по-своему, своими "функциями и синтаксисом"
да пытался, простой код добавляющий запись в базу, вставленный в конце выше приведенного кода не работает, а если в отдельном файле то работает
Для решения Вашей задачи Вам понадобиться модифицировать таблицу 'jos_content_rating', а конкретнее нужно добавить еще одно поле Код (CODE): ALTER TABLE jos_content_rating ADD user_id SMALLINT; Находим кусок кода, кода, который отвечает за проверку айпишника Код (PHP): if ($userIP != ($rating->lastip)) Если вы собрались устраивать голосование только для зарегистрированных пользователей, то необходимо проверить еще один флаг: Код (PHP): $user =& JFactory::getUser(); //получаем объект текущего пользователя, желательно инициализировать //его как можно выше в коде, примерно в районе "кривого" подключения к БД )))) if ( (!$user->guest) and ($user->id != $rating->user_id) ) //проверяем является ли пользователь гостем // и сравниваем его ид с ид в БД. { // также необходимо модифицировать запросы, я намеренно оставил поле с айпи, если вдруг возникнет // необходимость сравнить по нему $query = 'UPDATE #__content_rating' . ' SET rating_count = rating_count + 1, rating_sum = rating_sum + ' . (int)$rate . ', user_id = ' . $user->id . ', lastip = ' . $db->Quote($userIP) . 'WHERE content_id = ' . (int)$article_id; $db->setQuery($query); if (!$db->query()) { jexit(loadMessage(JText::_('UNABLE_TO_CONNECT'), 'wrong')); } else { jexit(loadMessage(JText::_('Спасибо за Ваш голос!'), 'success')); } } Также Вам необходимо модифицировать еще 1 запрос. Код (PHP): // There are no ratings yet, so lets insert our rating // т.к. после альтера поле с ид пользователя добавится в конец таблицы $query = 'INSERT INTO #__content_rating ( content_id, lastip, rating_sum, rating_count )' . ' VALUES ( ' . (int)$article_id . ', ' . $db->Quote($userIP) . ', ' . (int)$rate . ', 1 , ' .$user->id. ')'; Писал "на коленке", но, по идее должно работать )))
спасибо что откликнулись у нас же уже есть $user котопый определяется как $user = $conf->user; и в базу же будет писаться id последнего проголосовавшего, а не всех проголосовавших. тоесть пользователь сможет повторно голосовать после кого то
к сожалению так устроен плагин и структура БД плагина. Я уже переписывал более сложную модификацию этого плагина за $, если Вы хотите воспользоваться моими услугами - пишите в ПМ )
если б я хотел за деньги это сделать я б на форуме не спрашивал бы совета, для знающего человека это дело 15 минут не больше.
Da_Vinchi, есть аналог этого плагина для вордпресс - WP Postratings, там как раз реализована функция выбора, кому можно голосовать - по айпи, по кукам, только зарегенным. ПРи достаточных знаниях в пхп - найти и выдернуть нужный кусок кода не составит труда