Разделы

Jot + голосование. Оценки в комментариях, они же дополнительное поле - выпадающий список.

Была задача сделать положительные и отрицательные отзывы и вы водить результаты в разных местах, не только с комментариями. О том собственно и речь.
Информация о том как добавить дополнительное поле и проверить его легко гуглится. Однако если по аналогии добавлять выпадающий список он не проверяется. Тема поднималась на оф форуме и здесь. Но ни там ни там ответа не последовало. Но я как обычно полагал, что дело в руках разработчиков, а не в моих, и пару часов ковырял класс Jot выводя отладочную информацию, проверяя как он проводит валидацию полей. Выяснилось, однако, что если явно не указать отмеченным одно из полей браузеры просто не отправляют в POST этот параметр, даже пустой. И так приступим к делу.
В шаблон формы добавляем:
[+form.guest:is=`1`:then=`
	.............
		<label for="like[+jot.id+]">Понравилось ли*:<br />
		<select tabindex="6" name="like" id="like[+jot.id+]" size="1">
 			<option value="" selected></option>			
			<option value="1">Да, понравилось</option>
			<option value="0">Нет, не понравилось</option>
		</select></label><br />
	`:strip+]

Хочу отметить, что я вставил Этот код в блок с именем и емейлом, который не выводится, если менеджер залогинен. Это чтобы менеджерам тоже не пришлось голосовать, когда пишут комментарии. И ещё, если нужен сниппет, который будет ниже, значения value не трогаем.

Теперь, чтобы все видели, как думает комментировавший, вставляем в шаблон комментария:
<strong>нравится?:</strong> [+comment.custom.like:esc:is=`0`:then=`<span style="color:red;">Нет, не нравится</span>`:else=`<span style="color:green;">Да, нравится</span>`+]

Я делал два вызова jot. Вот они:
[!Jot? &action=`comments`   &tplComments=`jotComment` &customfields=`like,name,email`!]
[!Jot? &action=`form` &captcha=`1` &tplForm=`jotForm` &customfields=`name,email,like` &validate=`name:Вы не ввели своё имя,email:Поле с почтой заполнено не верно:email,like:вы не отметили понравилась ли Вам организация`!]

И сниппет, который ходит в базу считает и выводит комментарии:
<?php
/**
 * goodok - вывод результата опроса в jot
 * @category 	  snippet
 * @version 	  1.0
 * @license 	  http://www.gnu.org/copyleft/gpl.html GNU Public License (GPL)
 * @author        ManManovich (degunoid@gmaail.com)
 * @params        &template - имя чанка, с шаблоном. (не обязательно)
 * @params        &id - id документа, например для вызова в Ditto. По умолчанию documentIdentifier.
 * @placeholders  [+ok+] - хрошо [+bad+] - плохо :)    
 */
//подготовка переменных
if (empty($id)) $id=$modx->documentIdentifier;
if (empty($template)){
   $template = "<div style='width:90px; margin:0 auto;'><div style='color:green; float:left; text-align:center'>+[+ok+]</div><div style='color:red;float:right;text-align:center;'>-[+bad+]</div></div>";
}
else{
   $template = $modx->getChunk($template);
}

//выбираем id всех опубликованных комментов, в документе с заданным id
$query ='SELECT id FROM '.$modx->getFullTableName('jot_content').' WHERE published=1 AND uparent='.$id;
$result = $modx->db->query($query);
$ids = $modx->db->makeArray($result);

//готовим второй запрос за содержимым поля "понравилось"
$i=0;
if(!empty($ids)){
foreach($ids as $item){
   if($i == 0){ 
      $listIds = "id=".$item['id']." ";
   }
   else{
      $listIds .= "OR id=".$item['id']." ";
   }
$i++;
}
$query = "SELECT content FROM ".$modx->getFullTableName('jot_fields')." WHERE label='like' AND (".$listIds.")";
$result = $modx->db->query($query);
$result = $modx->db->makeArray($result);

//подсчёт лайков
foreach ($result as $item){
   if($item['content'] == 1) $ok++;
   if($item['content'] == 0) $bad++;
}

}
//готовим вывод и выводим
$output = str_replace(array("[+ok+]", "[+bad+]"), array($ok, $bad), $template);
return $output;
?>

ЗЫ По идее можно ещё сделать нейтральный отзыв, это совсем не сложно. Всего несколько строчек в разных местах.

Комментарии (8)

RSS свернуть / развернуть
0
а возможно ли использую данный способ оценивать не селектом а ссылками?
avatar

Paulo

  • 27 декабря 2011, 18:00
0
Это комментатор оценивает статью, документ, а не читающие оценивают комментарии. Значит судя по всему не нужно. Но если дать прямой ответ на вопрос, то на верняка можно. Я уже не помню как это всё работает :)
avatar

ManManovich

  • 28 декабря 2011, 14:16
0
понял, спасибо
avatar

Paulo

  • 28 декабря 2011, 14:28
0
avatar

Zinich66

  • 29 декабря 2011, 11:04
0
спасибо, но с тем способом есть проблемы, который автор пока игнорирует
avatar

Paulo

  • 29 декабря 2011, 13:36
0
это и есть автор :)
avatar

ManManovich

  • 29 декабря 2011, 13:42
0
незаметил)
avatar

Paulo

  • 29 декабря 2011, 14:06
0
помогите, пожалуйста :)
avatar

Paulo

  • 29 декабря 2011, 14:21

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.