Powered by CodeIgniter
dreycorp

dreycorp

9
9 голосов
  ПрофильБлог (11)Комментарии (144)ЗакладкиПродукты (2) 
Например есть новый раздел с материалами, называется «terminals».
Как добавить к нодам этого раздела комментарии?
Обновлено!
Эта инструкция не претендует на полную, но после этого все будет работать.

  • Создаем дополнительно 2 таблицы comments_terminals, comments_terminals_views. Структура аналогично comments_nodes и comments_nodes_views, только поле «nid», переименовываем на «tid».
    Почему «tid», потому что t — первая буква названия нашего раздела и в названия таблиц мы тоже добавили «terminals».
  • В конец вывода страницы материла после вывода самого материала добавляем что то вроде
    if($CI->user->get('id')){ $cnv = $CI->session->get('comments_terminals_views',TRUE); if(isset($cnv[$query['id']])) $query['last_comments'] = $cnv[$query['id']]['count']; } $CI->load->model('comments comments'); $CI->comments->set('terminals',array2object($query)); $com=$CI->comments->show(FALSE,TRUE); $CI->_template('comments сomments',array('comments'=>$com,'wrapper'=>TRUE,'type'=>'tree'),100); $CI->comments->form(); Где $query - массив с данными вашего материала. если вы используете объект, то array2object($query) на 6-й строке делать не надо.
  • В модель вашей шестеренки добавляем функцию, если нет подобной
    Возвращает объект с вашим материалом. function _query($param,$field = 'terminals.id'){ $CI =& get_instance(); $CI->db->select('terminals.*',FALSE); $CI->db->select('users.avatar,users.url_name as author_url_name,users.name as author'); $CI->db->join('users','users.id = terminals.aid','inner'); if(is_array($param)) $CI->db->where($param); else $CI->db->where($field,$param); return $this->db->get('terminals'); }
  • Редактируем файл /gears/mail/_hooks.php функция mail_comments_createdit_after_— метод отвечает за отправку сообщений на почте, при создании нового коммениария, находим там первый switch и добавляем еще одно условие
    case 'terminals': $item = $CI->terminals->query($data['tid'])->row(); break; где функция query - функция из модели, которую только-что создавали. во второй и третий switch добавляеи
    case 'terminals': $reply->link = $CI->node->create_link($item,'#comment-'.$reply->id); $CI->mail->send($author,FALSE,FALSE,t('mail reply_comment_subject',$item->name), 'comments/nodes/comment.reply',$reply); break; здесь используются стандартный шаблон письма, если хотите,то можете сделать свой
  • Шаблон comments.tpl из шестеренки comments должен иметь примерно такой вид
    {if $wrapper}<div id="comments">{/if} {foreach $comments as $comment} {include file="comments comment.tpl"} {/foreach} {if $wrapper}</div>{/if}
  • В шаблоне вывода вашего материала материал должен быть обернут в
    <div id="terminals-{$item.id}" class='... node'>...</div>
  • В файл info шестеренки добавляем
    required[] = comments


в принципе все хорошо, только после этого комментарии на сайте плохо работают, при заходе в любой материал комментарии отображаются не сразу, а только после обновления через ajax.
В новом разделе тоже самое + не работает ajax запрос на создание вложенного комментария (тут скорее всего проблема с JS, не знаю где подправить, если кто знает подскажите).

В общем вопрос, как добавлять комментарии к новым разделам и что я делаю не правильно или пропустил?
ВОПРОС РЕШЕН.
21:15 ← 26 июня 2010 Отправить в Твиттер dreycorpdreycorp  RSS comments 9

Комментарии (9) ↓

admin admin time 21:37 ← 26 июня 2010 #
Посмотри всю цепочку их работы вместе с хуками.
Автор
dreycorp dreycorp time 23:18 ← 26 июня 2010 #
Все разобрался! Проблема решилась изменением шаблона comments.tpl
{if $wrapper}<div id="comments">{/if} {foreach $comments as $comment} {include file="comment.tpl"} {/foreach} {if $wrapper}</div>{/if} на
{if $wrapper}<div id="comments">{/if} {foreach $comments as $comment} <div id="comment-{$comment.id}" class="comment{if $comment.class} {$comment.class}{/if}" {if !empty($type) && $type =='tree' && !empty($comment.level)}style="margin-left: {? $comment.level*3 > 20 ? 21 : $comment.level*3}em;"{/if}> {$comment.before} <div class="header">{$comment.header}</div> <div class="body">{$comment.body}</div> <div class="extra">{$comment.extra}</div> {$comment.after} </div> {/foreach} {if $wrapper}</div>{/if}
До этого все спотыкалось перед инклудом template, поэтому
напрямую выложен шаблон template, вместо инклуда.
Хотя все это не очень логично, но работает по неизвестной причине!
admin admin time 01:54 ← 27 июня 2010 #
Можно проще.
{if $wrapper}<div id="comments">{/if} {foreach $comments as $comment} {include file="comments comment.tpl"} {/foreach} {if $wrapper}</div>{/if}
Автор
dreycorp dreycorp time 09:07 ← 27 июня 2010 #
т.е в инклуде можно указывать название шестеренки, да так проще, спасибо!
еще вопрос, у шестеренки mail есть хук mail_comments_createdit_after_. Как я понял он отвечает за отправку сообщений при написании комментариев, его можно как-то хукнуть или лучше дописать?
admin admin time 13:36 ← 27 июня 2010 #
Его лучше проапргрейдить по аналогии.
Автор
dreycorp dreycorp time 13:45 ← 27 июня 2010 #
Понял, спасибо!

PS: Если кому интересно, то могу подробно описать, как прикручивать комментарии.
inetlover inetlover time 12:54 ← 28 июня 2010 #
Напиши, мне пригодится :-)
Автор
dreycorp dreycorp time 21:00 ← 28 июня 2010 #
Обновил.
inetlover inetlover time 00:40 ← 29 июня 2010 #
Спс. Добавил в закладки.