Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

SooR

Users
  • Posts

    1,511
  • Joined

  • Last visited

Everything posted by SooR

  1. https://opencartforum.com/topic/2654-%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8C-%D1%84%D0%B8%D0%BB%D1%8C%D1%82%D1%80-%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%BE%D0%B2-%D0%B2-%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B8-20/
  2. Фильтр товаров в категории 2.0 Демо: Shop Filter Возможности: админ: - создание неограниченного количества опций и значений фильтра; - присваивание опции к нескольким категориям; - присваивание значения опций к товару; - работает как обычный модуль. Позиционирование справа - слева, порядок вывода; пользователь: - выборка товаров по критериям (логику см. картинку); - отображение количества товаров для каждого следующего шага выборки опции-родителя и соседних опций, основываясь на текущей категории и логики выборки; - деактивация критерий с нулевым результатом количества товаров при следующем нажатии; - исключение AJAX дало возможность гарантированно получить данные и создать реальные страницы для поисковых роботов; - запрос с параметрами фильтра выглядит следующим образом: index.php?route=product/category&path=20&filter=1=2,3;3=11,10;4=18 где: переменная GET, опция, значения опции Установка на чистый OpenCart (OpenStore) затронет следующие файлы: admincontrollercatalogproduct.php admincontrollercommonheader.php adminlanguageenglishcatalogproduct.php adminlanguageenglishcommonheader.php adminlanguagerussiancatalogproduct.php adminlanguagerussiancommonheader.php adminmodelcatalogproduct.php adminviewtemplatecatalogproduct_form.tpl adminviewtemplatecommonheader.tpl catalogcontrollerproductcategory.php catalogmodelcatalogproduct.php Установка на чистый OS 1. Извлеките папки из архива openstore_filter_2.0_clean_install.zip в корень сайта с заменой. 2. Система -> пользователи -> группы пользователей -> Главный администратор [Изменить], ставим галки напротив catalog/filter и сохраняем. 3. Войдите в админ панель -> дополнения -> модули -> Фильтр товаров [изменить] -> и нажмите на кнопку "Установить таблицы". Если всё прошло как надо, появится соответствующее уведомление и после этого можно добавлять опции на странице Каталог -> Фильтр товаров. Внимание: проверено на последней версии Opencart v1.4.9.4 (March 19, 2011) с офф. сайта openstore_filter_2.0_clean_install.zip Added 18-07-2011 Установка вручную (thx afwollis) ---------------------------------------------------------------------------------------------------------------------------------------------- Вышла новая версия - 3.0. Возможности, цена вопроса и всё такое - ocfilter.com.
  3. AlexFisher, да, это второстепенные баги :) еще все затачивается. Жаль вы не застали когда я тестил этот плагин сортировки http://razorjack.net/quicksand/ на товарах) было занимательно. Но посчитали лишним.
  4. AlexFisher, спасибо. Да уже почти с месяцок работаю над ним, прикрутил RSS фиды, переключалку вида таблица-список с запоминанием, осталось написать модуль "Просмотренные товары", CSV импорт <-> экспорт и сравнение товаров методом исключения одинаковых параметров.
  5. Возврат изначально был реализован на fullAJAX библиотеке, но только из-за этого использовать целый фреймворк было не рационально, поэтому пользовался штатным функционалом jQuery. Исключение AJAX внушает стабильность и кроссбраузерность.
  6. Буду очень рад реализации от OpenCart, но нельзя ждать более, нужен сейчас. Пока погонял по параметрам, ошибок не обнаружено. Зарелизю на выходных.
  7. Доделываю модуль. С нуля. Ориентир на розетка.ком.юа (лат), оптимальный вариант фильтра. Самое сложное позади (: - формирование правильной ссылки с GET запросом и в зависимости от неё логика запроса в базу. Посмотреть фронт можно здесь http://dataplustest.ua.swteh.ru/index.php?route=product/category&path=20 Правильным будет
  8. Vetal на http://svobodamusic.net/music там даже не модуль, а рекодинг многих файлов, как бы заказ специфический был. Надо унифицировать и слайдеры, и текстовые поля для модуля. Цены относятся к отдельному полю таблицы product, поэтому если и делать, то в виде отдельной статичной опции в блоке "Фильтр" с включением из админки. На счет http://notik.if.ua/, здесь не ajax, там просто загружается сразу весь ассортимент продукции, а когда мы выбираем критерии, то просто лишняя скрывается с помощью CSS и идет перераспределение блоков. Плюс в том, что быстро. Минус - если много товаров, то первая загрузка будет долговато. По этому принципу лучше делать сортировку одностраничной таблицы. Как сделал здесь http://svobodamusic.net/music, или таблицы незначительных данных, деленной на несколько страниц.
  9. afwollis хорошее решение логики И-И для выборки по одному полю (value_id). Но столкнулся с проблемой. GROUP_CONCAT(DISTINCT value_id SEPARATOR '') - здесь сортировка значений не всегда совпадает с $values_without_underline. Проблема возникает, если параметры фильтра выстроены не по порядку. В общем, с этим кодом if (isset($values) && $values != '') { $values_without_underline = ""; $values_for_IN = ""; $values_arr = explode('_', $values); asort($values_arr); reset($values_arr); foreach ($values_arr as $value_id) { if (empty($values_for_IN)) { $values_for_IN = "'" . $value_id . "'"; } else { $values_for_IN .= ", '" . $value_id . "'"; } $values_without_underline .= $value_id; } $sql .= " AND (SELECT GROUP_CONCAT(DISTINCT value_id ORDER BY value_id ASC SEPARATOR '') FROM " . DB_PREFIX . "product_to_value WHERE product_id = p.product_id AND value_id IN (" . $values_for_IN . ")) = '" . $values_without_underline . "'"; } Всё работает безошибочно.Сортировал массив и получение value_id.
  10. Можно было просто заменить строку с 'live' на $('#filters input, #filters select').change(function() { в VI-м IE работает. В остальных думаю тоже. Сделал инсталл таблиц с админки. Отсюда - пропадают проблемы с префиксами.
  11. что на что сменили, если не секрет? :)Да на макось.Но начинаю понимать, что она в идеале подходит под медиа а коммуникации, общение, но не под веб девелоп, к сожалению
  12. Ребята, подождите немного, сделаю установку таблиц через админку, и с префиксами проблем не будет. Сейчас разбираюсь с софтом в связи с заменой ос.
  13. В запрос добавьте свой префикс oktclubru_bbs для каждой из таблиц
  14. Сделал. Для ручной установки, повторите пункт #4 с новым методом. Ну и архивы заменил.
  15. Заметил еще одну багу с радиокнопками. Надо как-то разделить имена, потому что если в фильтре две опции с радиокнопками, то будет переключение между всеми, а не внутри опции.Пока пришло на ум разделение с помощью option_id. Делаю.
  16. Обновил архивы! Добавил префиксы и сделал чтобы value_id не слетали при апдейте. wowkas Замените файлы снова.
  17. Да, с префиксами я не работал. Поэтому буду делать сбоку опенкарта с уже установленными фильтром и другими дополнениями.
  18. Шото я уже подустал, надо за пивом идти.Замените еще раз, обновил. В прошлый раз не сохранилось.
  19. Качните еще раз файл Openstore_module_product_filter_1.0_(clean_install).rar, я забыл добавить туда файл category.php, или же сделайте пункт №6 ручной установки.
  20. Конечно! Забыл о префиксах, тогда запрос будет вида 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;
  21. Тут же я. Извиняюсь за опоздание, но я решил сделать полноценный модуль и не с фиксированными опциями, как у меня в примерах, а изменяемыми / дополняемыми из админки. При чем в базу данных для этого лезть не надо. Всё автоматизированно. И еще, сюда же включил 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) Идем в админку -> дополнения и включаем фильтр. Дальше думаю всё ясно.
  22. Та уже вот дописываю. 95% общий прогресс, осталось красоту навести и подправить js для моментального отображения добавленной опции.Ну, а так же собрать все файлы в кучу и написать порядок установки.Ждите, сегодня-завтра выложу.
  23. Права на папки скорее всего, т.к. эти скрипты работают с файловой структурой.
×
×
  • Create New...

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.