artbe Опубликовано 25 февраля, 2014 Жалоба Поделиться Опубликовано 25 февраля, 2014 ДД! Пытаюсь сделать "модуль" отзывы на отдельной странице. Делаю под версию 2.1.5 Прошу помощи в реализации! Пока, сделано так указано ниже и вроде все работает, отзывы добавляются. Но считаю это сделано "топорно" и не красиво. Просьба указать на явные косяки, а лучше допилить по нормальному и доделать все по "полочкам", если кто изъявит желанием Sql: CREATE TABLE IF NOT EXISTS `s_reviews` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `ip` varchar(20) NOT NULL, `name` varchar(255) NOT NULL, `email` varchar(255) NOT NULL, `text` text NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=72 ; -- -- Дамп данных таблицы `s_reviews` -- INSERT INTO `s_reviews` (`id`, `date`, `ip`, `name`, `email`, `text`) VALUES (70, '2014-02-25 16:43:37', '192.168.0.114', 'Иван', 'admin@yandex.ru', 'Админ яндекс'), (71, '2014-02-25 16:43:56', '192.168.0.114', 'Гугл', 'admin@google.ru', 'Админ гугл'); Далее, добавляю строчку в .htaccess # review RewriteRule ^review/?$ index.php?module=ReviewView [L,QSA] Далее создаем, в api/Reviews.php <?php require_once('Simpla.php'); class Reviews extends Simpla { // Возвращает отзыв по id public function get_review($id) { $query = $this->db->placehold("SELECT c.id, c.name, c.email, c.ip, c.text, c.date FROM __reviews c WHERE id=? LIMIT 1", intval($id)); if($this->db->query($query)) return $this->db->result(); else return false; } // Возвращает отзыв, удовлетворяющие фильтру public function get_reviews($filter = array()) { // По умолчанию $limit = 0; $page = 1; $type_filter = ''; $keyword_filter = ''; if(isset($filter['limit'])) $limit = max(1, intval($filter['limit'])); if(isset($filter['page'])) $page = max(1, intval($filter['page'])); if(isset($filter['ip'])) $ip = $this->db->placehold("OR c.ip=?", $filter['ip']); if($limit) $sql_limit = $this->db->placehold(' LIMIT ?, ? ', ($page-1)*$limit, $limit); else $sql_limit = ''; if(!empty($filter['keyword'])) { $keywords = explode(' ', $filter['keyword']); foreach($keywords as $keyword) $keyword_filter .= $this->db->placehold('AND c.name LIKE "%'.mysql_real_escape_string(trim($keyword)).'%" OR c.text LIKE "%'.mysql_real_escape_string(trim($keyword)).'%" OR c.email LIKE "%'.mysql_real_escape_string(trim($keyword)).'%" '); } $sort='DESC'; $query = $this->db->placehold("SELECT c.id, c.ip, c.name, c.email, c.date, c.text FROM __reviews c WHERE 1 $keyword_filter ORDER BY id $sort $sql_limit"); $this->db->query($query); return $this->db->results(); } // Количество отзывов, удовлетворяющих фильтру public function count_reviews($filter = array()) { $keyword_filter = ''; if(!empty($filter['keyword'])) { $keywords = explode(' ', $filter['keyword']); foreach($keywords as $keyword) $keyword_filter .= $this->db->placehold('AND c.name LIKE "%'.mysql_real_escape_string(trim($keyword)).'%" OR c.text LIKE "%'.mysql_real_escape_string(trim($keyword)).'%" OR c.email LIKE "%'.mysql_real_escape_string(trim($keyword)).'%" '); } $query = $this->db->placehold("SELECT count(distinct c.id) as count FROM __reviews c WHERE 1 $keyword_filter", $this->settings->date_format); $this->db->query($query); return $this->db->result('count'); } // Добавление отзыва public function add_review($review) { $query = $this->db->placehold('INSERT INTO __reviews SET ?%, date = NOW()', $review); if(!$this->db->query($query)) return false; $id = $this->db->insert_id(); return $id; } // Удаление отзыва public function delete_review($id) { if(!empty($id)) { $query = $this->db->placehold("DELETE FROM __reviews WHERE id=? LIMIT 1", intval($id)); $this->db->query($query); } } } Далее, в api/Simpla.php добавить: 'reviews' => 'Reviews' Далее создаем, в view/ReviewView.php <?PHP require_once('View.php'); class ReviewView extends View { function fetch() { // Принимаем отзыв if ($this->request->method('post') && $this->request->post('review')) { $review->name = $this->request->post('name'); $review->email = $this->request->post('email'); $review->text = $this->request->post('text'); // Передадим отзыв обратно в шаблон - при ошибке нужно будет заполнить форму $this->design->assign('review_text', $review->text); $this->design->assign('review_name', $review->name); $this->design->assign('review_email', $review->email); // Проверяем заполнение формы if (empty($review->name)) { $this->design->assign('error', 'empty_name'); } elseif(empty($review->email)) { $this->design->assign('error', 'empty_email'); } elseif (empty($review->text)) { $this->design->assign('error', 'empty_text'); } else { // Создаем отзыв $review->ip = $_SERVER['REMOTE_ADDR']; // Добавляем отзыв в базу $review_id = $this->reviews->add_review($review); // Отправляем email $this->notify->email_review_admin($review_id); // Приберем сохраненную капчу, иначе можно отключить загрузку рисунков и постить старую header('location: '.$_SERVER['REQUEST_URI'].'#review_'.$review_id); } } // Отзыв к товару $reviews = $this->reviews->get_reviews(array('ip'=>$_SERVER['REMOTE_ADDR'])); $this->design->assign('reviews', $reviews); $body = $this->design->fetch('review.tpl'); return $body; } } Далее, в шаблоне вашего дизайна добавить: review.tpl <!-- Комментарии --> {if $reviews} <!-- Список с комментариями --> <ul class="review_list"> {foreach $reviews as $review} <a name="review_{$review->id}"></a> <li> <!-- Имя и дата комментария--> <div class="review_header"> <hr /> <img src="design/default_1/images/noavatar.gif" id="profile" alt="Отзыв о товаре {$product->name|escape} оставил(а) {$review->name|escape}" title="Отзыв о товаре {$product->name|escape} оставил(а) {$review->name|escape}" /> <div id="comentput">{$review->name|escape} <i>{$review->date|date}, {$review->date|time}</i></div> </div> <!-- Имя и дата комментария (The End)--> <!-- Комментарий --> <br /> <div id="commtxt">{$review->text|escape|nl2br}</div> <br /> <!-- Комментарий (The End)--> </li> {/foreach} </ul> <!-- Список с комментариями (The End)--> {else} <p> Оставьте свой отзыв первым! </p> {/if} <!--Форма отправления комментария--> <form class="review_form" method="post"> {if $error} <div class="message_error"> {if $error=='empty_name'} Введите имя {elseif $error=='empty_email'} Введите E-mail {elseif $error=='empty_review'} Введите комментарий {/if} </div> {/if} <input class="quest" type="text" name="name" value="{$review_name}" data-format=".+" data-notice="Введите имя" placeholder="Ваше имя"/> <input class="quest" type="text" name="email" value="{$review_email}" data-format="email" data-notice="Введите email" placeholder="E-mail" /> <textarea class="quest2" name="text" data-format=".+" data-notice="Введите ваш отзыв" placeholder="Ваш отзыв">{$review_text}</textarea><br /> <div> <input class="button" type="submit" name="review" value="Отправить" /> </div> </form> <!--Форма отправления комментария (The End)--> <!-- Комментарии (The End) --> Далее, в simpla/ReviewsAdmin.php <?PHP require_once('api/Simpla.php'); ######################################## class ReviewsAdmin extends Simpla { function fetch() { $filter = array(); $filter['page'] = max(1, $this->request->get('page', 'integer')); $filter['limit'] = 40; // Поиск $keyword = $this->request->get('keyword', 'string'); if(!empty($keyword)) { $filter['keyword'] = $keyword; $this->design->assign('keyword', $keyword); } // Обработка действий if($this->request->method('post')) { // Действия с выбранными $ids = $this->request->post('check'); if(!empty($ids) && is_array($ids)) switch($this->request->post('action')) { case 'delete': { foreach($ids as $id) $this->reviews->delete_review($id); break; } } } // Отображение $reviews_count = $this->reviews->count_reviews($filter); // Показать все страницы сразу if($this->request->get('page') == 'all') $filter['limit'] = $reviews_count; $reviews = $this->reviews->get_reviews($filter, true); $this->design->assign('pages_count', ceil($reviews_count/$filter['limit'])); $this->design->assign('current_page', $filter['page']); $this->design->assign('reviews', $reviews); $this->design->assign('reviews_count', $reviews_count); return $this->design->fetch('reviews.tpl'); } } ?> Далее в simpla/design/html/reviews.tpl {* Вкладки *} {capture name=tabs} <li><a href="index.php?module=CommentsAdmin">Комментарии</a></li> <li><a href="index.php?module=FeedbacksAdmin">Обратная связь</a></li> <li class="active"><a href="index.php?module=ReviewsAdmin">Отзывы</a></li> {/capture} {* Title *} {$meta_title='Отзывы о магазине' scope=parent} {* Поиск *} {if $reviews || $keyword} <form method="get"> <div id="search"> <input type="hidden" name="module" value='ReviewsAdmin'> <input class="search" type="text" name="keyword" value="{$keyword|escape}" /> <input class="search_button" type="submit" value=""/> </div> </form> {/if} {if $reviews} <div id="main_list"> <!-- Листалка страниц --> {include file='pagination.tpl'} <!-- Листалка страниц (The End) --> <form id="list_form" method="post"> <input type="hidden" name="session_id" value="{$smarty.session.id}"> <div id="list" class="sortable"> {foreach $reviews as $review} <div class="{if !$review->approved}unapproved{/if} row"> <div class="checkbox cell"> <input type="checkbox" name="check[]" value="{$review->id}"/> </div> <div class="name cell"> <div class="review_name"> {if $review->email}<a href="mailto:{$review->email|escape}">{$review->name|escape}</a>{else}{$review->name|escape}{/if} </div> <div class="review_text"> {$review->text|escape|nl2br} </div> <div class="review_info"> Комментарий оставлен {$review->date|date} в {$review->date|time} </div> </div> <div class="icons cell"> <a class="edit" title="Редактировать" href="{url module=reviewAdmin id=$review->id return=$smarty.server.REQUEST_URI}"></a> <a class="delete" title="Удалить" href="#"></a> </div> <div class="clear"></div> </div> {/foreach} </div> <div id="action"> <span id="select"> <select name="action"> <option value="delete">Удалить</option> </select> </span> <input id="apply_action" class="button_green" type="submit" value="Применить"> </div> </form> <!-- Листалка страниц --> {include file='pagination.tpl'} <!-- Листалка страниц (The End) --> </div> {else} Нет отзывов {/if} {literal} <script> $(function() { // Удалить $("a.delete").click(function() { $('#list input[type="checkbox"][name*="check"]').attr('checked', false); $(this).closest(".row").find('input[type="checkbox"][name*="check"]').attr('checked', true); $(this).closest("form").find('select[name="action"] option[value=delete]').attr('selected', true); $(this).closest("form").submit(); }); $("form#list_form").submit(function() { if($('#list_form select[name="action"]').val()=='delete' && !confirm('Подтвердите удаление')) return false; }); }); </script> {/literal} В принципе все. Однако, в поля имени и email не подставляются данные пользователя. Убрана капча, и функция "одобрить" отзыв. И нет возможность редактировать и отвечать на коментарии + не сделано уведомление пользователя о коменте. Как то так, надеюсь кто то дополнит этот говнокод или выложит лучший вариант)) Цитата Ссылка на сообщение Поделиться на другие сайты
artbe Опубликовано 25 февраля, 2014 Автор Жалоба Поделиться Опубликовано 25 февраля, 2014 Да и забыл, неообходимо создать страницу отзывов с названием - review. + что то текст не выводится на этой стронице Цитата Ссылка на сообщение Поделиться на другие сайты
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.