-
Публікації
1 508 -
З нами
-
Відвідування
Тип публікації
Профілі
Форум
Маркетплейс
Статті
FAQ
Наші новини
Магазин
Блоги
module__dplus_manager
Повідомлення, опубліковані користувачем SooR
-
-
Шото я уже подустал, надо за пивом идти.Замените еще раз, обновил. В прошлый раз не сохранилось.
-
Обновил все архивы.
- 1
-
Качните еще раз файл Openstore_module_product_filter_1.0_(clean_install).rar, я забыл добавить туда файл category.php, или же сделайте пункт №6 ручной установки.Сделал чистую установку без префиксов в бд. Опции стали добавляться, однако при заходе в категорию выдает вот такой код
Warning: Missing argument 2 for ModelCatalogProduct::getTotalProductsByCategoryId(), called in Z:homelocalhostwww24catalogcontrollerproductcategory.php on line 101 and defined in Z:homelocalhostwww24catalogmodelcatalogproduct.php on line 64
- 1
-
Конечно! Забыл о префиксах, тогда запрос будет вида
CREATE TABLE IF NOT EXISTS `oc_category_option` ( `option_id` int(10) NOT NULL AUTO_INCREMENT, `type` int(1) DEFAULT '0', `sort_order` int(10) DEFAULT '0', PRIMARY KEY (`option_id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8;CREATE TABLE IF NOT EXISTS `oc_category_option_description` ( `option_id` int(10) NOT NULL DEFAULT '0', `language_id` int(10) NOT NULL DEFAULT '0', `name` varchar(127) DEFAULT NULL, PRIMARY KEY (`option_id`,`language_id`), KEY `name` (`name`)) ENGINE=MyISAM DEFAULT CHARSET=utf8;CREATE TABLE IF NOT EXISTS `oc_category_option_to_category` ( `option_id` int(11) NOT NULL, `category_id` int(11) NOT NULL, PRIMARY KEY (`category_id`,`option_id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8;CREATE TABLE IF NOT EXISTS `oc_category_option_value` ( `value_id` int(10) NOT NULL AUTO_INCREMENT, `option_id` int(10) DEFAULT '0', PRIMARY KEY (`value_id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8;CREATE TABLE IF NOT EXISTS `oc_category_option_value_description` ( `value_id` int(10) NOT NULL DEFAULT '0', `language_id` int(10) NOT NULL DEFAULT '0', `option_id` int(10) NOT NULL DEFAULT '0', `name` varchar(127) DEFAULT NULL, PRIMARY KEY (`value_id`,`language_id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8;CREATE TABLE IF NOT EXISTS `oc_product_to_value` ( `product_id` int(11) NOT NULL, `value_id` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`product_id`,`value_id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8;
- 1
-
Тут же я. Извиняюсь за опоздание, но я решил сделать полноценный модуль и не с фиксированными опциями, как у меня в примерах, а изменяемыми / дополняемыми из админки. При чем в базу данных для этого лезть не надо. Всё автоматизированно. И еще, сюда же включил AJAX листалку в категории и AJAX сортировку. Всё это активируется после первого изменения параметров фильтра со стороны пользователя за время нахождения в категории.
Опишу ф-ции модуля Opencart Product Filter 1.0 :-) :
добавление опций фильтра и значений к ним
указание сортировки опций
указание одной или нескольких категорий, в которых будет действовать данная опция
поддержка мультиязычности
указание опций фильтра на странице редактирования товара. В зависимости от выбранных категорий, во вкладку Опции фильтра будут подгружаться на лету опции этой категории.
AJAX подгрузка товаров категории при изменении состояния фильтра.
Индикатор активности фильтра (громко сказано, просто jQuery анимация при любых действиях с input'ами фильтра).
Если что, пишите в асю, сюда редко захожу.
Буду рад выслушать замечания или предложения.
В следующей версии хочу сделать еще несколько типов полей фильтра: слайдер, слайдер-диапазон, текстовое поле.
Перейдем к установке:
Если у вас чистая система и вы еще ничего в её коде не изменяли, то качайте архив Openstore_module_product_filter_1.0_(clean_install).rar и просто извлеките файлы в корень с заменой и выполните запрос в базу данных
CREATE TABLE IF NOT EXISTS `category_option` ( `option_id` int(10) NOT NULL AUTO_INCREMENT, `type` int(1) DEFAULT '0', `sort_order` int(10) DEFAULT '0', PRIMARY KEY (`option_id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8;CREATE TABLE IF NOT EXISTS `category_option_description` ( `option_id` int(10) NOT NULL DEFAULT '0', `language_id` int(10) NOT NULL DEFAULT '0', `name` varchar(127) DEFAULT NULL, PRIMARY KEY (`option_id`,`language_id`), KEY `name` (`name`)) ENGINE=MyISAM DEFAULT CHARSET=utf8;CREATE TABLE IF NOT EXISTS `category_option_to_category` ( `option_id` int(11) NOT NULL, `category_id` int(11) NOT NULL, PRIMARY KEY (`category_id`,`option_id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8;CREATE TABLE IF NOT EXISTS `category_option_value` ( `value_id` int(10) NOT NULL AUTO_INCREMENT, `option_id` int(10) DEFAULT '0', PRIMARY KEY (`value_id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8;CREATE TABLE IF NOT EXISTS `category_option_value_description` ( `value_id` int(10) NOT NULL DEFAULT '0', `language_id` int(10) NOT NULL DEFAULT '0', `option_id` int(10) NOT NULL DEFAULT '0', `name` varchar(127) DEFAULT NULL, PRIMARY KEY (`value_id`,`language_id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8;CREATE TABLE IF NOT EXISTS `product_to_value` ( `product_id` int(11) NOT NULL, `value_id` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`product_id`,`value_id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Если нет, то установка "вручную", или на систему, которая уже подвергалась изменениям в коде:1) Делаем запрос в базу данных
CREATE TABLE IF NOT EXISTS `category_option` ( `option_id` int(10) NOT NULL AUTO_INCREMENT, `type` int(1) DEFAULT '0', `sort_order` int(10) DEFAULT '0', PRIMARY KEY (`option_id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8;CREATE TABLE IF NOT EXISTS `category_option_description` ( `option_id` int(10) NOT NULL DEFAULT '0', `language_id` int(10) NOT NULL DEFAULT '0', `name` varchar(127) DEFAULT NULL, PRIMARY KEY (`option_id`,`language_id`), KEY `name` (`name`)) ENGINE=MyISAM DEFAULT CHARSET=utf8;CREATE TABLE IF NOT EXISTS `category_option_to_category` ( `option_id` int(11) NOT NULL, `category_id` int(11) NOT NULL, PRIMARY KEY (`category_id`,`option_id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8;CREATE TABLE IF NOT EXISTS `category_option_value` ( `value_id` int(10) NOT NULL AUTO_INCREMENT, `option_id` int(10) DEFAULT '0', PRIMARY KEY (`value_id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8;CREATE TABLE IF NOT EXISTS `category_option_value_description` ( `value_id` int(10) NOT NULL DEFAULT '0', `language_id` int(10) NOT NULL DEFAULT '0', `option_id` int(10) NOT NULL DEFAULT '0', `name` varchar(127) DEFAULT NULL, PRIMARY KEY (`value_id`,`language_id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8;CREATE TABLE IF NOT EXISTS `product_to_value` ( `product_id` int(11) NOT NULL, `value_id` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`product_id`,`value_id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8;
2) В файле adminviewtemplatecatalogproduct_form.tplПосле
<a tab="#tab_links"><?php echo $tab_links; ?></a>
Вставляем<a tab="#tab_filter">Опции фильтра</a>
После блока<div id="tab_general"></div>
Вставляем<!-- Start tab filter--> <div id="tab_filter"> Сначала необходимо выбрать категории товара </div> <!-- End tab filter-->
Теперь идем в конец файла, ДО<?php echo $footer; ?>
Вставляем<script type="text/javascript"><!--$.tabs('#tabs a'); $.tabs('#languages a'); //--></script><script type="text/javascript"><!--$('input[name=product_category[]]').live('change', function() { getOptions();});<?php if (isset($this->request->get['product_id'])) { ?> <?php $if_product_id = '&product_id=' . $this->request->get['product_id']; ?> getOptions();<?php } else { ?> <?php $if_product_id = ''; ?><?php } ?>function getOptions() { var loadUrl = ''; var fields = $("input[name=product_category[]]").serializeArray(); jQuery.each(fields, function(i, field){ if (i == 0) { loadUrl += field.value; } else { loadUrl += '_' + field.value; } }); $('#tab_filter').load('index.php?route=catalog/product/filter&token=<?php echo $token; ?><?php echo $if_product_id; ?>&path=' + loadUrl); }//--></script>
Сохраняем и закрываем.3) Открываем файл adminmodelcatalogproduct.php
После блока (метод addProduct)
if (isset($data['product_store'])) { foreach ($data['product_store'] as $store_id) { $this->db->query("INSERT INTO " . DB_PREFIX . "product_to_store SET product_id = '" . (int)$product_id . "', store_id = '" . (int)$store_id . "'"); } }
Вставляем// Start Filter if (isset($data['product_to_value_id'])) { foreach ($data['product_to_value_id'] as $value_id) { $this->db->query("INSERT INTO " . DB_PREFIX . "product_to_value SET product_id = '" . (int)$product_id . "', value_id = '" . (int)$value_id . "'"); } } // End filter
После блока (метод updateProduct)$this->db->query("DELETE FROM " . DB_PREFIX . "product_to_store WHERE product_id = '" . (int)$product_id . "'"); if (isset($data['product_store'])) { foreach ($data['product_store'] as $store_id) { $this->db->query("INSERT INTO " . DB_PREFIX . "product_to_store SET product_id = '" . (int)$product_id . "', store_id = '" . (int)$store_id . "'"); } }
Вставляем// Start filter $this->db->query("DELETE FROM " . DB_PREFIX . "product_to_value WHERE product_id = '" . (int)$product_id . "'"); if (isset($data['product_to_value_id'])) { foreach ($data['product_to_value_id'] as $value_id) { $this->db->query("INSERT INTO " . DB_PREFIX . "product_to_value SET product_id = '" . (int)$product_id . "', value_id = '" . (int)$value_id . "'"); } } // End filter
После (метод copyProduct)$data = array_merge($data, array('product_store' => $this->getProductStores($product_id)));
Вставляем// Start filter $data = array_merge($data, array('product_to_value_id' => $this->getProductValues($product_id))); // End filter
После (метод deleteProduct)$this->db->query("DELETE FROM " . DB_PREFIX . "product_to_store WHERE product_id = '" . (int)$product_id . "'");
Вставляем// Start filter $this->db->query("DELETE FROM " . DB_PREFIX . "product_to_value WHERE product_id = '" . (int)$product_id . "'"); // End filter
Идем в конец файла, до закрытия класса вставляем// Start filter public function getProductValues($product_id) { $values_id = array(); $query = $this->db->query("SELECT " . DB_PREFIX . "p2v.value_id AS value_id FROM " . DB_PREFIX . "product_to_value p2v WHERE p2v.product_id = '" . (int)$product_id . "'"); foreach ($query->rows as $result) { $values_id[] = $result['value_id']; } return $values_id; } // End filter
Сохраняем и закрываем4) Открываем admincontrollercatalogproduct.php
и идем в конец файла, до закрытия класса вставляем
// Start filter public function filter() { $this->load->model('catalog/filter'); $this->load->model('catalog/product'); $this->data['category_options'] = array(); if (isset($this->request->get['path']) && $this->request->get['path'] != '') { $parts = explode('_', $this->request->get['path']); $results = $this->model_catalog_filter->getOptionByCategoriesId($parts); if ($results) { foreach($results as $option) { $this->data['category_options'][] = array( 'option_id' => $option['option_id'], 'name' => $option['name'], 'type' => $option['type'], 'category_option_values' => $this->model_catalog_filter->getOptionValues($option['option_id']) ); } } else { $this->data['message'] = 'Этой категории товаров не присвоен ниодин фильтр'; } } else { $this->data['message'] = 'Сначала выберите категорию товаров'; } if (isset($this->request->get['product_id'])) { $product_id = $this->request->get['product_id']; } else { $product_id = 0; } $product_info = $this->model_catalog_product->getProductValues($product_id); if (isset($this->request->post['product_to_value_id'])) { $this->data['product_to_value_id'] = $this->request->post['product_to_value_id']; } elseif (isset($product_info)) { $this->data['product_to_value_id'] = $this->model_catalog_product->getProductValues($product_id); } else { $this->data['product_to_value_id'] = array(); } $this->data['language_id'] = $this->config->get('config_language_id'); $this->template = 'catalog/get_ajax_options.tpl'; $this->response->setOutput($this->render(TRUE), $this->config->get('config_compression')); } // End filter
Сохраняем и закрываем.5) Открываем catalogmodelcatalogproduct.php
Заменяем
public function getProductsByCategoryId($category_id, $sort = 'p.sort_order', $order = 'ASC', $start = 0, $limit = 20) {
Наpublic function getProductsByCategoryId($category_id, $values, $sort = 'p.sort_order', $order = 'ASC', $start = 0, $limit = 20) {
До блока$sort_data = array( 'pd.name', 'p.sort_order', 'special', 'rating', 'p.price', 'p.model' );
Вставляем// Start filter if (isset($values) && $values != '') { $data = array(); foreach (explode('_', $values) as $value_id) { $data[] = "value_id = '" . (int)$value_id . "'"; } $sql .= " AND p.product_id IN (SELECT " . DB_PREFIX . "product_id FROM " . DB_PREFIX . "product_to_value WHERE " . implode(" OR ", $data) . ")"; } // End filter
Заменяем весь метод public function getTotalProductsByCategoryIdНа
public function getTotalProductsByCategoryId($category_id = 0, $values) { $sql = "SELECT COUNT(*) AS total FROM " . DB_PREFIX . "product_to_category p2c LEFT JOIN " . DB_PREFIX . "product p ON (p2c.product_id = p.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) WHERE p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND p2c.category_id = '" . (int)$category_id . "'"; // Start filter if (isset($values) && $values != '') { $data = array(); foreach (explode('_', $values) as $value_id) { $data[] = "value_id = '" . (int)$value_id . "'"; } $sql .= " AND p.product_id IN (SELECT product_id FROM " . DB_PREFIX . "product_to_value WHERE " . implode(" OR ", $data) . ")"; } // End filter $query = $this->db->query($sql); return $query->row['total']; }
В этом же методе, до$query = $this->db->query($sql);
Вставляем// Start filter if (isset($values) && $values != '') { $data = array(); foreach (explode('_', $values) as $value_id) { $data[] = "value_id = '" . (int)$value_id . "'"; } $sql .= " AND p.product_id IN (SELECT product_id FROM " . DB_PREFIX . "product_to_value WHERE " . implode(" OR ", $data) . ")"; } // End filter
Сохраняем, закрываем.6) Открываем catalogcontrollerproductcategory.php
Заменяем
$product_total = $this->model_catalog_product->getTotalProductsByCategoryId($category_id);
На$product_total = $this->model_catalog_product->getTotalProductsByCategoryId($category_id, $values = NULL);
Заменяем$results = $this->model_catalog_product->getProductsByCategoryId($category_id, $sort, $order, ($page - 1) * $this->config->get('config_catalog_limit'), $this->config->get('config_catalog_limit'));
На$results = $this->model_catalog_product->getProductsByCategoryId($category_id, $values = NULL, $sort, $order, ($page - 1) * $this->config->get('config_catalog_limit'), $this->config->get('config_catalog_limit'));
7) Качаем архив Openstore_module_product_filter_1.0_(manual_install).rar и извлекаем в корень сайта с заменой.8) Идем в админку -> дополнения и включаем фильтр. Дальше думаю всё ясно.
- 4
-
Та уже вот дописываю. 95% общий прогресс, осталось красоту навести и подправить js для моментального отображения добавленной опции.Ну, а так же собрать все файлы в кучу и написать порядок установки.Ждите, сегодня-завтра выложу.
-
Права на папки скорее всего, т.к. эти скрипты работают с файловой структурой.
-
Fatal error: Call to undefined function utf8_decode() in /home/valer/data/www/konserva.ru/admin/controller/catalog/product.php on line 987
Не найдена функция utf8_decode() в контроллере admin/controller/catalog/product.php при попытке обращения к ней на строке 987.
utf8_decode() - это стандартная функция языка PHP с включенным модулем XML парсера.
100% хостинг.
Решение: пишите хостеру чтобы включили XML парсер и работала функция utf8_decode().
ИЛИ
удаляйте условие проверки длины вводимых данных в файле
/home/valer/data/www/konserva.ru/admin/controller/catalog/product.php
вот этот кусок
foreach ($this->request->post['product_description'] as $language_id => $value) { if ((strlen(utf8_decode($value['name'])) < 1) || (strlen(utf8_decode($value['name'])) > 255)) { $this->error['name'][$language_id] = $this->language->get('error_name'); } } if ((strlen(utf8_decode($this->request->post['model'])) < 1) || (strlen(utf8_decode($this->request->post['model'])) > 64)) { $this->error['model'] = $this->language->get('error_model'); }
-
Ну разумеется не передается, вы наверное не заметили внизу шаблона скрипт отправки get в контроллер?
if ($('#on_id').attr('checked')) { url += '&on_id=1'; }
Это добавить после
if ($('#description').attr('checked')) { url += '&description=1'; }
И не забудьте присвоить чекбоксу id="on_id".На счет "не все находит", есть два способа:
Возможно нужно принудительно указать тип переменной для $sql .= " AND pd.product_id = '" . $this->db->escape($keyword) . "'";
т.е. выйдет
$sql .= " AND pd.product_id = '" . (int)$keyword . "'";
Хоть я не уверен в правильности такого решения.
Второй способ глупый, но быстрый. Сымитируйте синтаксическую ошибку запроса SQL (напр указанием product_i вместо product_id) и посмотрите в дебаге что хочет вставить модель в запрос, когда дело касается поиска по id.
Возможно, что кроме числа передается пробел или что-то левое.
-
Конечно. Здесь напишу пошагово, если администрация не против.
-
Ну правильно. Делаешь чекбокс в шаблоне
<legend><input type="checkbox" name="on_id" value="" />По id (артикулу)</legend>
в модели catalogmodelcatalogproduct.php, в методе public function getProductsByKeyword добавь после аргумента $description = FALSE, вот это $on_id = FALSE,В этом же методе, замени конструкцию
if (!$description) { $sql .= " AND (LCASE(pd.name) LIKE '%" . $this->db->escape(strtolower($keyword)) . "%'";} else { $sql .= " AND (LCASE(pd.name) LIKE '%" . $this->db->escape(strtolower($keyword)) . "%' OR LCASE(pd.description) LIKE '%" . $this->db->escape(strtolower($keyword)) . "%')";}
на этуif ($description) { $sql .= " AND (LCASE(pd.name) LIKE '%" . $this->db->escape(strtolower($keyword)) . "%' OR LCASE(pd.description) LIKE '%" . $this->db->escape(strtolower($keyword)) . "%')";} elseif ($on_id) { $sql .= " AND pd.product_id = '" . $this->db->escape($keyword) . "'";} else { $sql .= " AND (LCASE(pd.name) LIKE '%" . $this->db->escape(strtolower($keyword)) . "%'";}
после этого осталось изменить путем копипаста контроллер сatalog/controller/product/search.phpпо аналогии с description
-
Эммм... а смысл тогда вводить название, если знать id?Не совсем понятно "если не нашел по названию, то нашел по product_id".По id то понятно что найдет)Я думал вы имеете ввиду, чтобы человек не парился с приблизительным поиском, то введя id он гарантированно попадет на нужный ему товар!?
-
Ну если принципиально забивать в $keyword еще и product_id, то массивом.
Почему бы не сделать по аналогии с category_id?
Тогда запрос выглядит как product/search&keyword=''&category_id=0&product_id=1234
-
Если хоть немного в ремесле разбираетесь, то чат установить не составит труда.
К примеру, воспользуйтесь этим готовым решением http://www.ajaxdaddy.com/demo-jquery-shoutbox.html
Еще есть такой вариант http://www.freeshoutbox.net/
такой http://borisding.com/projects/qshout/
это лучшее что видел http://tutorialzine.com/2010/10/ajax-web-chat-css-jquery/
Для "выставления" товаров нужно несколько дописать скрипт магазина. Просто модуля пока не видел.
-
Если вам нужен не навороченный форум, то могу поделиться своей собственной работой - форум для opencart.Использует общие с opencart библиотеки, модели, не требует интеграции, просто копирование файлов и запрос бд. Осталось добавить формы в админку. Вскоре выложу как дополнение.
-
Ну в общем с этим я тоже боролся.
В итоге делаю пока примитивным дополнением таблицы product полями-критериями для конкретной задачи, а потом в модели и контроллере дописываю необходимые критерии.
Вот что получилось в двух проектах
http://svobodamusic.net/music (нажать на фильтр материала)
и http://poliit.com.ua/index.php?route=product/category
Оба c AJAX.
В дальнейшем, хочу реализовать кастомное добавление опций и значений, при чем опции могут быть разных типов: чекбокс, радио, селект, слайдер и слайдер-диапазон. Можно еще текстовое поле с keyup, но есть поиск. Хотя если реализовать так фильтр, то нужда в поиске исчезнет.
Теперь вот думаю, что же выбрать, добавление полей ALTER'ом, что уж совсем низко, или же value_to_product.
- 2
-
http://bijouri.ru/busy-belye-konfetkiхотяб css пофикси.Модуль новостей мне удобней было писать в information.Т.е. структура такова information/news - всеinformation/news&news_id=32423424 если есть $_GET['news_id'] . . .Вот собственно первый опыт работы с openCart:1. http://bijouri.ru2. ocStore 0.1.3 + доработки3. 10 в сутки(сайту неделя)4. 2domains, 100 р/мес.5. Интернет-магазин женской бижутерии. Фабричная бижутерия и бижутерия ручной работы.
-
Моя городость )) 1. http://svobodamusic.net/index.php
2. Давно было, 1.4 ровно вродь.
3. эх, к сожалению теперь нулевая, в нашей гр-ной стране не фунциклирует цифровая подпись.
4. hostpro.ua, план Лучший
5. Торговая площадка авторской музыкой / аранжировками / джинглами и пр.
Делал на заказ. Подразумевался как клон http://audiojungle.net/.
Но решили по-другому.
Что было изменено и добавлено:
Изменен вход в систему.
Добавлены поля в регистрацию.
AJAX фильтр и листалка в категории.
Регистрация как автором так и пользователем.
Авторы могут заливать свои треки, автоматические присвоение стоимости файлу, исходя из длительности и привязанных форматов.
Автоматический расчет процентной ставки для автора, учитывая количество проданного.
Биллинговая панель с личным счетом.
И многое другое... в общем от опенкарта осталось ядро и библиотека)
2. Честно, не помню, одна из последних (у меня несколько версий, с и без storage)
3. пока 30-50 чел
4. hostpro.ua, план Именинник (висят еще 4 сайта)
5. Одежда. Прикрутил лупу для увеличения, AJAX листалку, AJAX фильтр по фиксированным критериям, прайс-лист. Дизайнер с меня фиговый, но в коде попыхтел.
2. Одна из последних
3. 40-50 чел
4. hostpro.ua, план Именинник (висят еще 4 сайта)
5. Архитектурная студия. Сайт портфолио. Куча графики и jQuery, это не магазин, но платформа идеальна и для галереи.
1. http://guitarsound.com.ua (реворк http://muztang.com.ua, который был на медленном виртуалмарте)
2. Одна из последних
3. 40-50 чел
4. hostpro.ua, план Оптима
5. Продажа аудиотехники.
Прикрутил новости, статьи с категориями, SEO к новостям и статьям и их категориям, изменил положение корзины и сделал возможным добавлять товары из категории. Существенный редизайн интерфейса стандартного OpenCart, смотрите в общем.
Есть еще пару проектов, но пока не в действии.
По любым вопросам и поделкам можете обращаться ко мне в личку, помогу чем смогу, поделюсь кодом.
-
Псевдонимы... псевдонимы... пора бы написать автотранслит. Минутное дело.Тем кто жалуется: есть две причины не работы SEO URL1. htaccess--1.1 Не удалено расширение ".txt" файла .htaccess--1.2 На хостинге не работает RewriteEngine On2. Не прописаны вручную каждому товару или категории псевдонимы в админке.
-
Я не проверял, но теоретически это должно работать.Замени в catalogmodeltoolseo_url.php
} elseif ($key == 'path') {$categories = explode('_', $value);foreach ($categories as $category) {$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE `query` = 'category_id=" . (int)$category . "'");if ($query->num_rows) {$url .= '/' . $query->row['keyword'];} else {return $link;}}unset($data[$key]);}
на это} elseif ($key == 'path') {$categories = explode('_', $value);$query = $this->db->query("SELECT * FROM " . DB_PREFIX . "url_alias WHERE `query` = 'category_id=" . (int)end($categories) . "'");if ($query->num_rows) {$url .= '/' . $query->row['keyword'];} else {return $link;}unset($data[$key]);}
-
yandex-lexa
Где ты там ансет увидел?
Может в оочень старой версии? В новых нету.
Да и он там не нужен, т.к. в
} elseif ($key == 'path') {
входитunset($data[$key]);
-
Создавая очередной магазин на Opencart, наткнулся на раздражающую проблему с дочерними категориями и присваивания им ссылок ЧПУ.
Если в категории с введенным полем "Псевдоним" (напр. computers) создать подкатегорию и не заполнять в ней поле "Псевдоним", то когда мы зайдем в категорию http://mysite.com/computers и захотим перейти в её дочернюю категорию - ничего не получится, мы останемся в этой же категории http://mysite.com/computers, а ссылка на дочернюю категорию будет вида http://mysite.com/computers, т.е. своего родителя, а не обычная ссылка без SEO_URL.
Т.е. вы сможете перейти в дочернюю категорию с включенным SEO_URL только после присвоения дочерней категории псевдонима для ЧПУ. А если нам это не надо?
Тогда, открываем файл ./catalog/model/tool/seo_url.php
И заменяем в нем условие (line 28)
if ($query->num_rows) { $url .= '/' . $query->row['keyword']; }
наif ($query->num_rows) { $url .= '/' . $query->row['keyword']; } else {return $link;}
-
В общем решил пока временным способом, разселив конфликтующие данные в разные таблицы.Теперь для входа используется customer, а остальная инфа в customer_info, поправив модели.Конечно, это крайне не удобно, но время поджимает.Пофиксю окончательно - напишу здесь что было.
-
Да в принципе проблема ясна - не логинит, если в поле обновилась колонка. Всё. Если обновилась - тупо не отдает $customer_query->num_rows (ну и подельшее) в systemlibrarycustomer.php.
А изменял я.... что я только не изменял. Почти всё ) кроме engine, и всё до этого момента работало нормально.
Таблица customer выглядит сейчас так:
CREATE TABLE IF NOT EXISTS `customer` ( `customer_id` int(11) NOT NULL auto_increment, `firstname` varchar(96) collate utf8_unicode_ci NOT NULL, `count_money` decimal(15,2) NOT NULL default '0.00', `sale_sum` decimal(15,2) NOT NULL default '0.00', `sales` int(11) NOT NULL default '0', `email` varchar(96) collate utf8_unicode_ci NOT NULL default '', `homepage` varchar(96) collate utf8_unicode_ci NOT NULL default '', `city` varchar(96) collate utf8_unicode_ci NOT NULL default '', `icq` varchar(32) collate utf8_unicode_ci NOT NULL default '', `welcome` varchar(256) collate utf8_unicode_ci NOT NULL default '', `wmz` varchar(96) collate utf8_unicode_ci NOT NULL, `avatar` varchar(256) collate utf8_unicode_ci NOT NULL default '', `password` varchar(40) collate utf8_unicode_ci NOT NULL default '', `newsletter` int(1) NOT NULL default '0', `exclusive` int(1) NOT NULL default '0', `status` int(1) NOT NULL, `group_id` int(1) NOT NULL, `ip` varchar(15) collate utf8_unicode_ci NOT NULL default '0', `date_added` datetime NOT NULL default '0000-00-00 00:00:00', PRIMARY KEY (`customer_id`), UNIQUE KEY `customer_id` (`customer_id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;
И такая беда появилась примерно после добавления колонки exclusive. Но параллельно этому, мог еще что начудить (
Уже менял systemlibrarycustomer.php на оригинал, меня контроллер login.php на оригинал и все-равно не пускает.
Думал что в БД хостера проблема, но на денвере тоже. php отвечает всем требованиям движка.
Нужен ли модуль "фильтр в категории" ?
в Модулі та розширення
Опубліковано: