Автор Тема: Отображение доступных цветов  (Прочитано 1399 раз)

30 Июль 2014, 00:48:18
  • Фрилансер
  • *
  • Сообщений: 105
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Подскажите, кто знает, как реализовать отображение доступных цветов товара при просмотре категории.
Пример на скриншоте.
Уже в 2-х магазинах видел такое.
30 Июль 2014, 09:39:43
Ответ #1
  • Ветеран
  • *****
  • Сообщений: 22125
  • Репутация: +25303/-1
  • Prestashop - просто и эффективно
    • Просмотр профиля
В шаблон product-list.tpl нужно добавить вывод аттрибутов. Блок аттрибутов можно взять из шаблона product.tpl
{if isset($groups)}
<!-- attributes -->
<div id="attributes">

Можно сделать так, добавить новую функцию в конроллер CategoryController.php
public function getProductAttributeCombinations($products) {
    $combinations = array();

    foreach($products as $product)
    {
        // load product object
        $product = new Product ($product['id_product'], $this->context->language->id);

        // get the product combinations data
        // create array combinations with key = id_product
        $combinations[$product->id] = $product->getAttributeCombinations($this->context->language->id);
    }

    return $combinations;
}


public function initContent()
{
    parent::initContent();
    $products = $this->category->getProducts($this->context->language->id, (int)$this->p, (int)$this->n, $this->orderBy, $this->orderWay);
    $combinations = $this->getProductAttributeCombinations($products);
    $this->context->smarty->assign('combinations', $combinations);
}
и в шаблон product-list.tpl
{foreach from=$combinations key=k item=comb}
    {* because the array key are id_product, we can separate the product combinations in here
       with if/else statement compared with the id_product from the foreach loop of products-list *}
    {if $k = $product.id_product}
        {* The attribute Group Name *}
        <p class="title">{$comb.group_name}</p>
        {* List of attribute values inside the attribute Group for current product *}
        <select>
        {foreach from=$comb item=attr}
            <option value="{$attr.id_attribute}">{$attr.attribute_name} {convertPrice price=$attr.unit_price_impact}</option>
        {/foreach}
        </select>
    {/if}
{/foreach}

Отвечаю на вопрос заданный в личку (если есть еще вопросы, то пишите в этой теме)
Так можно дать возможность видеть разную цену у различных комбинаций.
Можно также сделать "сборный товар", что типа сборки компьютора. Только нужно дописать js функцию перерасчета цены.
Эксперт Prestashop - решения всех проблем, написание модулей, создание тем для интернет-магазинов под Prestashop.
Эксперт Magento - создам сайт на Magento, программирование кастомных модулей для Magento, кастомизация тем Magento.
Лучшие цены!!!
28 Август 2014, 14:46:05
Ответ #2
  • Фрилансер
  • *
  • Сообщений: 105
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Что-то не получается по указанному выше способу.
Возникает ошибка:

Fatal error: Cannot redeclare CategoryControllerCore::initContent() in /home/insecret/public_html/controllers/front/CategoryController.php on line 127
Файл CategoryController.php и product-list.tpl во вложении.
Может не там, где надо код вставил?
28 Август 2014, 15:03:48
Ответ #3
  • Ветеран
  • *****
  • Сообщений: 1285
  • Репутация: +13/-1
  • Сообщество PrestaShop
    • Просмотр профиля
Есть еще такая тема, там больше написано и другие способы. Поищи на форуме.
28 Август 2014, 16:21:15
Ответ #4
  • Фрилансер
  • *
  • Сообщений: 105
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Есть еще такая тема, там больше написано и другие способы. Поищи на форуме.
Да в той теме как раз отправляют эту почитать)
28 Август 2014, 16:52:34
Ответ #5
  • Модератор
  • Ветеран
  • *****
  • Сообщений: 86688
  • Репутация: +25428/-0
  • Сообщество PrestaShop
    • Просмотр профиля
14 Сентябрь 2016, 13:52:58
Ответ #6
  • Новичок
  • *
  • Сообщений: 45
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
у меня преста 1.6
В контролере функция init выглядит уже не так..
Ниже привел правильный вариант. Но у меня другая проблема в шаблоне у каждого товара выводятся все опции других товаров в категории.
По какой то причине не отрабатывает условие {if $k = $product.id_product}
public function initContent()
    {
        parent::initContent();

        $this->setTemplate(_PS_THEME_DIR_.'category.tpl');

        if (!$this->customer_access) {
            return;
        }

        if (isset($this->context->cookie->id_compare)) {
            $this->context->smarty->assign('compareProducts', CompareProduct::getCompareProducts((int)$this->context->cookie->id_compare));
        }

        // Product sort must be called before assignProductList()
        $this->productSort();

        $this->assignScenes();
        $this->assignSubcategories();
        $this->assignProductList();

        $this->context->smarty->assign(array(
            'category'             => $this->category,
            'description_short'    => Tools::truncateString($this->category->description, 350),
            'products'             => (isset($this->cat_products) && $this->cat_products) ? $this->cat_products : null,
'combinations' => $this->getProductAttributeCombinations($this->cat_products),
            'id_category'          => (int)$this->category->id,
            'id_category_parent'   => (int)$this->category->id_parent,
            'return_category_name' => Tools::safeOutput($this->category->name),
            'path'                 => Tools::getPath($this->category->id),
            'add_prod_display'     => Configuration::get('PS_ATTRIBUTE_CATEGORY_DISPLAY'),
            'categorySize'         => Image::getSize(ImageType::getFormatedName('category')),
            'mediumSize'           => Image::getSize(ImageType::getFormatedName('medium')),
            'thumbSceneSize'       => Image::getSize(ImageType::getFormatedName('m_scene')),
            'homeSize'             => Image::getSize(ImageType::getFormatedName('home')),
            'allow_oosp'           => (int)Configuration::get('PS_ORDER_OUT_OF_STOCK'),
            'comparator_max_item'  => (int)Configuration::get('PS_COMPARATOR_MAX_ITEM'),
            'suppliers'            => Supplier::getSuppliers(),
            'body_classes'         => array($this->php_self.'-'.$this->category->id, $this->php_self.'-'.$this->category->link_rewrite)
        ));
    }
14 Сентябрь 2016, 13:57:26
Ответ #7
  • Новичок
  • *
  • Сообщений: 45
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
В шаблоне написал так {if $k == $product.id_product} . Заработало.
14 Сентябрь 2016, 17:17:13
Ответ #8
  • Новичок
  • *
  • Сообщений: 45
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Реализовал в категорие вот так https://yadi.sk/i/dYY1YuIMvA6Wr
Но столкнулся с тем что вторая отправка того же товара в корзину происходит с предыдущей опцией.
Хотя все параметры в кнопке меняю правильно в js. а именно ipa в href и атрибут data-id-product-attribute
<a class="button ajax_add_to_cart_button btn btn-default neblef" href="http://site.ru/cart?add=1&id_product=6291&ipa=4559&token=e4cc502dfbc5014232359753d3837af5" rel="nofollow" title="В корзину" data-id-product-attribute="4559" data-id-product="6291" data-minimal_quantity="1" style="display: none;">
<span>В корзину</span>
</a>

Объяснение: например выбрал я вес товара 4 кг и отправил в корзину. И решил не перезагружая страницу отправить этот товар в весе 6 кг. Но отправляется опять в 4 кг.
05 Октябрь 2016, 10:53:10
Ответ #9
  • Новичок
  • *
  • Сообщений: 45
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Вывод опций нужно так же вывести в модулях(лучшие, новинки, популярное). Не могу найти контролер.
05 Октябрь 2016, 11:06:28
Ответ #10
  • Ветеран
  • *****
  • Сообщений: 33325
  • Репутация: +26771/-0
    • Просмотр профиля
/classes/controller/ModuleFrontController.php
Общий для всех модулей.
Собственный контроллер модуля находится в папке модуля. 
05 Октябрь 2016, 11:45:42
Ответ #11
  • Новичок
  • *
  • Сообщений: 45
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
В контролере категории как то все просто было, там явно видно где переменная $products формируется.

В модуле такого не вижу, хотя в шаблон переменная приходит...
05 Октябрь 2016, 12:17:32
Ответ #12
  • Ветеран
  • *****
  • Сообщений: 16667
  • Репутация: +14630/-5
  • Сообщество PrestaShop
    • Просмотр профиля
В модудях по другому. Наример в модуле Похожие товары список товаров определяется в хуке
$category_products = $category->getProducts($this->context->language->id, 1, 100); /* 100 products max. */
05 Октябрь 2016, 13:52:02
Ответ #13
  • Новичок
  • *
  • Сообщений: 45
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
а как свою новую переменную отправить?
05 Октябрь 2016, 13:55:40
Ответ #14
  • Ветеран
  • *****
  • Сообщений: 22125
  • Репутация: +25303/-1
  • Prestashop - просто и эффективно
    • Просмотр профиля
Переменную в класс добавляете или в модуле объявляете глобальной.
Эксперт Prestashop - решения всех проблем, написание модулей, создание тем для интернет-магазинов под Prestashop.
Эксперт Magento - создам сайт на Magento, программирование кастомных модулей для Magento, кастомизация тем Magento.
Лучшие цены!!!