-
Публікації
1 508 -
З нами
-
Відвідування
Тип публікації
Профілі
Форум
Маркетплейс
Статті
FAQ
Наші новини
Магазин
Блоги
module__dplus_manager
Повідомлення, опубліковані користувачем SooR
-
-
Цитирую
Внимание: проверено на последней версии OpenStore v1.4.9.4 (March 19, 2011) с офф. сайта
Т.е. поставил двиг, поверх модуль. Тогда все ок. Остальные нужно смотреть.
lampard что именно не работает? Я зашел, все ок..
-
Там нет никакого AJAX.
В файле
catalog\controller\product\product.php
Замените
'price' => (float)$option_value['price'] ? $this->currency->format($this->tax->calculate($option_value['price'], $product_info['tax_class_id'], $this->config->get('config_tax'))) : FALSE,
на
'price' => (float)$option_value['price'] ? $this->currency->format($this->tax->calculate((($option_value['prefix'] == '+') ? ($product_info['price'] + $option_value['price']) : ($product_info['price'] - $option_value['price'])), $product_info['tax_class_id'], $this->config->get('config_tax'))) : FALSE,
Это и есть одна строка.
Только теперь надо с шаблона убрать вывод префикса
catalog\view\theme\default\template\product\product.tpl
<?php echo $option_value['prefix']; ?>
-
Да если дело только в этом, то одна строка переписывается...
-
Ну тут несколько причин:
Как уже говорилось, LIKE здесь неуместен, как и выборка по символьным вхождениям.
Всегда быстрее делать что-либо с целыми числами, поэтому вместо поиска символьных значений, нужно было присвоить каждому значению свой идентификатор, так, например, ваши критерии выглядели бы:
... <td>Увлечения <ul><li><input type="radio" name="hobbies" value="10">Футбол</li> <li><input type="radio" name="hobbies" value="11">Спорт</li> <li><input type="radio" name="hobbies" value="12">Атлетика</li> <li><input type="radio" name="hobbies" value="13">Прогулки</li> <li><input type="radio" name="hobbies" value="14">Книги</li> <li><input type="radio" name="hobbies" value="15">Диско</li> </ul></td></tr></tbody></table> ...
тогда запрос выглядел бы:
SELECT * FROM `girls` WHERE ... `color_eye` = `3` AND `hobbies` = `15` ...
Второе, не следовало вставлять проверку на существование POST переменной прямо в запрос
(isset($_POST['figure']) ? $_POST['figure'] : '%' )
Это не критично, но и нежелательно.
Вполне приемлемый вариант имеет вид:
if (isset($_POST['color_hair'])) { $sql .= " AND `color_hair` LIKE '%" . mysql_real_escape_string($_POST['color_hair']) . "%'"; }
Третье, если уж вы решили искать по символьным выражениям, не мешало бы пропустить их через функцию mysql_real_escape_string($string), не боясь о недопустимых символах в строке.
Посему желаю не сдаваться и немного почитать про оптимизацию MySQL запросов.
P.S. Я, когда-то пытаясь устроиться, тоже получил подобное задание, неуверенность в своих знаниях отбило желание даже пытаться решить задачу, а вы, вот, попробовали, зато теперь знаете. Удачи!
-
catalog\controller\module\category.php
меняем
if ($category_id == $result['category_id']) { $children = $this->getCategories($result['category_id'], $new_path); }
на
//if ($category_id == $result['category_id']) { $children = $this->getCategories($result['category_id'], $new_path); //}
-
Интересно, спасибо за вариант замены стандартного. Давно подумываю это сделать, написал более быстрый способ мультизагрузки изображений, отдельно можно прикрутить гулялку по папкам. Если будет время, займусь.
-
Делаем следующее:
CSS: добавляем в конец
/*=Category view*/ .view-buttons{float:left;margin-top: 7px;} .view-buttons a{display:inline-block;height:16px;width:16px;margin-left:7px;} .view-buttons a#grid{background:url('../image/view-table.png') no-repeat 0 0;} .view-buttons a#list{background:url('../image/view-list.png') no-repeat 0 0;} .view-buttons a.onpress{background-position:0 -16px!important;} .grid{list-style-type:none;margin:5px 0;padding:0;text-align: center;} .grid li{float: left;height: 215px;width: 25%;/*width: 32%;*/} .grid .right{min-height: 50px;} .grid .title{display:block; margin: 3px 0;} .list{list-style-type:none;margin:5px 0;padding:0;overflow:hidden;} .list li{clear:both;float:none;overflow:hidden;padding:20px;} .list li + li{border-top:1px dotted #999999;} .list .title{display:block;margin:0 0 10px;} .list .main{float:left;} .list .main .left{float:left;} .list .main .left a{display:block;text-decoration:none;} .list .main .right{float:right;margin: 0 20px;padding-top: 10px;} .list .main .right .model{display:block;} .list .other{float:right; padding-top: 10px;} .list .other img{display:block;margin: 3px 0;} /*=End category view */
HTML: в category.tpl заменяем
<table class="list"> <?php for ($i = 0; $i < sizeof($products); $i = $i + 4) { ?> <tr> <?php for ($j = $i; $j < ($i + 4); $j++) { ?> <td width="25%"><?php if (isset($products[$j])) { ?> <a href="<?php echo $products[$j]['href']; ?>"><img src="<?php echo $products[$j]['thumb']; ?>" title="<?php echo $products[$j]['name']; ?>" alt="<?php echo $products[$j]['name']; ?>" /></a><br /> <a href="<?php echo $products[$j]['href']; ?>"><?php echo $products[$j]['name']; ?></a><br /> <span style="color: #999; font-size: 11px;"><?php echo $products[$j]['model']; ?></span><br /> <?php if ($display_price) { ?> <?php if (!$products[$j]['special']) { ?> <span style="color: #900; font-weight: bold;"><?php echo $products[$j]['price']; ?></span> <?php } else { ?> <span style="color: #900; font-weight: bold; text-decoration: line-through;"><?php echo $products[$j]['price']; ?></span> <span style="color: #F00;"><?php echo $products[$j]['special']; ?></span> <?php } ?> <a class="button_add_small" href="<?php echo $products[$j]['add']; ?>" title="<?php echo $button_add_to_cart; ?>" > </a> <?php } ?> <br /> <?php if ($products[$j]['rating']) { ?> <img src="catalog/view/theme/default/image/stars_<?php echo $products[$j]['rating'] . '.png'; ?>" alt="<?php echo $products[$j]['stars']; ?>" /> <?php } ?> <?php } ?></td> <?php } ?> </tr> <?php } ?> </table>
на
<ul class="<?php echo $view_mode; ?>" id="view"> <?php foreach ($products as $product) { ?> <li> <div class="main"> <div class="left"> <a href="<?php echo $product['href']; ?>" class="thumb" rel="<?php echo $product['compare_thumb']; ?>"> <img src="<?php echo $product['thumb']; ?>" title="<?php echo $product['name']; ?>" alt="<?php echo $product['name']; ?>" id="image-<?php echo $product['product_id']; ?>" /> </a> </div> <div class="right"> <a href="<?php echo $product['href']; ?>" class="title"><?php echo $product['name']; ?></a> <span class="model"><?php echo $product['model']; ?></span> </div> </div> <div class="other"> <?php if ($display_price) { ?> <?php if (!$product['special']) { ?> <span style="color: #900; font-weight: bold;"><?php echo $product['price']; ?></span> <?php } else { ?> <span style="color: #900; font-weight: bold; text-decoration: line-through;"><?php echo $product['price']; ?></span> <span style="color: #F00;"><?php echo $product['special']; ?></span> <?php } ?> <a class="button_add_small" href="<?php echo $product['add']; ?>" title="<?php echo $button_add_to_cart; ?>" > </a> <?php } ?> <br /> <?php if ($product['rating']) { ?> <img src="catalog/view/theme/default/image/stars_<?php echo $product['rating'] . '.png'; ?>" alt="<?php echo $product['stars']; ?>" /> <?php } ?> </div> </li> <?php } ?> </ul>
заменяем
<div class="sort"> <div class="div1"> <select name="sort" onchange="location = this.value"> <?php foreach ($sorts as $sorts) { ?> <?php if (($sort . '-' . $order) == $sorts['value']) { ?> <option value="<?php echo $sorts['href']; ?>" selected="selected"><?php echo $sorts['text']; ?></option> <?php } else { ?> <option value="<?php echo $sorts['href']; ?>"><?php echo $sorts['text']; ?></option> <?php } ?> <?php } ?> </select> </div> <div class="div2"><?php echo $text_sort; ?></div> </div>
на
<div class="sort"> <div class="view-buttons"> <a id="grid" class="change-view<?php echo ($view_mode == 'grid' ? ' onpress' : ''); ?>"></a> <a id="list" class="change-view<?php echo ($view_mode == 'list' ? ' onpress' : ''); ?>"></a> </div> <div class="div1"> <select name="sort" onchange="location = this.value"> <?php foreach ($sorts as $sorts) { ?> <?php if (($sort . '-' . $order) == $sorts['value']) { ?> <option value="<?php echo $sorts['href']; ?>" selected="selected"><?php echo $sorts['text']; ?></option> <?php } else { ?> <option value="<?php echo $sorts['href']; ?>"><?php echo $sorts['text']; ?></option> <?php } ?> <?php } ?> </select> </div> <div class="div2"><?php echo $text_sort; ?></div> </div>
перед
<?php echo $footer; ?>
вставляем
<script type="text/javascript"><!-- $('.change-view').click(function(){ $('#view').removeClass().addClass($(this).attr('id')); $('.change-view').removeClass('onpress'); $(this).addClass('onpress'); $.post('<?php echo $view_action; ?>', 'view=' + $(this).attr('id')); }); //--></script>
PHP: в category.php, после
$this->data['button_add_to_cart'] = $this->language->get('button_add_to_cart');
добавляем$this->data['view_action'] = HTTP_SERVER . 'index.php?route=product/category/view'; $this->data['view_mode'] = (isset($this->session->data['view_mode']) ? $this->session->data['view_mode'] : 'grid');
В конец файла перед закрытием класса вставляем метод
public function view() { if ($this->request->server['REQUEST_METHOD'] == 'POST' && isset($this->request->post['view'])) { $this->session->data['view_mode'] = $this->request->post['view']; } }
Иконки видов: кидаем в папку с изображениями вашего шаблона
Собственно и всё.
Временную демку можно глянуть тут
- 6
-
-
- Це популярне повідомлення.
- Це популярне повідомлення.
Фильтр товаров в категории 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.
- 24
-
AlexFisher, да, это второстепенные баги :) еще все затачивается.
Жаль вы не застали когда я тестил этот плагин сортировки http://razorjack.net/quicksand/ на товарах) было занимательно. Но посчитали лишним.
-
AlexFisher, спасибо. Да уже почти с месяцок работаю над ним, прикрутил RSS фиды, переключалку вида таблица-список с запоминанием, осталось написать модуль "Просмотренные товары", CSV импорт <-> экспорт и сравнение товаров методом исключения одинаковых параметров.
-
Возврат изначально был реализован на fullAJAX библиотеке, но только из-за этого использовать целый фреймворк было не рационально, поэтому пользовался штатным функционалом jQuery.
Исключение AJAX внушает стабильность и кроссбраузерность.
- 3
-
Буду очень рад реализации от OpenCart, но нельзя ждать более, нужен сейчас.
Пока погонял по параметрам, ошибок не обнаружено.
Зарелизю на выходных.
- 1
-
Доделываю модуль. С нуля.
Ориентир на розетка.ком.юа (лат), оптимальный вариант фильтра.
Самое сложное позади (: - формирование правильной ссылки с GET запросом и в зависимости от неё логика запроса в базу.
Посмотреть фронт можно здесь http://dataplustest.ua.swteh.ru/index.php?route=product/category&path=20
Правильным будет
- 1
-
Vetal на http://svobodamusic.net/music там даже не модуль, а рекодинг многих файлов, как бы заказ специфический был. Надо унифицировать и слайдеры, и текстовые поля для модуля.
Цены относятся к отдельному полю таблицы product, поэтому если и делать, то в виде отдельной статичной опции в блоке "Фильтр" с включением из админки.
На счет http://notik.if.ua/, здесь не ajax, там просто загружается сразу весь ассортимент продукции, а когда мы выбираем критерии, то просто лишняя скрывается с помощью CSS и идет перераспределение блоков. Плюс в том, что быстро. Минус - если много товаров, то первая загрузка будет долговато.
По этому принципу лучше делать сортировку одностраничной таблицы. Как сделал здесь http://svobodamusic.net/music, или таблицы незначительных данных, деленной на несколько страниц.
-
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.
-
SooR, так и думал =)
но вернемся к нашим "баранам" - проблема с фильтром в IE.
не работает ни в одной версии из тех, что я проверял
( ;) https://opencartforum.com/viewtopic.php?f=21&t=876&start=60#p7780)
похоже IE напрочь не понимает вот этого:
$('#filters input, #filters select').live('change', function() { effects('', 'jump', 'icon', 200); //effects('in', 'fade', 'load', 300); alert("IE test _live change_"); // нет этого сообщения в IE loadContent(); });
Можно было просто заменить строку с 'live' на
$('#filters input, #filters select').change(function() {
в VI-м IE работает. В остальных думаю тоже.
Сделал инсталл таблиц с админки. Отсюда - пропадают проблемы с префиксами.
- 1
-
Да на макось.да у нас все отлично =)
вы и так уже много сделали, отдав в паблик такой модуль.
теперь можем "допиливать" его общими усилиями.
имхо: не обязательно делать установку таблиц через админку.
что на что сменили, если не секрет? :)...Сейчас разбираюсь с софтом в связи с заменой ос...
Но начинаю понимать, что она в идеале подходит под медиа а коммуникации, общение, но не под веб девелоп, к сожалению
-
Ребята, подождите немного, сделаю установку таблиц через админку, и с префиксами проблем не будет. Сейчас разбираюсь с софтом в связи с заменой ос.
-
Error: Table 'oktclubru_bbs.product_to_value' doesn't exist Error No: 1146 SELECT oc_p2v.value_id AS value_id FROM product_to_value p2v WHERE p2v.product_id = '658'
В Редактирование товара выходят следующие ошибки.
В запрос добавьте свой префикс oktclubru_bbs для каждой из таблиц
-
Сделал.
Для ручной установки, повторите пункт #4 с новым методом.
Ну и архивы заменил.
-
Заметил еще одну багу с радиокнопками. Надо как-то разделить имена, потому что если в фильтре две опции с радиокнопками, то будет переключение между всеми, а не внутри опции.Пока пришло на ум разделение с помощью option_id. Делаю.
-
Обновил архивы!
Добавил префиксы и сделал чтобы value_id не слетали при апдейте.
wowkas
Замените файлы снова.
-
Да, с префиксами я не работал. Поэтому буду делать сбоку опенкарта с уже установленными фильтром и другими дополнениями.
[Модуль] Фильтр товаров в категории 2.0 / 3.0
в Вывод товара, изображения, фильтры вывода
Опубліковано: