0 Пользователей и 1 Гость просматривают эту тему.
  • 75 Ответов
  • 30343 Просмотров
*

Roman Petrenko

  • Moderator
  • 438
  • 61 / 0
  • Дизайн без секретов
Хочу на сайте разрешить всем комментировать изображения и ставить рейтинг в Phoca gallery 2.1.0. А активировать можно для
 
NOBODY
ALL REGISTERED USERS

а как для всех разрешить без регистрации?
*

Roman Petrenko

  • Moderator
  • 438
  • 61 / 0
  • Дизайн без секретов
Пока никак, читал на форуме разработчика. Может сделает в следующих версиях, но он один работает и не может все охватить. Будем ждать. ^-^
*

Zuev

  • Захожу иногда
  • 211
  • 15 / 1
  • В дальнем плавании
У меня теже самые задачи.

Ну с комментариями, как я понимаю, разобрались здесь:http://joomlaforum.ru/index.php/topic,52403.0.html

А вот с рейтингом что-нибудь решилось?
*

Zuev

  • Захожу иногда
  • 211
  • 15 / 1
  • В дальнем плавании
Предлагаю попробовать совместными усилиями "научить" фокагалери принимать рейтинг от незарегестрированных пользователей.

По теории надо просто в коде найти часть отвечающую за проверку пользователя, зарегестрирован он или нет, ну и вырезать ее.

И скорее всего еще надо найти часть кода которая записывает данный при голосовании в БД. так как вполне возможно что там же сразу записывается ид юзера, а так он не зареган возможны ошибки.
*

Zuev

  • Захожу иногда
  • 211
  • 15 / 1
  • В дальнем плавании
кстати я свой эксперимент буду проводить над версией 2.2.4
*

Zuev

  • Захожу иногда
  • 211
  • 15 / 1
  • В дальнем плавании
шаг 1.
убираем проверку зерегестрирован пользователь или нет:

D:\com_phocagallery_v2.2.4\front\views\category\tmpl\default_rating.php

вырезаем\комментируем строки с 18 по 42 включительно:
Код
/*	if ($this->tmpl['alreadyrated']) {

echo '<ul class="star-rating">'
.'<li class="current-rating" style="width:'.$this->tmpl['voteswidth'].'px"></li>'
.'<li><span class="star1"></span></li>';

for ($i = 2;$i < 6;$i++) {
echo '<li><span class="stars'.$i.'"></span></li>';
}
echo '</ul>'
    .'<p>'.JText::_('You have already rated this category').'</p>';

} else if ($this->tmpl['notregistered']) {

echo '<ul class="star-rating">'
.'<li class="current-rating" style="width:'.$this->tmpl['voteswidth'].'px"></li>'
.'<li><span class="star1"></span></li>';

for ($i = 2;$i < 6;$i++) {
echo '<li><span class="stars'.$i.'"></span></li>';
}
echo '</ul>'
    .'<p>'.JText::_('Only registered and logged in user can rate this category').'</p>';

} else {*/

и 57 строку:
Код
/*	}*/

Теперь при в ходе в категорию никаких сообщений что вы не зарегестрированы не вылазиет, но при попытке проголосовать перенаправляет на страницу регистрации, так что копаю дальше.


Кстати, при таких действиях перестанет работать проверка повторного голосования юзера, т.к. в фока галери данная проверка реализована не куками или запоминанием IP, а именно записью ID проголосовавшего юзера в БД.
« Последнее редактирование: 26.05.2009, 19:09:58 от Zuev »
*

Zuev

  • Захожу иногда
  • 211
  • 15 / 1
  • В дальнем плавании
Шаг 2.
в файле \com_phocagallery_v2.2.4\front\controller.php

удаляем\комментируем строки с 492 по 498
Код
/*		$checkUserVote	= $model->checkUserVote( $post['catid'], $post['userid'] );

// User has already rated this category
if ($checkUserVote) {
$msg = JText::_('You have already rated this category');
} else {
*/

строку 503
Код
 //			if ($user->aid > 0 && $user->id > 0) {
строки с 509 по 514
Код
/*			} else {
$mainframe->redirect(JRoute::_('index.php?option=com_user&view=login', false), JText::_("NOT AUTHORISED TO DO ACTION"));
exit;
}

}
*/
*

Zuev

  • Захожу иногда
  • 211
  • 15 / 1
  • В дальнем плавании
после этого в галерее голосовать может кто угодно и сколько угодно.

Еще бы конечно убрать вот это самое "сколько угодно".

При первых проверках ошибок не выявлено.
« Последнее редактирование: 26.05.2009, 21:26:59 от Zuev »
*

anis

  • Захожу иногда
  • 130
  • 1 / 0
а для версии 2,5,4 такое возможно???
*

Zuev

  • Захожу иногда
  • 211
  • 15 / 1
  • В дальнем плавании
не знаю, на новой версии не пробовал такое проделать.
да и вообще с выходом новой версии фока разочаровала меня, большим наличием багов.

на данный момент сделал выбор в пользу Datso галери.
Там кстати, как я понял (пока поюзал ее только в демо режиме), могут голосовать незареганные юзеры. ну и естественно стоит фильтр голосовавших, так что она не дает повторно кликать по звездачкам.
*

anis

  • Захожу иногда
  • 130
  • 1 / 0
datso не плохая но и не бесплатная
*

Zuev

  • Захожу иногда
  • 211
  • 15 / 1
  • В дальнем плавании
http://joomlaforum.ru/index.php/topic,71112.0.html
вот тут ребята делятся датсогалери.
если что это не я писал
*

Zuev

  • Захожу иногда
  • 211
  • 15 / 1
  • В дальнем плавании
первая часть описана здесь: http://joomlaforum.ru/index.php/topic,52912.0.html

Но как говорится начнем с самого начала.
Итак, задачи:
1. что бы незареганные юзеры могли голосовать.
2. фильтр голосовавших по ИП.

за основу берем фока галери 2.5.5
пример голосовалки с фильтром по ип беру с плагина extravote.

Если кто примет участие буду рад.
но больше всего буду рад если это кому то пригодится, судя по форуму должно пригодиться ^-^
*

Zuev

  • Захожу иногда
  • 211
  • 15 / 1
  • В дальнем плавании
Поехали.

кусок кода из екстравоте, отвечающий за запись голов в бд, а каже определения голосовал ли этот юзер или нет
Код
$user_rating    = JRequest::getInt('user_rating');
$cid            = JRequest::getInt('cid');
$xid = JRequest::getVar('xid');

if (($user_rating >= 1) and ($user_rating <= 5)) {
$currip = ( phpversion() <= '4.2.1' ? @getenv( 'REMOTE_ADDR' ) : $_SERVER['REMOTE_ADDR'] );
if ( !(int)$xid ){
$query = "SELECT * FROM #__content_rating WHERE content_id = " . $cid;
$db->setQuery( $query );
$votesdb = $db->loadObject();
if ( !$votesdb ) {
$query = "INSERT INTO #__content_rating ( content_id, lastip, rating_sum, rating_count )"
. "\n VALUES ( " . $cid . ", " . $db->Quote( $currip ) . ", " . $user_rating . ", 1 )";
$db->setQuery( $query );
$db->query() or die( $db->stderr() );;
} else {
if ($currip != ($votesdb->lastip)) {
$query = "UPDATE #__content_rating"
. "\n SET rating_count = rating_count + 1, rating_sum = rating_sum + " .   $user_rating . ", lastip = " . $db->Quote( $currip )
. "\n WHERE content_id = " . $cid;
$db->setQuery( $query );
$db->query() or die( $db->stderr() );
} else {
echo 0;
exit();
}
}
} else {
$query = "SELECT * FROM #__content_extravote WHERE content_id=".$cid." AND extra_id=".$xid;
$db->setQuery( $query );
$votesdb = $db->loadObject();
if ( !$votesdb ) {
$query = "INSERT INTO #__content_extravote  (content_id,extra_id,lastip,rating_sum,rating_count)"
. "\n VALUES (".$cid.",".$xid.",".$db->Quote($currip).",".$user_rating.",1)";
$db->setQuery( $query );
$db->query() or die( $db->stderr() );;
} else {
if ($currip != ($votesdb->lastip)) {
$query = "UPDATE #__content_extravote"
. "\n SET rating_count = rating_count + 1, rating_sum = rating_sum + " .  $user_rating . ", lastip = " . $db->Quote( $currip )
. "\n WHERE content_id=".$cid." AND extra_id=".$xid;
$db->setQuery( $query );
$db->query() or die( $db->stderr() );
} else {
echo 0;
exit();
}
}
}
echo 1;
}
*

Zuev

  • Захожу иногда
  • 211
  • 15 / 1
  • В дальнем плавании
поюзал галери, вернулся к фоке. и как раз вышла новая версия. фока все же лучшая
*

Zuev

  • Захожу иногда
  • 211
  • 15 / 1
  • В дальнем плавании
теперь надо найти куда этот код воткнуть в фоку
*

Zuev

  • Захожу иногда
  • 211
  • 15 / 1
  • В дальнем плавании
давайте разберем что к чему в верхнем
коде
Код
$user_rating    = JRequest::getInt('user_rating');//оценка выставленная юзером
$cid            = JRequest::getInt('cid'); //ИД (в данном случае материала "content ID"), за который ставили оценку
$xid = JRequest::getVar('xid'); //ума не приложу что это

if (($user_rating >= 1) and ($user_rating <= 5)) {//проверяем что бы оценка была в пределах от 1 до 5, страхуемся от сильно умных, которые знают как подправить адрес, так как оценка передается методом гет
$currip = ( phpversion() <= '4.2.1' ? @getenv( 'REMOTE_ADDR' ) : $_SERVER['REMOTE_ADDR'] );//считываем ИП юзера
if ( !(int)$xid ){//опять эта непонятная строка
$query = "SELECT * FROM #__content_rating WHERE content_id = " . $cid;
$db->setQuery( $query );
$votesdb = $db->loadObject();//считываем из таблици райтингов запись с ид текущего материала
if ( !$votesdb ) {//если такой записи в таблице нет, значит за нее голосуют впервые и доп проверка по ип не нужна
$query = "INSERT INTO #__content_rating ( content_id, lastip, rating_sum, rating_count )"
. "\n VALUES ( " . $cid . ", " . $db->Quote( $currip ) . ", " . $user_rating . ", 1 )";
$db->setQuery( $query );//записываюм в таблицу рейтингов запись с ИД контента, ИП последнего юзера за него проголосовавшим, общим рейтингом статьи и количество голосов
$db->query() or die( $db->stderr() );;
} else {// если такая запись в таблице существует, т.е. за данный материал голосуют не в первые, то
if ($currip != ($votesdb->lastip)) {//проверяем не равен ли ИП текущего пользователя с ИП последнего пользователя проголосовавшего за данный материал, если не равен, то
$query = "UPDATE #__content_rating"
. "\n SET rating_count = rating_count + 1, rating_sum = rating_sum + " .   $user_rating . ", lastip = " . $db->Quote( $currip )
. "\n WHERE content_id = " . $cid;
$db->setQuery( $query );//заносим последний голос в таблицу
$db->query() or die( $db->stderr() );
} else {//если ИП текущего пользователя равен ИПу последнего пользователя проголосовавшего за данный материал, то

echo 0;
exit();//выходим из функции
}
}
*

Zuev

  • Захожу иногда
  • 211
  • 15 / 1
  • В дальнем плавании
т.е. получается что один и тот же юзер в принципе может голосоват по нескольку раз, но только ему тогда нужно дождаться пока не проголосует кто-нибудь другой.
В принципе не плохой вариант и мне он подходит, надеюсь что вам тоже
*

Zuev

  • Захожу иногда
  • 211
  • 15 / 1
  • В дальнем плавании
продолжение эпопеи разрешения голосования незареганным юзерам здесь:http://joomlaforum.ru/index.php/topic,74248.0.html
*

anis

  • Захожу иногда
  • 130
  • 1 / 0
так а в фоку куда это прикрутить
*

Zuev

  • Захожу иногда
  • 211
  • 15 / 1
  • В дальнем плавании
пока работаю над этим, думаю что сегодня до вечера доделаю.
Пока приходится разрываться между решением этой задачи и основной работой
*

anis

  • Захожу иногда
  • 130
  • 1 / 0
с нетерпением будем ждать
*

Zuev

  • Захожу иногда
  • 211
  • 15 / 1
  • В дальнем плавании
и так, появились первые результаты.
все измененные файлы прикреплю к посту. А также постараюсь в кратце описать, что и зачем изменил.
Описываю пошагово, кому что будет непонятно, пишим сразу в форум,

1.В БД в таблице _phocagallery_votes тип поля userid меняем на varchar(50), до этого оно было int(11). Делается это для того чтобы в него можно было записать ИП юзера.

Кроме того, раз уж полезли в таблицу, предлагаю в таблице fur_phocagallery_votes_statistics изменить тип поля count на int.
Потому что тип эого поля установленный разработчиком ("tinyint(11)"), позволяет проголосовать только 127 юзером, больше голосов он не воспринимает. Эта проблема обсуждалась здесь http://joomlaforum.ru/index.php/topic,72687.0.html.


2. В файле ваш_сайт/components/com_phocagallery/controllers/category.php
- комментируем строку $user =& JFactory::getUser();, она нам больше не нужна, так мы будем работать не с зареганными юзерами.
-Изменили данные переменной $post['userid'] ранее в нее заносились данные из таблицы зареганных юзеров на сайте, теперь в нее заносится ип юзера.
Код
//$post['userid']	= $user->id;
//вместо ид записываем ип юзера
$post['userid'] = ( phpversion() <= '4.2.1' ? @getenv( 'REMOTE_ADDR' ) : $_SERVER['REMOTE_ADDR'] );
-Комментируем строки которые отвечают залогинился юзер или нет.
Код
//проверяет заголинился юзер или нет, нам не нужно	if ($user->aid > 0 && $user->id > 0) {
if(!$model->rate($post)) {
$msg = JText::_('Error Rating Phoca Gallery');
} else {
$msg = JText::_('Phoca Gallery Rated');
}
/* } else {
$mainframe->redirect(JRoute::_('index.php?option=com_user&view=login', false), JText::_("NOT AUTHORISED TO DO ACTION"));
exit;
}*/

3. В файле ваш_сайт/administrator/components/com_phocagallery/libraries/phocagallery/rate/ratecategory.php
-комеентируем оригинальный запрос к БД, и записываем свой
Код
function checkUserVote($catid, $userid) {

$db =& JFactory::getDBO();
/*$query = 'SELECT v.id AS id'
    .' FROM #__phocagallery_votes AS v'
    .' WHERE v.catid = '. (int)$catid
//.' AND v.userid = '. (int)$userid;
.' AND v.userid = '. $userid;
$db->setQuery($query, 0, 1);
$checkUserVote = $db->loadObject();*/

$query = "SELECT id FROM `#__phocagallery_votes` WHERE `catid` = '$catid'  AND `userid` = '$userid'";
$db->setQuery($query);
$checkUserVote = $db->loadObject();


if ($checkUserVote) {
return true;
}
return false;
}
Авторский запрос, не смотря ни на какие манипуляции с ним, так и не захотел работать.
Цель данного запроса считать из таблицы строку которая содержала бы ИП юзера и ИД статьи, если такая строка есть, то получается что юзер за данную статью пытается проголосовать дважды.

3.В файле ваш_сайт/components/com_phocagallery/views/category/tmpl
комментируем строки 18-42 и 52
Код
/*	if ($this->tmpl['alreadyrated']) {

echo '<ul class="star-rating">'
.'<li class="current-rating" style="width:'.$this->tmpl['voteswidth'].'px"></li>'
.'<li><span class="star1"></span></li>';

for ($i = 2;$i < 6;$i++) {
echo '<li><span class="stars'.$i.'"></span></li>';
}
echo '</ul>'
    .'<p>'.JText::_('You have already rated this category').'</p>';

} else if ($this->tmpl['notregistered']) {

echo '<ul class="star-rating">'
.'<li class="current-rating" style="width:'.$this->tmpl['voteswidth'].'px"></li>'
.'<li><span class="star1"></span></li>';

for ($i = 2;$i < 6;$i++) {
echo '<li><span class="stars'.$i.'"></span></li>';
}
echo '</ul>'
    .'<p>'.JText::_('Only registered and logged in user can rate this category').'</p>';

} else {*/

echo '<ul class="star-rating">'
    .'<li class="current-rating" style="width:'.$this->tmpl['voteswidth'].'px"></li>'
.'<li><a href="'.$this->tmpl['action'].$amp.'controller=category&task=rate&rating=1&tab='.$this->tmpl['currenttab']['rating'].$this->tmpl['limitstarturl'].'" title="1 '. JText::_('star out of').' 5" class="star1">1</a></li>';

for ($i = 2;$i < 6;$i++) {
echo '<li><a href="'.$this->tmpl['action'].$amp.'controller=category&task=rate&rating='.$i.'&tab='.$this->tmpl['currenttab']['rating'].$this->tmpl['limitstarturl'].'" title="'.$i.' '. JText::_('star out of').' 5" class="stars'.$i.'">'.$i.'</a></li>';
}
echo '</ul>';
// }
?>
Данный код не дает даже попробовать проголосовать если вы не алогинились, вот мы его и комментируем.
об этом уже писалось вот здесь http://joomlaforum.ru/index.php/topic,52912.0.html.

Так вроде это пока все изменения.


[вложение удалено Администратором]
*

Zuev

  • Захожу иногда
  • 211
  • 15 / 1
  • В дальнем плавании
теперь фока записывает в таблицу phocagallery_votes данные: catid (ид категории) userid(ип юзера, имя я менять не стал, дабы избежать ошибок),    date (дата голоса), rating(оценка), ну и остальное нас не интерисует.

Каждый новый голос добавляет дополнительную строку с этими данными в таблицу. Т.е. один юзер с одним ИП сможет всего один раз проголосовать за конкретную категорию.

И это не всегда хорошо, так многие юзеры ходят в инет через проксик, и это не их вина, а техническое решение провайдера. В принципе это не так кретично если у сайта широкая "географическая" аудитория, а если сайт ориентирован на небольшой городок (например "Токио" :) ) в котором один-два провайдера, то это проблема.

Поэтому возращаясь к решению предпринятому в екстравоте. там каждый голос не записывается новой строкой в БД. а просто в строке содержащей ИД категории обновляется запись "lastip". т.е. екстравоте запоминает только последний ип.
таким образом там запрещается голосовать за материал несколько раз подряд с одого ип, но если подождать пока проголосуют с другого ип, то можно будет потом еще раз щелкнуть по звездачкам.

Плюсы такого метода, 1. более гуманное отношение к юзерам сидящим под одним прокси-сервером. Какого-же у людей будет разочарование зашедшиг впервый на сайт, попробавших проголосовать, а им "вы уже голосовали".
2.В отличии от записи каждого нового голоса в БД, данный метод не так сильно будет раздувать базу.
« Последнее редактирование: 08.08.2009, 01:50:21 от Zuev »
*

Zuev

  • Захожу иногда
  • 211
  • 15 / 1
  • В дальнем плавании
Да кстати, в новой версии фоки появилось так же голосование за картинку, до этого доберемся позже, там алгоритм реализации рейтинга такой же как и в категориях.
*

Zuev

  • Захожу иногда
  • 211
  • 15 / 1
  • В дальнем плавании
На данный момент то что было мною описано уже протестировано и работоспособно. Так что можете проверять. Жду замечаний, предложений, пожеланий.

еще осталось реализовать две задачи, что бы фока запоминала только последний ип, а так же применить все здесь описанное не только к категориям, но и к картинкам.
« Последнее редактирование: 09.08.2009, 13:39:18 от Zuev »
*

Zuev

  • Захожу иногда
  • 211
  • 15 / 1
  • В дальнем плавании
теперь чтобы разрешить незарегестрированным посетителям голосовать не только за категорию но и за конкретное изображение необходимо проделать то же что делали и с категорией.
Начнем:

1. в файле ваш_сайт/components/com_phocagallery/controllers/detail.php
- комментируем строку 27;
- строку 37 удаляем, вместо нее пишем $post['userid']   = ( phpversion() <= '4.2.1' ? @getenv( 'REMOTE_ADDR' ) : $_SERVER['REMOTE_ADDR'] );
-комментируем строки 58, 64-67.

2. в файле ваш_сайт/components/com_phocagallery/views/detail/tmpl/default_rating.php
-комментируем строки 25-49, 59

3. в файле ваш_сайт/administrator/components/com_phocagallery/libraries/phocagallery/rate/rateimage.php
-изменяем запрос в БД на
      $query = "SELECT id FROM `#__phocagallery_img_votes` WHERE `imgid` = '$imgid'  AND `userid` = '$userid'";
      $db->setQuery($query);
      $checkUserVote = $db->loadObject();

4..В БД в таблице _phocagallery_img_votes тип поля userid меняем на varchar(50), до этого оно было int(11). Делается это для того чтобы в него можно было записать ИП юзера.

Кроме того, раз уж полезли в таблицу, предлагаю в таблице _phocagallery_img_votes_statistics изменить тип поля count на int.
Потому что тип этого поля установленный разработчиком ("tinyint(11)"), позволяет проголосовать только 127 юзером, больше голосов он не воспринимает. Эта проблема обсуждалась здесь http://joomlaforum.ru/index.php/topic,72687.0.html.
 
Вот и все после этого незарегестрированные юзеры могут голосовать за картинки, вдобавок реализована фильтрация по ИП, что бы лешить пользователя возможности голосовать за одну и туже картинку несколько раз.
*

Zuev

  • Захожу иногда
  • 211
  • 15 / 1
  • В дальнем плавании
В прошлом топике забыл прикрепить изменненые файлы.


[вложение удалено Администратором]
*

anis

  • Захожу иногда
  • 130
  • 1 / 0
Zuev спасибо огромнейшее все работает как часы.
Но есть несколько моментов в этой новой версии. первое так это то что когда голосуешь за фото, нажав на звездочку открывается еще одно окно с фото (и не очень оно удобно) возможно ли сделать чтоб просто нажав на звездочку сразу шел голос без открытия еще окна с фото. Это было бы очень классно
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

PhocaGallery

Автор rezchik

Ответов: 6
Просмотров: 515
Последний ответ 07.01.2024, 16:59:36
от SeBun
Русификация PhocaGallery 3 и 4 для Joomla 2.5\3.0

Автор HiopsNerevar

Ответов: 118
Просмотров: 95344
Последний ответ 11.03.2022, 16:24:13
от sergeytolkachyov
Сортировка категорий в столбцах/колонках PhocaGallery 3.2.2

Автор remix8080

Ответов: 0
Просмотров: 1462
Последний ответ 20.06.2021, 17:09:27
от remix8080
PhocaGallery 2.8.1 для Joomla 1.5

Автор iGoldSilver

Ответов: 3
Просмотров: 1645
Последний ответ 16.12.2020, 10:10:17
от iGoldSilver
PhocaGallery 4.1.2 убрать копирайт

Автор Sergey-N81

Ответов: 15
Просмотров: 13252
Последний ответ 30.11.2020, 04:07:12
от DarkDiver