ExtraBash Posted February 5, 2015 Report Share Posted February 5, 2015 (edited) Привет ребята.Вчера столкнулся с новой небольшой задачей,нужны были отзывы на сайт, вк не понравились,решил перекрутить комментарии стандартные. Вот такой вот результат: Для такого результата потребуется несколько манипуляций:1. Идем в базу и выполняем запрос: ALTER TABLE `s_comments` MODIFY `type` ENUM('product', 'blog', 'feedback') Что добавит нам дополнительный тип комментариев - отзывы. 2. Сделаем в админке, 2.1. Чтобы вызывались комментарии нового типа:В файле /simpla/CommentsAdmin.php // Выбирает объекты, которые прокомментированы: $products_ids = array(); $posts_ids = array(); $pages_ids = array(); foreach($comments as $comment) { if($comment->type == 'product') $products_ids[] = $comment->object_id; if($comment->type == 'blog') $posts_ids[] = $comment->object_id; if($comment->type == 'feedback') $pages_ids[] = $comment->object_id; } $products = array(); foreach($this->products->get_products(array('id'=>$products_ids)) as $p) $products[$p->id] = $p; $posts = array(); foreach($this->blog->get_posts(array('id'=>$posts_ids)) as $p) $posts[$p->id] = $p; $pages = array(); foreach($pages_ids as $p){ $pages[$p] = $this->pages->get_page($p); } foreach($comments as &$comment) { if($comment->type == 'product' && isset($products[$comment->object_id])) $comment->product = $products[$comment->object_id]; if($comment->type == 'blog' && isset($posts[$comment->object_id])) $comment->post = $posts[$comment->object_id]; if($comment->type == 'feedback' && isset($products[$comment->object_id])) $comment->page = $pages[$comment->object_id]; } Теперь функционально они вызываются. 2.2. Чтобы фильтровались и отображались комментарии нового типа:В файле /simpla/design/html/comments.tpl {* Заголовок *} <div id="header"> {if $keyword && $comments_count} <h1>{$comments_count|plural:'Нашелся':'Нашлось':'Нашлись'} {$comments_count} {$comments_count|plural:'комментарий':'комментариев':'комментария'}</h1> {elseif !$type} <h1>{$comments_count} {$comments_count|plural:'комментарий':'комментариев':'комментария'}</h1> {elseif $type=='product'} <h1>{$comments_count} {$comments_count|plural:'комментарий':'комментариев':'комментария'} к товарам</h1> {elseif $type=='blog'} <h1>{$comments_count} {$comments_count|plural:'комментарий':'комментариев':'комментария'} к записям в блоге</h1> {elseif $type=='feedback'} <h1>{$comments_count} {$comments_count|plural:'отзыв':'отзывов':'отзыва'}</h1> {/if} </div> И ниже в том-же файле: <!-- Категории товаров --> <ul> <li {if !$type}class="selected"{/if}><a href="{url type=null}">Все комментарии</a></li> </ul> <ul> <li {if $type == 'feedback'}class="selected"{/if}><a href='{url keyword=null type=feedback}'>Отзывы</a></li> <li {if $type == 'product'}class="selected"{/if}><a href='{url keyword=null type=product}'>К товарам</a></li> <li {if $type == 'blog'}class="selected"{/if}><a href='{url keyword=null type=blog}'>К блогу</a></li> </ul> <!-- Категории товаров (The End)--> 3. Теперь на самой странице3.1. Вызов комментариев и сохранение новогоФайл /view/PageView.php - добавим: // Принимаем комментарий if ($this->request->method('post') && $this->request->post('comment')) { $comment->name = $this->request->post('name'); $comment->text = $this->request->post('text'); $captcha_code = $this->request->post('captcha_code', 'string'); // Передадим комментарий обратно в шаблон - при ошибке нужно будет заполнить форму $this->design->assign('comment_text', $comment->text); $this->design->assign('comment_name', $comment->name); // Проверяем капчу и заполнение формы if ($_SESSION['captcha_code'] != $captcha_code || empty($captcha_code)) { $this->design->assign('error', 'captcha'); } elseif (empty($comment->name)) { $this->design->assign('error', 'empty_name'); } elseif (empty($comment->text)) { $this->design->assign('error', 'empty_comment'); } else { // Создаем комментарий $comment->object_id = $page->id; $comment->type = 'feedback'; $comment->ip = $_SERVER['REMOTE_ADDR']; // Если были одобренные комментарии от текущего ip, одобряем сразу $this->db->query("SELECT 1 FROM __comments WHERE approved=1 AND ip=? LIMIT 1", $comment->ip); if($this->db->num_rows()>0) $comment->approved = 1; // Добавляем комментарий в базу $comment_id = $this->comments->add_comment($comment); // Отправляем email $this->notify->email_comment_admin($comment_id); // Приберем сохраненную капчу, иначе можно отключить загрузку рисунков и постить старую unset($_SESSION['captcha_code']); header('location: '.$_SERVER['REQUEST_URI'].'#comment_'.$comment_id); } } // Комментарии к странице $comments = $this->comments->get_comments(array('type'=>'feedback', 'object_id'=>$page->id, 'approved'=>1, 'ip'=>$_SERVER['REMOTE_ADDR'])); $this->design->assign('comments', $comments); Обязательно до строки: return $this->design->fetch('page.tpl'); Теперь вызываются комментарии при загрузке страницы, а так-же сохраняются новые.3.2. Теперь прикрутим шаблон и вызов шаблонаЯ лично создал файл /design/default/html/otzyvy.tpl с содержанием: <!-- Комментарии --> <div id="comments"> {if $comments} <!-- Список с комментариями --> <ul class="comment_list"> {foreach $comments as $comment} <li> <a name="comment_{$comment->id}"></a> <!-- Имя и дата комментария--> <div class="comment_header"> {$comment->name|escape} <i>{$comment->date|date}, {$comment->date|time}</i> {if !$comment->approved}ожидает модерации</b>{/if} </div> <!-- Имя и дата комментария (The End)--> <!-- Комментарий --> {$comment->text|escape|nl2br} <!-- Комментарий (The End)--> </li> {/foreach} </ul> <!-- Список с комментариями (The End)--> {else} <p> Пока нет отзывов </p> {/if} <!--Форма отправления комментария--> <!--Подключаем js-проверку формы --> <script src="/js/baloon/js/default.js" language="JavaScript" type="text/javascript"></script> <script src="/js/baloon/js/validate.js" language="JavaScript" type="text/javascript"></script> <script src="/js/baloon/js/baloon.js" language="JavaScript" type="text/javascript"></script> <link href="/js/baloon/css/baloon.css" rel="stylesheet" type="text/css" /> <form class="comment_form" method="post" action=""> <h2>Написать отзыв</h2> {if $error} <div class="message_error"> {if $error=='captcha'} Неверно введена капча {elseif $error=='empty_name'} Введите имя {elseif $error=='empty_comment'} Введите комментарий {/if} </div> {/if} <textarea class="comment_textarea" id="comment_text" name="text" data-format=".+" data-notice="Введите отзыв">{$comment_text}</textarea><br /> <div> <label for="comment_name">Имя</label> <input class="input_name" type="text" id="comment_name" name="name" value="{$comment_name|escape}" data-format=".+" data-notice="Введите имя"/><br /> <input class="button" type="submit" name="comment" value="Отправить" /> <label for="comment_captcha">Число</label> <div class="captcha"><img src="captcha/image.php?{math equation='rand(10,10000)'}"/></div> <input class="input_captcha" id="comment_captcha" type="text" name="captcha_code" value="" data-format="\d\d\d\d" data-notice="Введите капчу"/> </div> </form> <!--Форма отправления комментария (The End)--> </div> <!-- Комментарии (The End) --> Это практически копия комментариев из блога.Ну и вывел их в /design/default/html/index.tpl <!-- Основная часть --> <div id="content"> {$content} {if $smarty.server.REQUEST_URI == '/otzyvy'} {include file='otzyvy.tpl'} {/if} </div> <!-- Основная часть (The End) --> -----------------------------------------------Вот, готово, остается только создать страницу со ссылкой "/otzyvy", или другую,какая вам нравится и вы получите на ней модерируемые отзывы. Такие дела. Думаю можно сделать штуку, чтобы в админке страниц галочкой помечалось где выводить такие,но это делать мне не нужно сейчас, поэтому я не делал.-----------------------------------------------Пользуйтесь на здоровье. Вопросы в skype - abashyrov Поставлю за 500 рубликов, если нужно.Если кому понравилось - можете закинуть мнеспасибо на киви +7 937 304-69-07-----------------------------------------------Вроде не забыл ничего. Edited February 5, 2015 by ExtraBash Quote Link to post Share on other sites
ps-simpla Posted February 5, 2015 Report Share Posted February 5, 2015 куда лучше было бы если создать отдельно вкладку Отзывы а не вместе с комментариями. {if $smarty.server.REQUEST_URI == '/otzyvy'} {include file='otzyvy.tpl'} {/if} сырая доработка, не в обиду. Допустим как вывести последние 5 отзывов на главную страницу? Quote Link to post Share on other sites
ExtraBash Posted February 5, 2015 Author Report Share Posted February 5, 2015 куда лучше было бы если создать отдельно вкладку Отзывы а не вместе с комментариями. {if $smarty.server.REQUEST_URI == '/otzyvy'} {include file='otzyvy.tpl'} {/if} сырая доработка, не в обиду. Допустим как вывести последние 5 отзывов на главную страницу?А я и не говорил, что на главную сунуть можно, и более того указал сразу на некоторые возможныенеудобства в работе, но мне более было не нужно, я более и не занимался. Ну придется обработку сунуть отдельно, и придется шаблон формы сунуть в мейн, а форыч ограничить до 5. Думаю у вас, как у профессионала займет минуты 3. Остальные смогут за 2 сунуть на любую другую страницу. Quote Link to post Share on other sites
Consult Posted February 6, 2015 Report Share Posted February 6, 2015 Полезно.Вопрос. А админ может на эти комментарии как-то отвечать?И еще самое важное, я как раз недавно сделал страницу /otzyvy и прикрутил туда комментарии от вкА можно туда вкладкой еще сделать ваши? чтобы у человека был выбор.Т.е заходит человек на страницу отзывов, а там открыта по умолчанию 1 вкладка допустим с комментариями от вк, и, нажав, на другой таб он переходит к стандартным комментариям. Quote Link to post Share on other sites
ExtraBash Posted February 6, 2015 Author Report Share Posted February 6, 2015 Полезно.Вопрос. А админ может на эти комментарии как-то отвечать?И еще самое важное, я как раз недавно сделал страницу /otzyvy и прикрутил туда комментарии от вкА можно туда вкладкой еще сделать ваши? чтобы у человека был выбор.Т.е заходит человек на страницу отзывов, а там открыта по умолчанию 1 вкладка допустим с комментариями от вк, и, нажав, на другой таб он переходит к стандартным комментариям.Первый вопрос - ну я думаю можно в pageView сделать ограничение, дабы какое-то имя аля Админимтратор нельзя было применить, и просто от его имени писать ответ. В целом такой штуки нет - это стандартный модуль комментариев. Второе - конечно можно, почему нет, otzyvy.tpl редактируем под табы http://jqueryui.com/tabs/ В одном выводите всё, что написано выше, в другом от вк. Quote Link to post Share on other sites
den_k2 Posted February 21, 2015 Report Share Posted February 21, 2015 Плиз подскажи как решитьWarning: Creating default object from empty value in view/PageView.php on line 37Warning: Cannot modify header information - headers already sent by (output started at ........./view/PageView.php:37)line 37: $comment->name = $this->request->post('name');уже и пересохранил в кодировке без вом спасибо Quote Link to post Share on other sites
Kosjak76 Posted February 21, 2015 Report Share Posted February 21, 2015 $comment = new stdClass();$comment->name = $this->request->post('name'); Quote Link to post Share on other sites
den_k2 Posted February 24, 2015 Report Share Posted February 24, 2015 $comment = new stdClass();$comment->name = $this->request->post('name'); Ок! Помогло Quote Link to post Share on other sites
hamelyon Posted April 16, 2015 Report Share Posted April 16, 2015 Ошибка /simpla/CommentsAdmin.php on line 116 Quote Link to post Share on other sites
hamelyon Posted April 19, 2015 Report Share Posted April 19, 2015 На главную методомtype=feedback Quote Link to post Share on other sites
voodoo_pan Posted November 23, 2016 Report Share Posted November 23, 2016 а где вы это взяли ?,<script src="/js/baloon/js/default.js" language="JavaScript" type="text/javascript"></script><script src="/js/baloon/js/validate.js" language="JavaScript" type="text/javascript"></script> это не стандартный набор ! Quote Link to post Share on other sites
gansito Posted January 14, 2017 Report Share Posted January 14, 2017 А как вывести у каждого коммента ссылку на товар к которому он относится? ну как в админке только на странице комментариев? {if $comment->type == 'product'}<a href="{$config->root_url}/products/{$comment->product->url}#comment_{$comment->id}">{$comment->product->name}</a>{/if}эта конструкция не выводит Quote Link to post Share on other sites
WIXVW Posted February 7, 2019 Report Share Posted February 7, 2019 (edited) Над комментариями горит красный кружочек с цифрой 1 и на странице товара он есть. а в самой вкладке пусто. ни одного комментария Edited February 7, 2019 by WIXVW Quote Link to post Share on other sites
Kami Posted February 7, 2019 Report Share Posted February 7, 2019 Над комментариями горит красный кружочек с цифрой 1 и на странице товара он есть. а в самой вкладке пусто. ни одного комментария смотрите в базе он записывается? Quote Link to post Share on other sites
WIXVW Posted February 7, 2019 Report Share Posted February 7, 2019 нет Quote Link to post Share on other sites
Kami Posted February 7, 2019 Report Share Posted February 7, 2019 нет Как может комментарий присутствовать в карточке товара, а в базе его не быть? Мы же о MySQL базе говорим я надеюсь? Quote Link to post Share on other sites
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.