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. Возможность есть. Скоро напишу как выводить опции и значения для категории и для отдельного товара.
  2. snastik, для текста в grid_mode в css прописать свойство display:none; .grid .short-descr{display:none;}
  3. hotep, уж лучше мужчин и женщин разбить на категории, или под видом брендов. Или же делать зависимые опции (от выбранных значений), но это отдельная тема. Trance around the world) скиньте полный код ошибки или страницу с ошибкой. Я написал о полной совместимости с версией, указанной по ссылке.
  4. Идентичны, меняется только вид. Можно вытащить первые n слов из описания и управлять ним с CSS. Вот обрезка по словам: private function cropTextByWord($text, $counttext = 10, $sep = ' ') { // исходный текст, сколько слов выводить, какой разделитель для слов $words = split($sep, $text); if ( count($words) > $counttext ) $text = join($sep, array_slice($words, 0, $counttext)); return $text; }
  5. Да просто, эту строчку $this->data['view_mode'] = (isset($this->session->data['view_mode']) ? $this->session->data['view_mode'] : 'grid'); Меняем на $this->data['view_mode'] = (isset($this->session->data['view_mode']) ? $this->session->data['view_mode'] : 'list'); Найди 1 отличие)
  6. Нисколько не против, всё на благо развития. Другое дело, что надо добавить еще диапазон по цене, поле для выбора где размещать опцию (везде, только в фильтре, только в характеристиках), ну и еще пару мелочей... есть идеи.
  7. Добавьте в контроллер product.php (метод getList) строки вида $this->data['button_enable'] = 'Включено'; $this->data['button_disable'] = 'Выключено';
  8. UnderStorm, ну если header.tpl подгрузился, значит выбран ваш шаблон. Или вы не изменяли остальные .tpl, или скрипт их не может найти, подгружая с папки default.
  9. Как вы смотрите на то, чтобы сделать редактирование языковых файлов с админки?
  10. Попробуйте... product.php PS>> уже залил пива, возможно где-то косяк. Основные методы для фильтра в категории: public function getProductsByCategoryId($category_id, $filter = 0, $sort = 'p.sort_order', $order = 'ASC', $start = 0, $limit = 20) { $sql = "SELECT *, pd.name AS name, p.image, m.name AS manufacturer, ss.name AS stock, (SELECT AVG(r.rating) FROM " . DB_PREFIX . "review r WHERE p.product_id = r.product_id GROUP BY r.product_id) AS rating FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) LEFT JOIN " . DB_PREFIX . "manufacturer m ON (p.manufacturer_id = m.manufacturer_id) LEFT JOIN " . DB_PREFIX . "stock_status ss ON (p.stock_status_id = ss.stock_status_id) LEFT JOIN " . DB_PREFIX . "product_to_category p2c ON (p.product_id = p2c.product_id) WHERE p.status = '1' AND p.date_available <= NOW() AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND ss.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p2c.category_id = '" . (int)$category_id . "'"; // Start filter if ($filter) { foreach (explode(';', $filter) as $option) { $values = explode('=', $option); $data = array(); foreach (explode(',', $values[1]) as $value_id) { $query = $this->db->query("SELECT product_id FROM " . DB_PREFIX . "product_to_value WHERE value_id='" . (int)$value_id . "'"); if ($query->rows) { foreach($query->rows as $row) { $data[] = $row['product_id']; } } else { unset($data); } } if (!empty($data)) { $sql .= " AND p.product_id IN (" . implode(",", $data) . ")"; } } } // End filter $sql .= " GROUP BY p.product_id"; $sort_data = array( 'pd.name', 'p.sort_order', 'special', 'rating', 'p.price', 'p.model' ); if (in_array($sort, $sort_data)) { if ($sort == 'pd.name' || $sort == 'p.model') { $sql .= " ORDER BY LCASE(" . $sort . ")"; } else { $sql .= " ORDER BY " . $sort; } } else { $sql .= " ORDER BY p.sort_order"; } if ($order == 'DESC') { $sql .= " DESC"; } else { $sql .= " ASC"; } if ($start < 0) { $start = 0; } $sql .= " LIMIT " . (int)$start . "," . (int)$limit; $query = $this->db->query($sql); return $query->rows; } public function getTotalProductsByCategoryId($category_id = 0, $filter = 0) { $sql = "SELECT COUNT(DISTINCT p.product_id) 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_value p2v ON (p.product_id = p2v.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 ($filter) { foreach (explode(';', $filter) as $option) { $values = explode('=', $option); $data = array(); foreach (explode(',', $values[1]) as $value_id) { $query = $this->db->query("SELECT product_id FROM " . DB_PREFIX . "product_to_value WHERE value_id='" . (int)$value_id . "'"); if ($query->rows) { foreach($query->rows as $row) { $data[] = $row['product_id']; } } else { unset($data); } } if (!empty($data)) { $sql .= " AND p.product_id IN (" . implode(",", $data) . ")"; } else { return 0; // запрос на строке 88 ничего не вернул, а общее количество в категории нам не интересно } } } // End filter $query = $this->db->query($sql); return $query->row['total']; }
  11. Доступ к ФТП - хранятся файлы сайта и сам сайт Доступ к базе данных - phpMyAdmin или панель хостинга Доступ к хостингу и его конфигурации Доступ к домену и его конфигурации
  12. Для избежания этой ошибки, уже всем скачавшим советую перекачать архив, там исправлено. openstore_filter_2.0_clean_install.zip
  13. afwollis, уже разобрались, т.к. делался update модуля, то многие option_id в product_to_value остались в нулевом значении, что недопустимо при выборке с данным запросом if ($filter) { $options = array(); $values = array(); foreach (explode(';', $filter) as $option) { $parts = explode('=', $option); foreach (explode(',', $parts[1]) as $value_id) { $values[] = (int)$value_id; } $options[] = (int)$parts[0]; } $sql .= " AND p2v.value_id IN (" . implode(",", $values) . ") AND p2v.option_id IN (" . implode(',', $options) . ")"; } Поэтому, чтобы не обновлять уже большое количество товаров, поставили другой способ выборки if ($filter) { foreach (explode(';', $filter) as $option) { $values = explode('=', $option); $data = array(); foreach (explode(',', $values[1]) as $value_id) { $query = $this->db->query("SELECT product_id FROM " . DB_PREFIX . "product_to_value WHERE value_id='" . (int)$value_id . "'"); if ($query->rows) { foreach($query->rows as $row) { $data[] = $row['product_id']; } } else { unset($data); } } if (!empty($data)) { $sql .= " AND p.product_id IN (" . implode(",", $data) . ")"; } } }
  14. Просто человек может выбрать так, что к его фильтру не найдется товаров. А если каждый раз обновлять количество товаров для критерии, то можно ограничить от этого.
  15. Цитирую Т.е. поставил двиг, поверх модуль. Тогда все ок. Остальные нужно смотреть. lampard что именно не работает? Я зашел, все ок..
  16. Там нет никакого 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']; ?>
  17. Да если дело только в этом, то одна строка переписывается...
  18. Ну тут несколько причин: Как уже говорилось, 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. Я, когда-то пытаясь устроиться, тоже получил подобное задание, неуверенность в своих знаниях отбило желание даже пытаться решить задачу, а вы, вот, попробовали, зато теперь знаете. Удачи!
  19. 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); //}
  20. Интересно, спасибо за вариант замены стандартного. Давно подумываю это сделать, написал более быстрый способ мультизагрузки изображений, отдельно можно прикрутить гулялку по папкам. Если будет время, займусь.
  21. Делаем следующее: 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']; } } Иконки видов: кидаем в папку с изображениями вашего шаблона view_icons.zip Собственно и всё. Временную демку можно глянуть тут
×
×
  • 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.