Настраиваемые Динамические Изображения: Использование Нескольких Атрибутов


Я использую CE 1.9.1 с темой rwd и наслаждаюсь возможностью переключения изображений, нажимая на образцы цветов. Хотя я пытаюсь сделать что-то другое.

У меня есть продукт, доступный в нескольких цветах. Кроме того, некоторые цвета также имеют полосатый узор. (Не все цвета бывают полосатыми.)

Изображение продукта по умолчанию должно отображать коллекцию всех дочерних продуктов. Там будет два набора образцов. Цветной и текстовый с "сплошным" и "полосатым" в качестве вариантов выбора. При нажатии на образец blue должно отображаться синее сплошное изображение, а при нажатии на striped должно отображаться изображение в синюю полоску. Я не могу заставить это работать.

Когда я помечаю изображения для всех solid как название цвета, т.Е. синий, черный, красный, Все они отображаются, как только щелкнут образец цвета. Однако, что я могу сделать, чтобы заставить полосатые версии работать?

Я попытался установить изображение для простого продукта blue striped, но это делает ничего. Если я наклею ярлык это изображение striped будет отображаться при нажатии на образец striped - при условии, что образец цвета не был нажат. После нажатия на образец цвета и отображения его сплошного цвета щелчок по striped не изменит изображение. Однако, когда solid нажимается, возникает реакция. Изображение возвращается к значению продукта по умолчанию.

Что рекомендуется для настраиваемых изображений продуктов с использованием нескольких атрибутов?

РЕДАКТИРОВАТЬ: Реальный сценарий включает в себя больше атрибутов, чем просто цвета. Скажем, размер или даже тип ручки потребуют разных изображений продукта.

Author: tzvi, 2015-03-19

3 answers

Я могу порекомендовать вам и альтернативу для образцов цветов по умолчанию. Это бесплатное расширение.
это позволяет вам делать то, что делают образцы цветов, и многое другое, но без головной боли, связанной с соглашениями об именовании.
Вы можете изменить выпадающие списки на этикетки, цвета или даже простые изображения продуктов.
и основное изображение можно изменить на простое изображение продукта для всех атрибутов, а не только цветов.
Полное описание расширения можно найти здесь

 3
Author: Marius, 2015-05-14 07:49:30

Возможно, это может вам помочь.

Насколько я могу судить, у вас есть только один выбор для установки образцов. Вы могли бы добавить варианты в виде цветов, которые помогли бы вам выйти из коробки.

Итак, blue, blue striped, red, red striped.

 1
Author: Jeroen, 2015-03-24 23:20:56

Шаг 1: Создайте модуль: {your_module_name}

Шаг 2: /приложение/код/локальный/D1m/{имя_модуля}/etc/system.xml

<config>
<sections>
    <configswatches translate="label" module="configurableswatches">
        <groups>
            <general translate="label" module="configurableswatches">
                <label>General Settings</label>
                <sort_order>10</sort_order>
                <show_in_default>1</show_in_default>
                <show_in_website>1</show_in_website>
                <show_in_store>1</show_in_store>
                <fields>
                    <product_list_attribute translate="label">
                        <label>Product Attribute to Use for Swatches in Product Listing</label>
                        <frontend_type>multiselect</frontend_type>
                        <source_model>configurableswatches/system_config_source_catalog_product_configattribute_select</source_model>
                        <sort_order>30</sort_order>
                        <show_in_default>1</show_in_default>
                        <show_in_website>1</show_in_website>
                        <show_in_store>1</show_in_store>
                    </product_list_attribute>
                </fields>
            </general>
        </groups>
    </configswatches>
</sections>

Шаг 3: /приложение/код/локальный/D1m/{имя_модуля}/etc/config.xml обновите свой xml-файл...

<helpers><configurableswatches></configurableswatches></helpers><models><configurableswatches><rewrite><observer>D1m_{your_module_name}_Model_ConfigurableSwatches_Observer</observer>

Шаг 4:/приложение/код/локальный/D1m/{имя_модуля}/Helper/ConfigurableSwatches/Productlist.php класс D1m_{имя_модуля}_helper_configurableswatches_productlist расширяет список Mage_ConfigurableSwatches_Helper_Productlist{ защищенные идентификаторы $_swatchattributeids;

protected $_swatchAttributes;

/**
 * Get ID of the attribute that should be used for swatches on product listing
 *
 * @return string
 */
public function getSwatchAttributeIds()
{
    if (is_null($this->_swatchAttributeIds)) {
        $this->_swatchAttributeIds =
            Mage::getStoreConfig(Mage_ConfigurableSwatches_Helper_Data::CONFIG_PATH_LIST_SWATCH_ATTRIBUTE);
    }
    return $this->_swatchAttributeIds;
}

/**
 * Get model of attribute that should be used for swatches on product listing
 */
public function getSwatchAttributes()
{
    $attributeIds = explode(',',$this->getSwatchAttributeIds());
    $attributeCode = array();
    foreach ( $attributeIds as $attributeId ) {
        $attributeCode[] = Mage::getModel('eav/entity_attribute')
            ->load($attributeId)->getAttributeCode();
    }
    return $attributeCode;
}

}

Шаг 5:/приложение/код/локальный/D1m/{имя_модуля}/Helper/ConfigurableSwatches/Mediafallback.php класс D1m_{имя_модуля}_helper_configurableswatches_mediafallback расширяет возможности Mage_ConfigurableSwatches_Helper_Mediafallback{

/**
 * Set child_attribute_label_mapping on products with attribute label -> product mapping
 * Depends on following product data:
 * - product must have children products attached
 *
 * @param array $parentProducts
 * @param $storeId
 * @return void
 */
public function attachConfigurableProductChildrenAttributeMapping(array $parentProducts, $storeId)
{
    $listSwatchAttr = Mage::helper('d1m_productoptionsimage/configurableSwatches_productlist')
        ->getSwatchAttributeIds();
    $listSwatchAttr = explode(',',$listSwatchAttr);

    $parentProductIds = array();
    /* @var $parentProduct Mage_Catalog_Model_Product */
    foreach ($parentProducts as $parentProduct) {
        $parentProductIds[] = $parentProduct->getId();
    }

    $configAttributes = Mage::getResourceModel('configurableswatches/catalog_product_attribute_super_collection')
                            ->addParentProductsFilter($parentProductIds)
                            ->attachEavAttributes()
                            ->setStoreId($storeId)
    ;

    $optionLabels = array();
    foreach ($configAttributes as $attribute) {
        $optionLabels += $attribute->getOptionLabels();
    }

    foreach ($parentProducts as $parentProduct) {
        $mapping = array();
        $listSwatchValues = array();

        /* @var $attribute Mage_Catalog_Model_Product_Type_Configurable_Attribute */
        foreach ($configAttributes as $attribute) {
            /* @var $childProduct Mage_Catalog_Model_Product */
            if (!is_array($parentProduct->getChildrenProducts())) {
                continue;
            }

            foreach ($parentProduct->getChildrenProducts() as $childProduct) {
                // product has no value for attribute, we can't process it
                if (!$childProduct->hasData($attribute->getAttributeCode())) {
                    continue;
                }
                $optionId = $childProduct->getData($attribute->getAttributeCode());

                // if we don't have a default label, skip it
                if (!isset($optionLabels[$optionId][0])) {
                    continue;
                }

                // normalize to all lower case before we start using them
                $optionLabels = array_map(function ($value) {
                    return array_map('Mage_ConfigurableSwatches_Helper_Data::normalizeKey', $value);
                }, $optionLabels);

                // using default value as key unless store-specific label is present
                $optionLabel = $optionLabels[$optionId][0];
                if (isset($optionLabels[$optionId][$storeId])) {
                    $optionLabel = $optionLabels[$optionId][$storeId];
                }

                // initialize arrays if not present
                if (!isset($mapping[$optionLabel])) {
                    $mapping[$optionLabel] = array(
                        'product_ids' => array(),
                    );
                }
                $mapping[$optionLabel]['product_ids'][] = $childProduct->getId();
                $mapping[$optionLabel]['label'] = $optionLabel;
                $mapping[$optionLabel]['default_label'] = $optionLabels[$optionId][0];
                $mapping[$optionLabel]['labels'] = $optionLabels[$optionId];
                if (in_array($attribute->getAttributeId(),$listSwatchAttr)
                    && !in_array($mapping[$optionLabel]['label'], $listSwatchValues)
                ) {
                    $listSwatchValues[$optionId] = $mapping[$optionLabel]['label'];
                }
            } // end looping child products
        } // end looping attributes


        foreach ($mapping as $key => $value) {
            $mapping[$key]['product_ids'] = array_unique($mapping[$key]['product_ids']);
        }

        $parentProduct->setChildAttributeLabelMapping($mapping)
                      ->setListSwatchAttrValues($listSwatchValues);
    } // end looping parent products
}

/**
 * Determines which product attributes should be selected
 * when children products are attached to parent products
 *
 * @return array
 */
protected function _getChildrenProductsAttributes()
{
    $color_size_attribute = Mage::helper('d1m_productoptionsimage/configurableSwatches_productlist')
        ->getSwatchAttributes();
    $default_attribute = array(
        'small_image',
        'image',
        'image_label',
        'small_image_label',
    );
    return array_merge($color_size_attribute,$default_attribute);
}

/**
 * Attaches children product to each product via
 * ->setChildrenProducts()
 *
 * @param array $products
 * @param int $storeId
 * @return void
 */
public function attachChildrenProducts(array $products, $storeId)
{
    $productIds = array();
    /* @var $product Mage_Catalog_Model_Product */
    foreach ($products as $product) {
        $productIds[] = $product->getId();
    }

    $collection = Mage::getResourceModel(
        'configurableswatches/catalog_product_type_configurable_product_collection');

    $collection->setFlag('product_children', true)
               ->addStoreFilter($storeId)
               ->addAttributeToSelect($this->_getChildrenProductsAttributes());
    $collection->addProductSetFilter($productIds);
    $collection->load();

    $mapping = array();
    /* @var $childProduct Mage_Catalog_Model_Product */
    foreach ($collection as $childProduct) {
        foreach ($childProduct->getParentIds() as $parentId) {
            if (!isset($mapping[$parentId])) {
                $mapping[$parentId] = array();
            }
            $mapping[$parentId][] = $childProduct;
        }
    }

    foreach ($mapping as $parentId => $childrenProducts) {
        $products[$parentId]->setChildrenProducts($childrenProducts);
    }
}

}

Шаг 6:/приложение/код/локальный/D1m/{имя_модуля}/Model/ConfigurableSwatches/Observer.php класс D1m_{имя_модуля}_модель_конфигурируемой_наблюдения_обсервер расширяется Mage_ConfigurableSwatches_Model_Observer {

маг_конфигурируемой_модель_обсервера {
/**
 * Attach children products after product list load
 * Observes: catalog_block_product_list_collection
 *
 * @param Varien_Event_Observer $observer
 */
public function productListCollectionLoadAfter(Varien_Event_Observer $observer)
{
    if (!Mage::helper('configurableswatches')->isEnabled()) { // check if functionality disabled
        return; // exit without loading swatch functionality
    }

    /* @var $helper Mage_ConfigurableSwatches_Helper_Mediafallback */
    $helper = Mage::helper('{your_module_name}/configurableSwatches_mediafallback');

    /* @var $collection Mage_Catalog_Model_Resource_Product_Collection */
    $collection = $observer->getCollection();

    if ($collection
        instanceof Mage_ConfigurableSwatches_Model_Resource_Catalog_Product_Type_Configurable_Product_Collection) {
        // avoid recursion
        return;
    }

    $products = $collection->getItems();

    $helper->attachChildrenProducts($products, $collection->getStoreId());

    $helper->attachConfigurableProductChildrenAttributeMapping($products, $collection->getStoreId());

    $helper->attachGallerySetToCollection($products, $collection->getStoreId());

    /* @var $product Mage_Catalog_Model_Product */
    foreach ($products as $product) {
        $helper->groupMediaGalleryImages($product);
        Mage::helper('configurableswatches/productimg')
            ->indexProductImages($product, $product->getListSwatchAttrValues());
    }

}

}

Наслаждайтесь!

Настраиваемые образцы на странице списка: Отображение нескольких атрибутов цвета

 0
Author: Ruby, 2017-04-13 12:54:58