Joomla 1.5 изменить Ajax Vote plugin

Тема в разделе "Модернизация расширений", создана пользователем Da_Vinchi, 20.01.2010.

  1. Offline

    Da_Vinchi Недавно здесь

    Регистрация:
    20.01.2010
    Сообщения:
    8
    Симпатии:
    0
    Пол:
    Мужской
    как сделать так чтоб фильтрация была не по последнему IP а по зарегистрированным пользователям.
    пытался менять в скрипте userIP на $user->username предварительно $user =& JFactory::getUser() но не получилось

    Код
    Код (CODE):
    1. <?php
    2. /**
    3.  * Core Design Ajax Vote plugin for Joomla! 1.5
    4.  * @author      Daniel Rataj, <info@greatjoomla.com>
    5.  * @package     Joomla
    6.  * @subpackage  Content
    7.  * @category    Plugin
    8.  * @version     1.0.3
    9.  * @copyright   Copyright (C)  2007 - 2008 Core Design, http://www.greatjoomla.com
    10.  * @license     http://creativecommons.org/licenses/by-nc/3.0/legalcode Creative Commons
    11.  */
    12.  
    13. // Set flag that this is a parent file
    14. define('_JEXEC', 1);
    15.  
    16. // no direct access
    17. defined('_JEXEC') or die('Restricted access');
    18.  
    19. define('DS', DIRECTORY_SEPARATOR);
    20.  
    21. define('JPATH_BASE', dirname(dirname(dirname(dirname(dirname(dirname(__file__)))))));
    22.  
    23. require_once (JPATH_BASE . DS . 'includes' . DS . 'defines.php');
    24. require_once (JPATH_BASE . DS . 'includes' . DS . 'framework.php');
    25.  
    26. jimport('joomla.database.database');
    27. jimport('joomla.database.table');
    28. jimport('joomla.enviroment.request');
    29. jimport('joomla.plugin.plugin');
    30.  
    31. $mainframe = &JFactory::getApplication('site');
    32. $mainframe->initialise();
    33.  
    34. // define language
    35. JPlugin::loadLanguage('plg_content_cdajaxvote', JPATH_ADMINISTRATOR);
    36. // end
    37.  
    38. // get configuration
    39. $conf = new JConfig();
    40.  
    41. $host = $conf->host;
    42. $user = $conf->user;
    43. $password = $conf->password;
    44. $database = $conf->db;
    45. $prefix = $conf->dbprefix;
    46. $driver = $conf->dbtype;
    47. $debug = $conf->debug;
    48.  
    49. unset($conf);
    50. // end
    51.  
    52. // get database
    53. $options = array('driver' => $driver, 'host' => $host, 'user' => $user,
    54.     'password' => $password, 'database' => $database, 'prefix' => $prefix);
    55. $db = &JDatabase::getInstance($options);
    56.  
    57. unset($options);
    58.  
    59. if (JError::isError($db))
    60. {
    61.     jexit(loadMessage(JText::_('UNABLE_TO_CONNECT'), 'wrong'));
    62. }
    63.  
    64. if ($db->getErrorNum() > 0)
    65. {
    66.     jexit(loadMessage(JText::_('UNABLE_TO_CONNECT'), 'wrong'));
    67. }
    68. // end
    69. $task = JRequest::getString('plgCdAjaxvoteAction', '', 'POST', 'string');
    70. $user_rating = JRequest::getVar('user_rating', 0, 'POST', 'int');
    71. $article_id = JRequest::getVar('article_id', 0, '', 'int');
    72.  
    73.  
    74. switch ($task)
    75. {
    76.     case 'login_first':
    77.         jexit(loadMessage(JText::_('PLEASE_LOGIN_FIRST'), 'wrong'));
    78.         break;
    79.     case 'intro_only':
    80.         jexit(loadMessage(JText::_('INTRO_ONLY'), 'wrong'));
    81.         break;
    82.     case 'update':
    83.         if (isset($user_rating) and isset($article_id) and !empty($user_rating) and !
    84.             empty($article_id))
    85.         {
    86.             vote($article_id, $user_rating);
    87.         } else
    88.         {
    89.             jexit('Restricted access');
    90.         }
    91.         break;
    92.     case 'resetvoting':
    93.         if (isset($article_id) and !empty($article_id))
    94.         {
    95.             resetVoting($article_id);
    96.         } else
    97.         {
    98.             jexit('Restricted access');
    99.         }
    100.         break;
    101.     default:
    102.         jexit('Restricted access');
    103.         break;
    104. }
    105.  
    106. unset($task, $user_rating, $article_id);
    107.  
    108. function vote($article_id, $rate)
    109. {
    110.     global $db;
    111.  
    112.     if ($rate >= 1 && $rate <= 5)
    113.     {
    114.         $userIP = $_SERVER['REMOTE_ADDR'];
    115.  
    116.         $query = 'SELECT *' . ' FROM #__content_rating' . ' WHERE content_id = ' . (int)
    117.             $article_id;
    118.         $db->setQuery($query);
    119.         $rating = $db->loadObject();
    120.  
    121.         if (!$rating)
    122.         {
    123.             // There are no ratings yet, so lets insert our rating
    124.             $query = 'INSERT INTO #__content_rating ( content_id, lastip, rating_sum, rating_count )' .
    125.                 ' VALUES ( ' . (int)$article_id . ', ' . $db->Quote($userIP) . ', ' . (int)$rate .
    126.                 ', 1 )';
    127.             $db->setQuery($query);
    128.             if (!$db->query())
    129.             {
    130.                 jexit(loadMessage(JText::_('UNABLE_TO_CONNECT'), 'wrong'));
    131.             } else
    132.             {
    133.                 jexit(loadMessage(JText::_('Спасибо за Ваш голос!'), 'success'));
    134.             }
    135.         } else
    136.         {
    137.             if ($userIP != ($rating->lastip))
    138.             {
    139.                 // We weren't the last voter so lets add our vote to the ratings totals for the article
    140.                 $query = 'UPDATE #__content_rating' .
    141.                     ' SET rating_count = rating_count + 1, rating_sum = rating_sum + ' . (int)$rate .
    142.                     ', lastip = ' . $db->Quote($userIP) . ' WHERE content_id = ' . (int)$article_id;
    143.                 $db->setQuery($query);
    144.                 if (!$db->query())
    145.                 {
    146.                     jexit(loadMessage(JText::_('UNABLE_TO_CONNECT'), 'wrong'));
    147.                 } else
    148.                 {
    149.                     jexit(loadMessage(JText::_('Спасибо за Ваш голос!'), 'success'));
    150.                 }
    151.             } else
    152.             {
    153.                 jexit(loadMessage(JText::_('Вы уже оценивали данную статью!'), 'wrong'));
    154.             }
    155.         }
    156.     } else
    157.     {
    158.         jexit();
    159.     }
    160. }
    161.  
    162. function resetVoting($article_id)
    163. {
    164.     global $db;
    165.  
    166.     $query = 'SELECT *' . ' FROM #__content_rating' . ' WHERE content_id = ' . (int)
    167.         $article_id;
    168.     $db->setQuery($query);
    169.     $rating = $db->loadObject();
    170.  
    171.     if (!$rating)
    172.     {
    173.         jexit(loadMessage(JText::_('VOTE_DELETE_EMPTY'), 'wrong'));
    174.     } else
    175.     {
    176.         $query = 'DELETE FROM #__content_rating' . ' WHERE content_id = ' . (int)$article_id .
    177.             ' LIMIT 1';
    178.         $db->setQuery($query);
    179.         if (!$db->query())
    180.         {
    181.             jexit(loadMessage(JText::_('UNABLE_TO_CONNECT'), 'wrong'));
    182.         } else
    183.         {
    184.             jexit(loadMessage(JText::_('VOTE_DELETE_SUCCESSFULLY'), 'success'));
    185.         }
    186.     }
    187. }
    188.  
    189. function loadMessage($message, $status)
    190. {
    191.     if (!isset($status))
    192.     {
    193.         $status = 'wrong';
    194.     }
    195.  
    196.     switch ($status)
    197.     {
    198.         case 'success':
    199.             return '<div id="cd_ajaxvote_status_message" class="cd_ajaxvote_status_success">' .
    200.                 $message . '</div>';
    201.             break;
    202.         case 'wrong':
    203.             return '<div id="cd_ajaxvote_status_message" class="cd_ajaxvote_status_wrong">' .
    204.                 $message . '</div>';
    205.             break;
    206.         default:
    207.             return;
    208.             break;
    209.     }
    210.     return;
    211. }
    212.  
    213.  
    214. ?>
     
    Последнее редактирование: 20.01.2010
  2.  
  3. Offline

    Da_Vinchi Недавно здесь

    Регистрация:
    20.01.2010
    Сообщения:
    8
    Симпатии:
    0
    Пол:
    Мужской
    неужели на форуме нет ни одного человека который в джумле разбирается?
    вот
    Код (CODE):
    1. // There are no ratings yet, so lets insert our rating $query = 'INSERT INTO #__content_rating ( content_id, lastip,  
    2. rating_sum, rating_count )' . ' VALUES ( ' . (int)$article_id . ', ' . $db->Quote($userIP) . ', ' . (int)$rate . ', 1 )';  
    3.  
    4. $db->setQuery($query); if (!$db->query()) { jexit(loadMessage(JText::_('UNABLE_TO_CONNECT'), 'wrong')); } else {  
    5.  
    6. jexit(loadMessage(JText::_('Спасибо за Ваш голос!'), 'success')); } } else { if ($userIP != ($rating->lastip)) { // We weren't    
    7. the last voter so lets add our vote to the ratings totals for the article $query = 'UPDATE #__content_rating' . '
    8.  
    9. SET     rating_count =   rating_count + 1, rating_sum = rating_sum + ' . (int)$rate . ', lastip = ' . $db->Quote($userIP) . '
    10. WHERE       content_id = ' . (int)$article_id;


    который в базу пишет IP всего то надо заменить чтоб писал ник пользователя, и потом проверял есть ли такой чтоб повторно не галосовал. на php сам бы сделал, а тут свои функции и синтаксис
     
  4. Fanamura
    Offline

    Fanamura Доброта

    Регистрация:
    12.03.2007
    Сообщения:
    5 094
    Симпатии:
    158
    Пол:
    Мужской
    Da_Vinchi, люди разбирающиеся есть, но видимо, никто такого раньше не делал, а экспериментировать нет времени. Если Вы действительно знаете php, то в чем проблема?:) перепишите по-своему, своими "функциями и синтаксисом" ;)
     
  5. Offline

    Da_Vinchi Недавно здесь

    Регистрация:
    20.01.2010
    Сообщения:
    8
    Симпатии:
    0
    Пол:
    Мужской
    да пытался, простой код добавляющий запись в базу, вставленный в конце выше приведенного кода не работает, а если в отдельном файле то работает
     
  6. omfgpanda
    Offline

    omfgpanda Недавно здесь => Cпециалист <=

    Регистрация:
    22.01.2008
    Сообщения:
    673
    Симпатии:
    53
    Пол:
    Мужской
    Для решения Вашей задачи Вам понадобиться модифицировать таблицу 'jos_content_rating', а конкретнее нужно добавить еще одно поле
    Код (CODE):
    1. ALTER TABLE jos_content_rating ADD user_id SMALLINT;

    Находим кусок кода, кода, который отвечает за проверку айпишника
    Код (PHP):
    1. if ($userIP != ($rating->lastip))

    Если вы собрались устраивать голосование только для зарегистрированных пользователей, то необходимо проверить еще один флаг:
    Код (PHP):
    1. $user =& JFactory::getUser(); //получаем объект текущего пользователя, желательно инициализировать
    2. //его как можно выше в коде, примерно в районе "кривого" подключения к БД ))))
    3. if ( (!$user->guest) and ($user->id != $rating->user_id) )  //проверяем является ли пользователь гостем
    4. // и сравниваем его ид с ид в БД.
    5. {
    6. // также необходимо модифицировать запросы, я намеренно оставил поле с айпи, если вдруг возникнет
    7. // необходимость сравнить по нему
    8.    $query = 'UPDATE #__content_rating' . ' SET rating_count = rating_count + 1, rating_sum = rating_sum +
    9.   ' . (int)$rate . ', user_id = ' . $user->id . ', lastip = ' . $db->Quote($userIP) .
    10.     'WHERE content_id = ' . (int)$article_id;                      
    11.    $db->setQuery($query);
    12.     if (!$db->query())
    13.    {
    14.       jexit(loadMessage(JText::_('UNABLE_TO_CONNECT'), 'wrong'));
    15.    }
    16.    else
    17.    {
    18.       jexit(loadMessage(JText::_('Спасибо за Ваш голос!'), 'success'));
    19.    }
    20. }


    Также Вам необходимо модифицировать еще 1 запрос.
    Код (PHP):
    1. // There are no ratings yet, so lets insert our rating
    2. // т.к. после альтера поле с ид пользователя добавится в конец таблицы
    3. $query = 'INSERT INTO #__content_rating ( content_id, lastip, rating_sum, rating_count )' .
    4. ' VALUES ( ' . (int)$article_id . ', ' . $db->Quote($userIP) . ', ' . (int)$rate . ', 1 , ' .$user->id. ')';


    Писал "на коленке", но, по идее должно работать )))
     
  7. Offline

    Da_Vinchi Недавно здесь

    Регистрация:
    20.01.2010
    Сообщения:
    8
    Симпатии:
    0
    Пол:
    Мужской
    спасибо что откликнулись
    у нас же уже есть $user котопый определяется как $user = $conf->user;
    и в базу же будет писаться id последнего проголосовавшего, а не всех проголосовавших. тоесть пользователь сможет повторно голосовать после кого то
     
  8. omfgpanda
    Offline

    omfgpanda Недавно здесь => Cпециалист <=

    Регистрация:
    22.01.2008
    Сообщения:
    673
    Симпатии:
    53
    Пол:
    Мужской
    к сожалению так устроен плагин и структура БД плагина. Я уже переписывал более сложную модификацию этого плагина за $, если Вы хотите воспользоваться моими услугами - пишите в ПМ )
     
  9. Offline

    Da_Vinchi Недавно здесь

    Регистрация:
    20.01.2010
    Сообщения:
    8
    Симпатии:
    0
    Пол:
    Мужской
    если б я хотел за деньги это сделать я б на форуме не спрашивал бы совета, для знающего человека это дело 15 минут не больше.
     
  10. Fanamura
    Offline

    Fanamura Доброта

    Регистрация:
    12.03.2007
    Сообщения:
    5 094
    Симпатии:
    158
    Пол:
    Мужской
    Da_Vinchi, если бы это было действительно дело 15 минут, тут бы давно все написали.
     
  11. agruts
    Offline

    agruts Группа поддержки

    Регистрация:
    01.03.2006
    Сообщения:
    609
    Симпатии:
    21
    Пол:
    Мужской
    Da_Vinchi, есть аналог этого плагина для вордпресс - WP Postratings, там как раз реализована функция выбора, кому можно голосовать - по айпи, по кукам, только зарегенным. ПРи достаточных знаниях в пхп - найти и выдернуть нужный кусок кода не составит труда
     
  12. omfgpanda
    Offline

    omfgpanda Недавно здесь => Cпециалист <=

    Регистрация:
    22.01.2008
    Сообщения:
    673
    Симпатии:
    53
    Пол:
    Мужской
    Золотые слова
     

Поделиться этой страницей

Загрузка...