Автор Тема: Выбор цвета в фильтре (основная комбинация товара такого же цвета и в каталоге)  (Прочитано 1919 раз)

03 Август 2015, 13:28:55
Ответ #30
  • Ветеран
  • *****
  • Сообщений: 22125
  • Репутация: +25303/-1
  • Prestashop - просто и эффективно
    • Просмотр профиля
Она и так есть
$products = $this->getProductByFilters($selected_filters);Массив фильтров передается в эту функцию.
Эксперт Prestashop - решения всех проблем, написание модулей, создание тем для интернет-магазинов под Prestashop.
Эксперт Magento - создам сайт на Magento, программирование кастомных модулей для Magento, кастомизация тем Magento.
Лучшие цены!!!
03 Август 2015, 13:45:28
Ответ #31
  • Партнер
  • Ветеран
  • ****
  • Сообщений: 22816
  • Репутация: +17143/-1
  • Разработка веб-сайтов и веб-программирование
    • Просмотр профиля
Подскажите,
Для каждого товара имеется несколько комбинаций с различными цветами.
Требуется, чтобы при выборе в фильтре blocklayered конкретного цвета, в выдаче каталога отображались товары, где главной основной комбинацией была того же цвета.
Как можно реализовать подобное?
Заранее спасибо!
Вам нужно через js обновлять изображения. Принцип такой как на странице товара при выборе атрибута цвета.
Функция displayImage в файле /themes/default-bootstrap/js/product.js
//update display of the large image
function displayImage(domAAroundImgThumb, no_animation)
Подобную функцию попробуйте добавить в /themes/default-bootstrap/js/modules/blocklayered/blocklayered.js
Интернет-магазин под ключ.
Какой выбрать движок для интернет магазина ?
Какой движок лучше ?
Magento или Prestashop ?
Решение всех Ваших вопросов в создании Интернет-магазина.
03 Август 2015, 13:58:54
Ответ #32
  • Ветеран
  • *****
  • Сообщений: 527
  • Репутация: +1/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Она и так есть
$products = $this->getProductByFilters($selected_filters);Массив фильтров передается в эту функцию.

Добавил в blocklayered.php  для public function getProducts
foreach ($products as &$product)
{
$product['selected_filters'] = $selected_filters;
}
Теперь в шаблоне product-item.tpl для каждого товара могу вывести {print_r($product.selected_filters)}
а именно (пример)
[id_attribute_group] => Array ( [8] => 3_8)  здесь 8 это красный цвет из аттрибутов товара
Как теперь получить $product.id_image
03 Август 2015, 14:23:40
Ответ #33
  • Партнер
  • Ветеран
  • ****
  • Сообщений: 22816
  • Репутация: +17143/-1
  • Разработка веб-сайтов и веб-программирование
    • Просмотр профиля
Link :: getImageLink($name, $ids, $type = null)
/**
 * Returns a link to a product image for display
 * Note: the new image filesystem stores product images in subdirectories of img/p/
 *
 * @param string $name rewrite link of the image
 * @param string $ids id part of the image filename - can be "id_product-id_image" (legacy support, recommended) or "id_image" (new)
 * @param string $type
 */
Интернет-магазин под ключ.
Какой выбрать движок для интернет магазина ?
Какой движок лучше ?
Magento или Prestashop ?
Решение всех Ваших вопросов в создании Интернет-магазина.
03 Август 2015, 14:31:22
Ответ #34
  • Ветеран
  • *****
  • Сообщений: 22125
  • Репутация: +25303/-1
  • Prestashop - просто и эффективно
    • Просмотр профиля
По моему, лучше использовать метод getCombinationImages класса Product. Он вернет все картинки товара, потом выбрать по ид атрибута нужную картинку.
Эксперт Prestashop - решения всех проблем, написание модулей, создание тем для интернет-магазинов под Prestashop.
Эксперт Magento - создам сайт на Magento, программирование кастомных модулей для Magento, кастомизация тем Magento.
Лучшие цены!!!
03 Август 2015, 15:31:28
Ответ #35
  • Ветеран
  • *****
  • Сообщений: 527
  • Репутация: +1/-0
  • Сообщество PrestaShop
    • Просмотр профиля
В  ps_product_attribute по id_product находим все id_product_attribute

Далее в ps_product_attribute_combination из найденных id_product_attribute
отбираем нужный по id_attribute в моём случае (пример) 8

Найденный  id_product_attribute используем в ps_product_attribute_image
чтобы определить id_image

Можно ли как то сократить данные действия. Возможно есть функция которая ищет id_image по id товара и id_attribute?
03 Август 2015, 16:27:25
Ответ #36
  • Партнер
  • Ветеран
  • ****
  • Сообщений: 22816
  • Репутация: +17143/-1
  • Разработка веб-сайтов и веб-программирование
    • Просмотр профиля
Если id_product_attribute известно, то так
$id_image = Product::getCombinationImageById($id_product_attribute, $id_lang) ;
Интернет-магазин под ключ.
Какой выбрать движок для интернет магазина ?
Какой движок лучше ?
Magento или Prestashop ?
Решение всех Ваших вопросов в создании Интернет-магазина.
03 Август 2015, 16:36:14
Ответ #37
  • Ветеран
  • *****
  • Сообщений: 527
  • Репутация: +1/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Если id_product_attribute известно, то так
$id_image = Product::getCombinationImageById($id_product_attribute, $id_lang) ;

Так $id_product_attribute не известно

У меня что-то такое получается:

$comma_separated = array();
foreach ($selected_filters['id_attribute_group'] as $k => $v)
$comma_separated[] = $k;
$attr = implode(",", $comma_separated);

$sql = 'SELECT a.`id_product_attribute`, a.`id_product`, pl.`link_rewrite`, pr.`id_category_default`, pl.`name`, cl.link_rewrite AS category_rewrite, MIN(attr_img.id_image) id_image, attr_comb.`id_attribute` FROM `'._DB_PREFIX_.'product_attribute` as a
LEFT JOIN '._DB_PREFIX_.'product_lang pl ON (pl.id_product = a.id_product'.Shop::addSqlRestrictionOnLang('pl').')
LEFT JOIN '._DB_PREFIX_.'product_attribute_image attr_img ON (attr_img.id_product_attribute = a.id_product_attribute)
LEFT JOIN '._DB_PREFIX_.'product pr ON (pr.id_product = a.id_product)
LEFT JOIN '._DB_PREFIX_.'product_attribute_combination attr_comb ON (attr_comb.id_product_attribute = a.id_product_attribute)
LEFT JOIN '._DB_PREFIX_.'category_lang cl ON (cl.id_category = pr.id_category_default'.Shop::addSqlRestrictionOnLang('cl').')
WHERE a.`id_product` = "'.$product['id_product'].'" AND attr_comb.`id_attribute` IN ('.$attr.') GROUP BY a.`id_product` LIMIT 1';

03 Август 2015, 17:00:14
Ответ #38
  • Ветеран
  • *****
  • Сообщений: 22125
  • Репутация: +25303/-1
  • Prestashop - просто и эффективно
    • Просмотр профиля
Эксперт Prestashop - решения всех проблем, написание модулей, создание тем для интернет-магазинов под Prestashop.
Эксперт Magento - создам сайт на Magento, программирование кастомных модулей для Magento, кастомизация тем Magento.
Лучшие цены!!!
03 Август 2015, 17:02:06
Ответ #39
  • Ветеран
  • *****
  • Сообщений: 527
  • Репутация: +1/-0
  • Сообщество PrestaShop
    • Просмотр профиля
03 Август 2015, 17:04:06
Ответ #40
  • Ветеран
  • *****
  • Сообщений: 527
  • Репутация: +1/-0
  • Сообщество PrestaShop
    • Просмотр профиля
03 Август 2015, 17:04:46
Ответ #41
  • Ветеран
  • *****
  • Сообщений: 527
  • Репутация: +1/-0
  • Сообщество PrestaShop
    • Просмотр профиля
03 Август 2015, 17:05:25
Ответ #42
  • Ветеран
  • *****
  • Сообщений: 527
  • Репутация: +1/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Да, в blocklayered.php

там где
public function getProducts

foreach ($products as &$product)
{
if (isset($selected_filters['id_attribute_group']) and !empty($selected_filters['id_attribute_group']))
{
$comma_separated = array();
foreach ($selected_filters['id_attribute_group'] as $k => $v)
$comma_separated[] = $k;
$attr = implode(",", $comma_separated);

$sql = 'SELECT a.`id_product_attribute`, a.`id_product`, pl.`link_rewrite`, pr.`id_category_default`, pl.`name`, cl.link_rewrite AS category_rewrite, MIN(attr_img.id_image) id_image, attr_comb.`id_attribute` FROM `'._DB_PREFIX_.'product_attribute` as a
LEFT JOIN '._DB_PREFIX_.'product_lang pl ON (pl.id_product = a.id_product'.Shop::addSqlRestrictionOnLang('pl').')
LEFT JOIN '._DB_PREFIX_.'product_attribute_image attr_img ON (attr_img.id_product_attribute = a.id_product_attribute)
LEFT JOIN '._DB_PREFIX_.'product pr ON (pr.id_product = a.id_product)
LEFT JOIN '._DB_PREFIX_.'product_attribute_combination attr_comb ON (attr_comb.id_product_attribute = a.id_product_attribute)
LEFT JOIN '._DB_PREFIX_.'category_lang cl ON (cl.id_category = pr.id_category_default'.Shop::addSqlRestrictionOnLang('cl').')
WHERE a.`id_product` = "'.$product['id_product'].'" AND attr_comb.`id_attribute` IN ('.$attr.') GROUP BY a.`id_product` LIMIT 1';

if ($results = Db::getInstance()->ExecuteS($sql))
foreach ($results as $row)
$product['selected_filters_sql'] = $row['id_image'];

}
}
Вроде работает
Боюсь быстродействие будет хромать...
03 Август 2015, 17:23:12
Ответ #43
  • Ветеран
  • *****
  • Сообщений: 22125
  • Репутация: +25303/-1
  • Prestashop - просто и эффективно
    • Просмотр профиля
Да с быстротой работы у blocklayered.не важно.
По хорошему, вынести нужно запрос к бд из цикла. С массивом фильтров отдельно работать. Добавить проверку is_color_group.
Эксперт Prestashop - решения всех проблем, написание модулей, создание тем для интернет-магазинов под Prestashop.
Эксперт Magento - создам сайт на Magento, программирование кастомных модулей для Magento, кастомизация тем Magento.
Лучшие цены!!!