Всем снова привет! Решил написать свой пост о модуле отзывов для Simpla CMS. Сейчас продают даже бесплатные решения, обидно за наших. Хотел бы поделиться скорее не модулем, а решением для реализации отзывов для интернет-магазина для Simpla.
Вам потребуется уйма времени и ровные руки. Я честно старался подготовить и максимально доходчиво изложить.
Поехали:
- Для начала создадим в базе данных таблицу для отзывов. Я назвал ее s_reviews (в зависимости от префикса у Вас имя таблицы может выглядеть по другому). Выполним для этого приведенный ниже sql запрос
-- -- Структура таблицы `s_reviews` -- CREATE TABLE IF NOT EXISTS `s_reviews` ( `id` bigint(20) NOT NULL, `date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `ip` varchar(20) NOT NULL, `name` varchar(255) NOT NULL, `message` text NOT NULL, `approved` int(1) NOT NULL DEFAULT '0' ) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8; -- -- Индексы таблицы `s_reviews` -- ALTER TABLE `s_reviews` ADD PRIMARY KEY (`id`); -- -- AUTO_INCREMENT для сохранённых таблиц -- -- -- AUTO_INCREMENT для таблицы `s_reviews` -- ALTER TABLE `s_reviews` MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=0;
Получится такая вот структура:
2. Создадим файл в папке api/ с названием Reviews.php, после заполним его содержимым (пошловато звучит xD):<?php /** * Simpla CMS * * @copyright 2011 Denis Pikusov * @link http://simplacms.ru * @author Denis Pikusov * */ require_once('Simpla.php'); class Reviews extends Simpla { // Возвращает комментарий по id public function get_review($id) { $query = $this->db->placehold("SELECT r.id, r.name, r.ip, r.type, r.text, r.date, r.approved FROM __reviews r WHERE id=? LIMIT 1", intval($id)); if($this->db->query($query)) return $this->db->result(); else return false; } public function get_reviews($filter = array(), $new_on_top = false) { // По умолчанию $limit = 0; $page = 1; $keyword_filter = ''; $approved_filter = ''; if(isset($filter['limit'])) $limit = max(1, intval($filter['limit'])); if(isset($filter['page'])) $page = max(1, intval($filter['page'])); if(isset($filter['approved'])) $approved_filter = $this->db->placehold("AND (r.approved=?)", intval($filter['approved'])); $sql_limit = $this->db->placehold(' LIMIT ?, ? ', ($page-1)*$limit, $limit); if(!empty($filter['keyword'])) { $keywords = explode(' ', $filter['keyword']); foreach($keywords as $keyword) $keyword_filter .= $this->db->placehold('AND r.name LIKE "%'.$this->db->escape(trim($keyword)).'%" OR r.message LIKE "%'.$this->db->escape(trim($keyword)).'%" '); } if($new_on_top) $sort='DESC'; else $sort='ASC'; $query = $this->db->placehold("SELECT r.id, r.name, r.ip, r.message, r.date, r.approved FROM __reviews r WHERE 1 $keyword_filter $approved_filter ORDER BY r.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 r.name LIKE "%'.$this->db->escape(trim($keyword)).'%" OR r.message LIKE "%'.$this->db->escape(trim($keyword)).'%" '); } $query = $this->db->placehold("SELECT count(distinct r.id) as count FROM __reviews r WHERE 1 $keyword_filter"); $this->db->query($query); return $this->db->result('count'); } public function add_reviews($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 update_review($id, $review) { $date_query = ''; if(isset($review->date)) { $date = $review->date; unset($review->date); $date_query = $this->db->placehold(', date=STR_TO_DATE(?, ?)', $date, $this->settings->date_format); } $query = $this->db->placehold("UPDATE __reviews SET ?% $date_query WHERE id in(?@) LIMIT 1", $review, (array)$id); $this->db->query($query); 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); } } }
3. В файле api/Simpla.php добавляем после
'comments' => 'Comments', 'feedbacks' => 'Feedbacks',
Этот код
'reviews' => 'Reviews',
4. В файле api/Managers.php после
'blog', 'comments', 'feedbacks',
добавляем
'reviews',
5. В папке simpla создаем файл ReviewsAdmin.php со следующим содержимым:
<?PHP require_once('api/Simpla.php'); ######################################## class ReviewsAdmin extends Simpla { function fetch() { // Поиск $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)) switch($this->request->post('action')) { case 'approve': { foreach($ids as $id) $this->reviews->update_review($id, array('approved'=>1)); break; } case 'delete': { foreach($ids as $id) $this->reviews->delete_review($id); break; } } } // Отображение $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); } $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'); } } ?>
На этом пожалуй все. Пишите вопросы. Может что дополнить надо, я как раз протестирую на одном проекте и внесу правки.
Спасибо за внимание!
Спасибо, это именно то, что нужно было. Без дискуссий как на форумах, всё чётко, всё работает.
Хотелось бы, конечно, чтобы ещё красный бабл загорался над пунктом меню «Комментарии», но это уже мелочи.
Помогите, пожалуйста.
1) Не работает кнопка «Одобрить» в админке возле отзыва (зеленая такая)
2) Тайтл и описание действительно не выводятся. Хотя до этого было все норм
3) есть ли возможность отвечать на отзыв?
1) Возможно у Вас какая-то проблема.
2) Этот момент не изучен.
3) Такой возможности в данном решении нет, но реализовать при желании можно
Планирую поднять дев сервер с работой этого скрипта и продолжить его поддерживать
У меня та же проблема как и у Владимира.
1. Не появляется информер нового отзыва в админке сайта, а сам отзыв есть.
2. Для страницы прописаны title и description, но браузеры их не видят.
Как исправить ? Хелп!!
2. Для страницы прописаны title и description, но браузеры их не видят.
да и сам я их не вижу тоже в коде страницы-там пусто….
Но страница то создана, в ней прописано?
страница создана и с админки прописаны тайтл и ключи.
но при просмотре исходного кода (ctrl u) там пусто.
PS со всеми др страницами все отлично.
Добрый день!
Страница отзывов установлена и работает, однако есть две проблемы:
1. Не появляется информер нового отзыва в админке сайта, а сам отзыв есть.
2. Для страницы прописаны title и description в админке, но браузеры их не видят.
Подскажите, пожалуйста, как можно найти и исправить указанные ошибки.
А можно как то сделать что бы файлы можно было прикреплять к отзывам?
нужно менять бекэнд
Здравствуйте. Страницу установил, проверил, всё работает. Однако есть косяк: на сайте произошло искажение блоков левого меню с товаром (стали слишком высокие) и шапка немного вниз ушла. Это произошло сразу после записи нового класса reviews в api/Simpla.php.
Что посоветуете?
скажу честно, что не в этом проблема
Все хорошо, а если есть на сайте менеджер то ему новая вкладка недоступна (
Здравствуйте! А в настройках посмотрите права.
Добрый вечер, права дал, но отключил один из пунктов, получается правило не все имеющиеся модули, а разрешенные, а где указать что он разрешен, и я не понял в вкладки
CommentsAdmin ведь тоже нужно выводить или нет вот в этом коде
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];
а его я у Вас не увидел или просто пропустил
а про права в файле manager тоже я не нашел не слова…. если у Вас есть время не могли бы подсказать …
Все разобрался, была ошибка в кавычках, ну в файл manager.tpl добавить ‘reviews’ =>’Отзывы’,
Все супер спасибо за Ваше внимание и открытую доработку ! С П А С И Б О !
заработало, только как то криво выглядит(
http://gilmutdinov.ru/reviews
как исправить?
Программная часть настроена, теперь нужно верстать. Верстайте под ваш макет
У меня не заработало, страница отзывов появилась, если например напишу отзыв, потом подтвержу его в админке, потом нажму F5 на странице отзывов и сайт превращается просто в белую страницу :(
Вышлите ссылку на сайт. И еще раз внимательно проверьте, что где добавили
Если у кого проблемы, обязательно отписываемся
Установил. Не выводит правильное время в отзыве. Показывает на всех время последнего отзыва и дату. В админке нету уведомления что был отзыв. Установил все по инструкции проверил 2 раза.
Помимо этого все нормально?
А для OkayCMS https://okay-cms.com/ такой модуль подойдет?
Здравствуйте! Этот модуль сугубо для Simpla CMS. Okay CMS по другому устроена, так что он не подойдет
Как-то можно сделать вывод в блоке слева?
Вывести до 5 отзывов и ссылку на страницу.
Конечно, но надо писать бекэнд для этого
К сожалению, нет