-
Публікації
1 750 -
З нами
-
Відвідування
Тип публікації
Профілі
Форум
Маркетплейс
Статті
FAQ
Наші новини
Магазин
Блоги
module__dplus_manager
Повідомлення, опубліковані користувачем halfhope
-
-
Еще забыл упомянуть, что должен быть модуль, размещенный на странице ошибки (схема error/not_found). Он должен получить флаг о том, что seo_контроллер отработал свое, обработал УРЛ выдал правильную ссылку, затем слелал на нее редирект, запустился снова и поставил флаг. Грубо говоря сайт отправляет посетителя на страницу ошибки, но с нее не поступает 404, а поступает 301 на правильный УРЛ. Затем он проверяет УРЛ и ставит флаг о том, что пользователь находится в разделе списка галерей или в разделе галареи.
Вот так выглядит код модуля, который нужно размещать на странице ошибки:
if ($this->config->get("seogallery") != 1) { $this->load->controller('common/seo_gallery'); $this->config->set("seogallery", 1); if ($this->gallery_flag == 'photos') { $this->load->controller('gallery/photos'); $this->response->output(); exit(); } if ($this->gallery_flag == 'gallery') { $this->load->controller('gallery/gallery'); $this->response->output(); exit(); } }
-
Я неделю мучался с написанием своего контроллера для модуля фотогалерей, это был для меня тот еще путь страданий (неделю свободного времени убил). Так же знаю, что пользователь @markimax делал то же самое для своих мега модулей и помог мне в некоторых моментах. За что ему отдельное Спасибо. Вот Вам мой сео контроллер из модуля фотогалерей на базе кэшируемого seo_pro от @freelancer:
У меня там все проще, иерархии и категорий нет. В модуле есть всего 2 раздела
- gallery/gallery - список галерей
- gallery/photos&album_id=1 - галерея
Но думаю, в контроллер добавить функцию getPathByMyId($id) не составит труда (по аналогии смотрите как сделаны запросы ЧПУ категорий, там есть такая же иерархия). Хранятся ключи и значения SEO в своей таблице, которую нужно создать, чтобы не было конфликтов с другими seo контроллерами.
Для 1.5.x
<?php /** * @author Shashakhmetov Talgat <[email protected]> */ class ControllerCommonSeoGallery extends Controller { private $cache_data = null; private $current_store_id = 0; public function __construct($registry) { parent::__construct($registry); $this->current_store_id = $this->config->get('config_store_id'); $cache_name = 'seo_pro_gallery.' . $this->current_store_id; $this->cache_data = $this->cache->get($cache_name); if (!$this->cache_data) { $query = $this->db->query("SELECT LOWER(`keyword`) as 'keyword', `query` FROM " . DB_PREFIX . "url_alias_gallery WHERE store_id = " . $this->current_store_id); $this->cache_data = array(); foreach ($query->rows as $row) { $this->cache_data['keywords'][$row['keyword']] = $row['query']; $this->cache_data['queries'][$row['query']] = $row['keyword']; } $query = $this->db->query("SELECT LOWER(`keyword`) as 'keyword', `query` FROM " . DB_PREFIX . "url_alias_gallery WHERE query LIKE '%album_id=%'"); foreach ($query->rows as $row) { $this->cache_data['keywords'][$row['keyword']] = $row['query']; $this->cache_data['queries'][$row['query']] = $row['keyword']; } $this->cache->set($cache_name, $this->cache_data); } } public function index() { if ($this->config->get('config_seo_url')) { $this->url->addRewrite($this); }else{ return; } if (isset($_GET['_route_'])) $this->request->get['_route_'] = $_GET['_route_']; if (isset($_GET['route'])) $this->request->get['route'] = $_GET['route']; if (isset($this->request->get['album_id'])) { $this->request->get['route'] = 'gallery/photos'; if (isset($this->request->get['_route_'])) { $_route_ = $this->request->get['_route_']; unset($this->request->get['_route_']); } $this->validate(); if (isset($this->request->get['_route_'])) { $this->request->get['_route_'] = $_route_; } $this->response->addHeader($this->request->server['SERVER_PROTOCOL'] . '/1.1 200 OK'); return $this->gallery_flag = 'photos'; } if (isset($this->request->get['_route_'])) { $route = $this->request->get['_route_']; $parts = explode('/', trim(utf8_strtolower($route), '/')); list($last_part) = explode('.', array_pop($parts)); array_push($parts, $last_part); // var_dump($parts); foreach ($parts as $part) { $rows = array(); foreach ($parts as $keyword) { if (isset($this->cache_data['keywords'][$keyword])) { $rows[] = array('keyword' => $keyword, 'query' => $this->cache_data['keywords'][$keyword]); } } if (count($rows) == sizeof($parts)) { $queries = array(); foreach ($rows as $row) { $queries[utf8_strtolower($row['keyword'])] = $row['query']; } reset($parts); foreach ($parts as $part) { $url = explode('=', $queries[$part], 2); if (isset($url[0]) && $url[0] == 'album_id') { $this->request->get['album_id'] = $url[1]; $this->gallery_flag = 'photos'; } elseif (isset($url[0]) && $url[0] == 'gallery/gallery') { $this->gallery_flag = 'gallery'; if (!isset($this->request->get['gallery/gallery'])) { $this->request->get['route'] = 'gallery/gallery'; } else { $this->request->get['route'] = 'gallery/gallery'; } } elseif (isset($url[0]) && $url[0] == 'route') { $this->request->get['route'] = $url[1]; } elseif (count($url) > 1) { $this->request->get[$url[0]] = $url[1]; } } } } if (isset($this->request->get['album_id'])) { $this->response->addHeader($this->request->server['SERVER_PROTOCOL'] . '/1.1 200 OK'); $this->request->get['route'] = 'gallery/photos'; } elseif (isset($this->request->get['gallery/gallery'])) { $this->response->addHeader($this->request->server['SERVER_PROTOCOL'] . '/1.1 200 OK'); $this->request->get['route'] = 'gallery/gallery'; }else{ if (isset($queries[$parts[0]])) { $this->request->get['route'] = $queries[$parts[0]]; } } // var_dump($this->request); $_route_ =$this->request->get['_route_']; unset($this->request->get['_route_']); $this->validate(); $this->request->get['_route_'] = $_route_; if (isset($this->request->get['route'])) { $this->request->get['_route_'] = $this->request->get['route']; } return $this->gallery_flag; } } public function rewrite($link) { if (!$this->config->get('config_seo_url')) return $link; $seo_url = ''; $component = parse_url(str_replace('&', '&', $link)); $data = array(); if (isset($component['query'])) { parse_str($component['query'], $data); if (!isset($data['route'])) { return $link; } $route = $data['route']; unset($data['route']); $postfix = false; if ($route == 'gallery/photos') { if (isset($data['album_id'])) { $tmp = $data; $data = array(); $data['album_id'] = $tmp['album_id']; if (isset($tmp['limit'])) { $data['limit'] = $tmp['limit']; } if (isset($tmp['page'])) { $data['page'] = $tmp['page']; } $postfix = true; } } elseif ($route == 'gallery/gallery') { } else { return $link; } if ($component['scheme'] == 'https') { $link = $this->config->get('config_ssl'); } else { $link = $this->config->get('config_url'); } $link .= 'index.php?route=' . $route; if (count($data)) { $link .= '&' . urldecode(http_build_query($data, '', '&')); } $queries = array(); foreach ($data as $key => $value) { switch ($key) { case 'album_id': $config_gallery_galleries_include_seo_path = $this->config->get('config_gallery_galleries_include_seo_path'); if ($config_gallery_galleries_include_seo_path[$this->current_store_id]) { $queries[] = 'gallery/gallery'; } $queries[] = $key . '=' . $value; unset($data[$key]); $postfix = true; break; default: break; } } if (empty($queries)) { $queries[] = $route; } $rows = array(); foreach ($queries as $query) { if (isset($this->cache_data['queries'][$query])) { $rows[] = array( 'query' => $query, 'keyword' => $this->cache_data['queries'][$query] ); } } reset($data); if (count($rows) == count($queries)) { $aliases = array(); foreach ($rows as $row) { $aliases[$row['query']] = $row['keyword']; } foreach ($queries as $query) { $seo_url .= '/' . rawurlencode($aliases[$query]); } } if ($seo_url == '') return $link; if ($seo_url) { unset($data['route']); $query = ''; if ($data) { foreach ($data as $key => $value) { $query .= '&' . $key . '=' . $value; } if ($query) { $query = '?' . trim($query, '&'); } } $devider = $this->config->get('config_seo_url_postfix'); if (empty($devider) || !$postfix) { $devider = "/"; } $link = $component['scheme'] . '://' . $component['host'] . (isset($component['port']) ? ':' . $component['port'] : '') . str_replace('/index.php', '', $component['path']) . $seo_url . $devider . $query; return $link; } else { return $link; } } else { return $link; } } private function validate() { if (empty($this->request->get['route']) || $this->request->get['route'] == 'error/not_found') { return; } if (isset($this->request->server['HTTP_X_REQUESTED_WITH']) && strtolower($this->request->server['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') { return; } if (isset($this->request->server['HTTPS']) && (($this->request->server['HTTPS'] == 'on') || ($this->request->server['HTTPS'] == '1'))) { $url = str_replace('&', '&', $this->config->get('config_ssl') . ltrim($this->request->server['REQUEST_URI'], '/')); $seo = str_replace('&', '&', $this->url->link($this->request->get['route'], $this->getQueryString(array( 'route' )), 'SSL')); } else { $url = str_replace('&', '&', $this->config->get('config_url') . ltrim($this->request->server['REQUEST_URI'], '/')); $seo = str_replace('&', '&', $this->url->link($this->request->get['route'], $this->getQueryString(array( 'route' )), 'NONSSL')); } if (rawurldecode($url) != rawurldecode($seo)) { header($this->request->server['SERVER_PROTOCOL'] . ' 301 Moved Permanently'); $this->response->redirect($seo); } } private function getQueryString($exclude = array()) { if (!is_array($exclude)) { $exclude = array(); } return urldecode(http_build_query(array_diff_key($this->request->get, array_flip($exclude)))); } } ?>
Для 2.x
<?php /** * @author Shashakhmetov Talgat <[email protected]> */ class ControllerCommonSeoGallery extends Controller { private $cache_data = null; private $current_store_id = 0; public function __construct($registry) { parent::__construct($registry); $this->current_store_id = $this->config->get('config_store_id'); $cache_name = 'seo_pro_gallery.' . $this->current_store_id; $this->cache_data = $this->cache->get($cache_name); if (!$this->cache_data) { $query = $this->db->query("SELECT LOWER(`keyword`) as 'keyword', `query` FROM " . DB_PREFIX . "url_alias_gallery WHERE store_id = " . $this->current_store_id); $this->cache_data = array(); foreach ($query->rows as $row) { $this->cache_data['keywords'][$row['keyword']] = $row['query']; $this->cache_data['queries'][$row['query']] = $row['keyword']; } $query = $this->db->query("SELECT LOWER(`keyword`) as 'keyword', `query` FROM " . DB_PREFIX . "url_alias_gallery WHERE query LIKE '%album_id=%'"); foreach ($query->rows as $row) { $this->cache_data['keywords'][$row['keyword']] = $row['query']; $this->cache_data['queries'][$row['query']] = $row['keyword']; } $this->cache->set($cache_name, $this->cache_data); } } public function index() { if ($this->config->get('config_seo_url')) { $this->url->addRewrite($this); }else{ return; } if (isset($_GET['_route_'])) $this->request->get['_route_'] = $_GET['_route_']; if (isset($_GET['route'])) $this->request->get['route'] = $_GET['route']; if (isset($this->request->get['album_id'])) { $this->request->get['route'] = 'gallery/photos'; if (isset($this->request->get['_route_'])) { $_route_ = $this->request->get['_route_']; unset($this->request->get['_route_']); } $this->validate(); if (isset($this->request->get['_route_'])) { $this->request->get['_route_'] = $_route_; } $this->response->addHeader($this->request->server['SERVER_PROTOCOL'] . '/1.1 200 OK'); return $this->gallery_flag = 'photos'; } if (isset($this->request->get['_route_'])) { $route = $this->request->get['_route_']; $parts = explode('/', trim(utf8_strtolower($route), '/')); list($last_part) = explode('.', array_pop($parts)); array_push($parts, $last_part); // var_dump($parts); foreach ($parts as $part) { $rows = array(); foreach ($parts as $keyword) { if (isset($this->cache_data['keywords'][$keyword])) { $rows[] = array('keyword' => $keyword, 'query' => $this->cache_data['keywords'][$keyword]); } } if (count($rows) == sizeof($parts)) { $queries = array(); foreach ($rows as $row) { $queries[utf8_strtolower($row['keyword'])] = $row['query']; } reset($parts); foreach ($parts as $part) { $url = explode('=', $queries[$part], 2); if (isset($url[0]) && $url[0] == 'album_id') { $this->request->get['album_id'] = $url[1]; $this->gallery_flag = 'photos'; } elseif (isset($url[0]) && $url[0] == 'gallery/gallery') { $this->gallery_flag = 'gallery'; if (!isset($this->request->get['gallery/gallery'])) { $this->request->get['route'] = 'gallery/gallery'; } else { $this->request->get['route'] = 'gallery/gallery'; } } elseif (isset($url[0]) && $url[0] == 'route') { $this->request->get['route'] = $url[1]; } elseif (count($url) > 1) { $this->request->get[$url[0]] = $url[1]; } } } } if (isset($this->request->get['album_id'])) { $this->response->addHeader($this->request->server['SERVER_PROTOCOL'] . '/1.1 200 OK'); $this->request->get['route'] = 'gallery/photos'; } elseif (isset($this->request->get['gallery/gallery'])) { $this->response->addHeader($this->request->server['SERVER_PROTOCOL'] . '/1.1 200 OK'); $this->request->get['route'] = 'gallery/gallery'; }else{ if (isset($queries[$parts[0]])) { $this->request->get['route'] = $queries[$parts[0]]; } } // var_dump($this->request); $_route_ =$this->request->get['_route_']; unset($this->request->get['_route_']); $this->validate(); $this->request->get['_route_'] = $_route_; if (isset($this->request->get['route'])) { $this->request->get['_route_'] = $this->request->get['route']; } return $this->gallery_flag; } } public function rewrite($link) { if (!$this->config->get('config_seo_url')) return $link; $seo_url = ''; $component = parse_url(str_replace('&', '&', $link)); $data = array(); if (isset($component['query'])) { parse_str($component['query'], $data); if (!isset($data['route'])) { return $link; } $route = $data['route']; unset($data['route']); $postfix = false; if ($route == 'gallery/photos') { if (isset($data['album_id'])) { $tmp = $data; $data = array(); $data['album_id'] = $tmp['album_id']; if (isset($tmp['limit'])) { $data['limit'] = $tmp['limit']; } if (isset($tmp['page'])) { $data['page'] = $tmp['page']; } $postfix = true; } } elseif ($route == 'gallery/gallery') { } else { return $link; } if ($component['scheme'] == 'https') { $link = $this->config->get('config_ssl'); } else { $link = $this->config->get('config_url'); } $link .= 'index.php?route=' . $route; if (count($data)) { $link .= '&' . urldecode(http_build_query($data, '', '&')); } $queries = array(); foreach ($data as $key => $value) { switch ($key) { case 'album_id': $config_gallery_galleries_include_seo_path = $this->config->get('config_gallery_galleries_include_seo_path'); if ($config_gallery_galleries_include_seo_path[$this->current_store_id]) { $queries[] = 'gallery/gallery'; } $queries[] = $key . '=' . $value; unset($data[$key]); $postfix = true; break; default: break; } } if (empty($queries)) { $queries[] = $route; } $rows = array(); foreach ($queries as $query) { if (isset($this->cache_data['queries'][$query])) { $rows[] = array( 'query' => $query, 'keyword' => $this->cache_data['queries'][$query] ); } } reset($data); if (count($rows) == count($queries)) { $aliases = array(); foreach ($rows as $row) { $aliases[$row['query']] = $row['keyword']; } foreach ($queries as $query) { $seo_url .= '/' . rawurlencode($aliases[$query]); } } if ($seo_url == '') return $link; if ($seo_url) { unset($data['route']); $query = ''; if ($data) { foreach ($data as $key => $value) { $query .= '&' . $key . '=' . $value; } if ($query) { $query = '?' . trim($query, '&'); } } $devider = $this->config->get('config_seo_url_postfix'); if (empty($devider) || !$postfix) { $devider = "/"; } $link = $component['scheme'] . '://' . $component['host'] . (isset($component['port']) ? ':' . $component['port'] : '') . str_replace('/index.php', '', $component['path']) . $seo_url . $devider . $query; return $link; } else { return $link; } } else { return $link; } } private function validate() { if (empty($this->request->get['route']) || $this->request->get['route'] == 'error/not_found') { return; } if (isset($this->request->server['HTTP_X_REQUESTED_WITH']) && strtolower($this->request->server['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') { return; } if (isset($this->request->server['HTTPS']) && (($this->request->server['HTTPS'] == 'on') || ($this->request->server['HTTPS'] == '1'))) { $url = str_replace('&', '&', $this->config->get('config_ssl') . ltrim($this->request->server['REQUEST_URI'], '/')); $seo = str_replace('&', '&', $this->url->link($this->request->get['route'], $this->getQueryString(array( 'route' )), 'SSL')); } else { $url = str_replace('&', '&', $this->config->get('config_url') . ltrim($this->request->server['REQUEST_URI'], '/')); $seo = str_replace('&', '&', $this->url->link($this->request->get['route'], $this->getQueryString(array( 'route' )), 'NONSSL')); } if (rawurldecode($url) != rawurldecode($seo)) { header($this->request->server['SERVER_PROTOCOL'] . ' 301 Moved Permanently'); $this->response->redirect($seo); } } private function getQueryString($exclude = array()) { if (!is_array($exclude)) { $exclude = array(); } return urldecode(http_build_query(array_diff_key($this->request->get, array_flip($exclude)))); } } ?>
Таблица:
$sql[] = "CREATE TABLE IF NOT EXISTS `" . DB_PREFIX . "url_alias_gallery` ( `url_alias_id` int(11) NOT NULL AUTO_INCREMENT, `query` varchar(255) NOT NULL, `keyword` varchar(255) NOT NULL, `store_id` int(11) NOT NULL, PRIMARY KEY (`url_alias_id`), KEY `query` (`query`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;";
-
Так и не получится) Решением может стать написание своего класса в котором инициализируется и определяется город. В OpenCart этот класс можно внедрить как библиотеку (system/library) или хелпер (system/library/helper). в index.php его можно подключить и инциализировать, затем нужно добавить его в реестр, чтобы можно было пользоваться в контексте OpenCart. Если он (класс для определения геолокации) используется только в модулях, то можно инициализировать его только в модулях используя встроенный механизм для загрузки библиотек или хелперов.
-
-
Готовых решений, к сожалению, нет. По крайней мере я не встречал. Я как-то делал ссылки вида http://site.ru/product/product-name.html по аналогии можно сделать и с категориями.
Напишите какими именно должны быть ссылки на товар и на категории, может смогу помочь, так же прикрепите к сообщению seo контроллер сайта (они бывают разные) рекомендую кэшируемый seo_pro.
Просьба цитировать комментарии на форуме, а то уведомления о том что в тему ответили не поступают, если ты не подписан на эту тему, а подписываться каждый раз лень.
-
Только если переписать seo контроллер. catalog/controller/common/seo_url.php или seo_pro.php
-
-
-
Это в админке, у вас же там работает?
Видимо я опять долго не спал, написал инструкцию для вывода данных в витрине магазина.
-
-
Так для каталога (витрины) отдельные контролеры и модели. Они находятся в папке catalog. Вам нужно:
- Добавить в модели получение данных из бд. catalog/model/catalog/product.php
- В контроллере товара получить данные из модели catalog/controller/product/product.php и добавить их в массив $this->data либо $data для версии 2.x чтобы они были доступны в шаблоне
- В шаблоне вывести эти данные catalog/view/theme/название-темы/template/product/product.tpl
К примеру:
- В модель добавили новую функцию getProductexamples($product_id)
- В контроллере получаем данные из модели $this->data['product_examples] = $this->model_catalog_product->getProductexamples($product_id); (код я привел для примера)
- В шаблоне выводим var_dump($product_examples);
-
на opencart 2.1.0.1 с ocmod работает? :)
Не проверял
-
Class 'Controllercommonfooter' not found - Класс не найден!!!. Ищите какой из модификаторов правит файл controller/common/footer.php и отключите го, либо поправьте, чтобы не удалял лишнего.
-
Проще будет его допилить
-
Да, есть. Возможно смогу решить проблему.
Проблема в созданных в runtime элементах. Если от них избавиться, то все заработает.
-
Может быть проблема в CKeditor, может быть в max_input_vars, вообще в ем угодно. Могу помочь, пишите в ЛС.
-
вы местный троль ?
нормальным был бы написал бы в личку за подробностями,
не хочу сайт показывать . Имею право ?
Нормальный человек написал в личку.
Нет, ну серьезно, хотя бы больше подробностей в следующий раз публикуйте.
-
Есть еще настраиваемая доставка, большой хороший и очень полезный модуль, только найти его не могу.
-
-
Шаблон OC стандартный, я имею ввиду установил шаблон, т.е. путь к другому файлу css для конкретного товара. Css просто скопировал и переименовал. OC 1.5.5.1
Это модуль не для подключения CSS файлов, а для подмены tpl файлов) Если я правильно понял, то вам нужно подключить CSS файл на конкретной странице. Если так, то попробуйте создать копию файла product.tpl, и в этой копии подключить Ваш css файл. Затем в модуле укажите путь к tpl файлу.
-
Здравствуйте, а подскажите, пожалуйста, что сделать, установил шаблон для отдельного товара, а вместо страницы он мне выводит на экран стили такого типа:
html { overflow-y: scroll; margin: 0; padding: 0; } body { background-color: #ffffff; color: #000000; font-family: Arial, Helvetica, sans-serif; margin: 0px; padding: 0px; } body, td, th, input, textarea, select, a { font-size: 12px; } h1, .welcome { color: #636E75; font: Verdana; margin-top: 0px; margin-bottom: 20px; font-size: 32px; font-weight: normal; text-shadow: 0 0 1px rgba(0, 0, 0, .01); }
Проблема скорей всего в самом в шаблоне, смотрите код шаблона.
-
Могу помочь с vqmod, интересно что там не так. А вот с модулем не помогу, увы. Если интересно, пишите в ЛС.
-
Тоже рекомендую PRO версию. Модуль отличный.
-
У меня такая же проблема,никак не могу додумать,как исправить...Подскажите,поэтапно и доходчиво
Т.е. надо поменять тип таблиц с InnoDB на MyISAM? Я правильно понял? Это никак не скажется на системе? В SQL файле у таблиц, которые используют полнотекстовый индекс, замените InnoDB на MyISAM.
Не ставится Расширение
в Встановлення, оновлення, налаштування
Опубліковано:
Смотрите не стандартный лог ошибок, который встроен в OpenCart, а тот, в который PHP записывает ошибки. Если не знаете где он - спросите у тех. поддержки.