Produit : ajouter un champ description sur les options et valeurs des options

  • De le 24 juillet 2012
  • Difficulté : 4/4

Produit : ajouter un champ description sur les options et valeurs des options L'objectif est de décrire précisément la nature d'une option et de ses valeurs lors de la sélection de celles-ci par le client. Cela peut servir d'aide dans le choix de l'option. Il nous faut donc associer un nouveau champ "description" à l'option. (Rédigé à partir d'un Magento CE 1.6.2)

Nous souhaitons obtenir le résultat final suivant :

Description de l'option sur le frontend

Du côté de l'administration, il faut donc proposer de nouveaux champs lors de la saisi de l'option produit :

Description de l'option sur l'admin

Prérequis

Le module contient 2 surcharges inévitables (Quoique, toujours possible de créer de nouveaux blocs, puis de modifier le type dans les layouts). Il a été développé sur un Magento CE 1.6.2.0. Contrôlez préalablement les différences sur les méthodes surchargées. Il peut sinon vous servir de base pour reproduire la même fonctionnalité sur une autre version (çà évite au moins de chercher ^^).

Notez que ce module ne gère le champ description que pour les options de type select. Soit :

  • Drop-down
  • Radio Buttons
  • Checkbox
  • Multipe Select

Vous pouvez l'adapter pour gérer l'ajout d'un champ sur les autres types.

Architecture du module

  • app/code/local/Magentix/ProductOptions/Block/Adminhtml/Catalog/Product/Edit/Tab/Options/
  • Option.php
  • app/code/local/Magentix/ProductOptions/Block/Product/View/Options/Type/
  • Select.php
  • app/code/local/Magentix/ProductOptions/etc/
  • config.xml
  • app/code/local/Magentix/ProductOptions/sql/productoptions_setup/
  • mysql4-install-0.1.0.php
  • app/design/adminhtml/default/{theme}/template/catalog/product/edit/options/
  • option.phtml
  • app/design/adminhtml/default/{theme}/template/catalog/product/edit/options/type/
  • select.phtml
  • app/design/frontend/{package}/{theme}/template/catalog/product/view/options/type/
  • select.phtml
  • app/etc/modules/
  • Magentix_ProductOptions.xml

Développement du module

Configuration

La première étape est d'ajouter les champs nécessaires dans la base de données pour permettre la rédaction d'une description. Une fois ces champs ajoutées, nous devons gérer leur affichage dans l'édition de la fiche produit, onglet "options du produit". Enfin, il nous faut afficher ces descriptions sur la fiche produit du frontend.

Ainsi, le fichier de configuration doit présenter un "setup" pour l'ajout des données. Une surcharge de la méthode chargée de récupérer les options et les valeurs associées depuis l'édition d'une fiche produit est nécessaire. Une deuxième surcharge permet d'ajouter la description à l'affichage des options sur le frontend.

Quelques fichiers des thèmes sont à modifier. Pour les fichiers de l'admin, j'ai créé un thème nommé "magentix". Cela doit être spécifié dans la configuration.

Au final, nous obtenons le fichier de configuration suivant :

app/code/local/Magentix/ProductOptions/etc/config.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Magentix_ProductOptions>
            <version>0.1.0</version>
        </Magentix_ProductOptions>
    </modules>
    <global>
        <blocks>
            <!-- Surcharge : récupérer les champs "description" pour affichage sur l'édition de la fiche produit (admin) -->
            <adminhtml>
                <rewrite>
                    <catalog_product_edit_tab_options_option>Magentix_ProductOptions_Block_Adminhtml_Catalog_Product_Edit_Tab_Options_Option</catalog_product_edit_tab_options_option>
                </rewrite>
            </adminhtml>
            <!-- Surcharge : gérer l'affichage de la description des valeurs sur la fiche produit (frontend) -->
            <catalog>
                <rewrite>
                    <product_view_options_type_select>Magentix_ProductOptions_Block_Product_View_Options_Type_Select</product_view_options_type_select>
                </rewrite>
            </catalog>
        </blocks>
        <resources>
            <!-- Setup -->
            <productoptions_setup>
                <setup>
                    <module>Magentix_ProductOptions</module>
                    <class>Mage_Catalog_Model_Resource_Setup</class>
                </setup>
                <connection>
                    <use>core_setup</use>
                </connection>
            </productoptions_setup>
        </resources>
    </global>
    <stores>
        <admin>
            <!-- Thème de l'admin, nommé ici "magentix" -->
            <design>
                <package>
                    <name>default</name>
                </package>
                <theme>
                    <!-- Remplacez par le thème de votre choix -->
                    <default>magentix</default>
                </theme>
            </design>
        </admin>
    </stores>
</config>

Setup

Le "setup" ajoute le champ description pour :

  • L'option (table catalog_product_option)
  • Les valeurs associées à l'option (table catalog_product_option_type_value)

app/code/local/Magentix/ProductOptions/sql/productoptions_setup/mysql4-install-0.1.0.php

<?php

$installer = $this;

$installer->startSetup();
$connection = $installer->getConnection();

$connection->addColumn($installer->getTable('catalog/product_option'),
                           'description',
                           array(
                               'type' => Varien_Db_Ddl_Table::TYPE_TEXT,
                               'comment' => 'Description'
                           )
                       );

$connection->addColumn($installer->getTable('catalog/product_option_type_value'),
                           'description',
                           array(
                               'type' => Varien_Db_Ddl_Table::TYPE_TEXT,
                               'comment' => 'Description'
                           )
                       );

$installer->endSetup();
Table catalog_product_option_type_value

Administration

Nous devons récupérer la valeur des champs description pour les afficher ensuite dans le template. C'est la méthode getOptionValues de la classe Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Options_Option qui se charge de le faire :

app/code/local/Magentix/ProductOptions/Block/Adminhtml/Catalog/Product/Edit/Tab/Options/Option.php

<?php

class Magentix_ProductOptions_Block_Adminhtml_Catalog_Product_Edit_Tab_Options_Option
      extends Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Options_Option {

    public function getOptionValues() {
        $optionsArr = array_reverse($this->getProduct()->getOptions(), true);
        // $optionsArr = $this->getProduct()->getOptions();

        if (!$this->_values) {
            $showPrice = $this->getCanReadPrice();
            $values = array();
            $scope = (int) Mage::app()->getStore()->getConfig(Mage_Core_Model_Store::XML_PATH_PRICE_SCOPE);
            foreach ($optionsArr as $option) {
                /* @var $option Mage_Catalog_Model_Product_Option */

                $this->setItemCount($option->getOptionId());

                $value = array();

                $value['id'] = $option->getOptionId();
                $value['item_count'] = $this->getItemCount();
                $value['option_id'] = $option->getOptionId();
                $value['title'] = $this->htmlEscape($option->getTitle());

                /* Champ description Option */
                $value['description'] = $option->getDescription();
                /* ************************ */

                $value['type'] = $option->getType();
                $value['is_require'] = $option->getIsRequire();
                $value['sort_order'] = $option->getSortOrder();
                $value['can_edit_price'] = $this->getCanEditPrice();

                if ($this->getProduct()->getStoreId() != '0') {
                    $value['checkboxScopeTitle'] = $this->getCheckboxScopeHtml($option->getOptionId(), 'title',
                        is_null($option->getStoreTitle()));
                    $value['scopeTitleDisabled'] = is_null($option->getStoreTitle())?'disabled':null;
                }

                if ($option->getGroupByType() == Mage_Catalog_Model_Product_Option::OPTION_GROUP_SELECT) {

                    // $valuesArr = array_reverse($option->getValues(), true);

                    $i = 0;
                    $itemCount = 0;
                    foreach ($option->getValues() as $_value) {
                        /* @var $_value Mage_Catalog_Model_Product_Option_Value */
                        $value['optionValues'][$i] = array(
                            'item_count' => max($itemCount, $_value->getOptionTypeId()),
                            'option_id' => $_value->getOptionId(),
                            'option_type_id' => $_value->getOptionTypeId(),
                            'title' => $this->htmlEscape($_value->getTitle()),
                            'price' => ($showPrice)
                                ? $this->getPriceValue($_value->getPrice(), $_value->getPriceType()) : '',
                            'price_type' => ($showPrice) ? $_value->getPriceType() : 0,
                            'sku' => $this->htmlEscape($_value->getSku()),
                            'sort_order' => $_value->getSortOrder(),

                            /* Champ description Valeur */
                            'description' => $_value->getDescription(),
                            /* ************************ */

                        );

                        if ($this->getProduct()->getStoreId() != '0') {
                            $value['optionValues'][$i]['checkboxScopeTitle'] = $this->getCheckboxScopeHtml(
                                $_value->getOptionId(), 'title', is_null($_value->getStoreTitle()),
                                $_value->getOptionTypeId());
                            $value['optionValues'][$i]['scopeTitleDisabled'] = is_null($_value->getStoreTitle())
                                ? 'disabled' : null;
                            if ($scope == Mage_Core_Model_Store::PRICE_SCOPE_WEBSITE) {
                                $value['optionValues'][$i]['checkboxScopePrice'] = $this->getCheckboxScopeHtml(
                                    $_value->getOptionId(), 'price', is_null($_value->getstorePrice()),
                                    $_value->getOptionTypeId());
                                $value['optionValues'][$i]['scopePriceDisabled'] = is_null($_value->getStorePrice())
                                    ? 'disabled' : null;
                            }
                        }
                        $i++;
                    }
                } else {
                    $value['price'] = ($showPrice)
                        ? $this->getPriceValue($option->getPrice(), $option->getPriceType()) : '';
                    $value['price_type'] = $option->getPriceType();
                    $value['sku'] = $this->htmlEscape($option->getSku());
                    $value['max_characters'] = $option->getMaxCharacters();
                    $value['file_extension'] = $option->getFileExtension();
                    $value['image_size_x'] = $option->getImageSizeX();
                    $value['image_size_y'] = $option->getImageSizeY();
                    if ($this->getProduct()->getStoreId() != '0' &&
                        $scope == Mage_Core_Model_Store::PRICE_SCOPE_WEBSITE) {
                        $value['checkboxScopePrice'] = $this->getCheckboxScopeHtml($option->getOptionId(),
                            'price', is_null($option->getStorePrice()));
                        $value['scopePriceDisabled'] = is_null($option->getStorePrice())?'disabled':null;
                    }
                }
                $values[] = new Varien_Object($value);
            }
            $this->_values = $values;
        }

        return $this->_values;
    }

}

Editons maintenant le template pour ajouter le champ description aux options.

Le contenu du fichier est assez conséquent, seule la partie modifiée est ici affichée (située dans les premières lignes du fichier).

app/design/adminhtml/default/magentix/template/catalog/product/edit/options/option.phtml

<?php echo $this->getTemplatesHtml() ?>

<script type="text/javascript">
//<![CDATA[
var firstStepTemplate = '<div class="option-box" id="option_{{id}}">'+
    '<table id="<?php echo $this->getFieldId() ?>_{{id}}" class="option-header" cellpadding="0" cellspacing="0">'+
    '<input type="hidden" id="<?php echo $this->getFieldId() ?>_{{id}}_is_delete" name="<?php echo $this->getFieldName() ?>[{{id}}][is_delete]" value="" />'+
    '<input type="hidden" id="<?php echo $this->getFieldId() ?>_{{id}}_previous_type" name="<?php echo $this->getFieldName() ?>[{{id}}][previous_type]" value="{{type}}" />'+
    '<input type="hidden" id="<?php echo $this->getFieldId() ?>_{{id}}_previous_group" name="<?php echo $this->getFieldName() ?>[{{id}}][previous_group]" value="" />'+
    '<input type="hidden" id="<?php echo $this->getFieldId() ?>_{{id}}_id" name="<?php echo $this->getFieldName() ?>[{{id}}][id]" value="{{id}}" />'+
    '<input type="hidden" id="<?php echo $this->getFieldId() ?>_{{id}}_option_id" name="<?php echo $this->getFieldName() ?>[{{id}}][option_id]" value="{{option_id}}" />'+
    '<thead>'+
    '<tr>'+
    '<th class="opt-title"><?php echo Mage::helper('catalog')->__('Title') ?> <span class="required">*</span></th>'+
    '<th class="opt-type"><?php echo Mage::helper('catalog')->__('Input Type') ?> <span class="required">*</span></th>'+
    '<th class="opt-req"><?php echo $this->jsQuoteEscape(Mage::helper('catalog')->__('Is Required')) ?></th>'+
    '<th class="opt-order"><?php echo Mage::helper('catalog')->__('Sort Order') ?></th>'+
    '<!-- Ajout colonne description --> <th class="opt-description"><?php echo Mage::helper('catalog')->__('Description') ?></th>'+
    '<th class="a-right"><?php echo $this->jsQuoteEscape($this->getDeleteButtonHtml()) ?></th>'+
    '</tr>'+
    '</thead>'+
    '<tr>'+
    '<td><input type="text" class="required-entry input-text" id="<?php echo $this->getFieldId() ?>_{{id}}_title" name="<?php echo $this->getFieldName() ?>[{{id}}][title]" value="{{title}}">{{checkboxScopeTitle}}</td>'+
    '<td><?php echo $this->getTypeSelectHtml() ?></td>'+
    '<td class="opt-req"><?php echo $this->getRequireSelectHtml() ?></td>'+
    '<td><input type="text" class="validate-zero-or-greater input-text" name="<?php echo $this->getFieldName() ?>[{{id}}][sort_order]" value="{{sort_order}}"></td>'+
    '<!-- Ajout colonne description --> <td><input type="text" class="input-text" name="<?php echo $this->getFieldName() ?>[{{id}}][description]" value="{{description}}" /></td>'+
    '<td>&nbsp;</td>'+
    '</tr></table></div>';

<?php
/**
* Récupérez la suite dans le fichier :
* "app/design/adminhtml/default/default/template/catalog/product/edit/options/option.phtml"
*/
?>

Procédons de la même façon pour la description des valeurs.

Encore une fois, je n'affiche ici que la modification du contenu qui nous intéresse.

app/design/adminhtml/default/magentix/template/catalog/product/edit/options/type/select.phtml

<script type="text/javascript">
    //<![CDATA[
    OptionTemplateSelect = '<table class="border" cellpadding="0" cellspacing="0">'+
        '<input type="hidden" class="required-option-select-type-rows" name="validation_{{option_id}}_result" value="" >'+
        '<thead>'+
        '<tr class="headings">'+
        '<th class="type-title"><?php echo Mage::helper('catalog')->__('Title') ?> <span class="required">*</span></th>'+
        <?php if ($this->getCanReadPrice() !== false) : ?>
            '<th class="type-price"><?php echo Mage::helper('catalog')->__('Price') ?></th>' +
            '<th class="type-type"><?php echo Mage::helper('catalog')->__('Price Type') ?></th>' +
        <?php endif; ?>
        '<th class="type-sku"><?php echo Mage::helper('catalog')->__('SKU') ?></th>'+
        '<!-- Ajout colonne description --> <th class="type-description"><?php echo Mage::helper('catalog')->__('Description') ?></th>'+
        '<th class="type-order"><?php echo Mage::helper('catalog')->__('Sort Order') ?></th>'+
        '<th class="type-butt last">&nbsp;</th>'+
        '</tr>'+
        '</thead>'+
        '<tbody id="select_option_type_row_{{option_id}}">'+
        '</tbody>'+
        '<tfoot>'+
        '<tr>'+
        '<td colspan="100" class="a-right"><?php echo $this->getAddButtonHtml() ?></td>'+
        '</tr>'+
        '</tfoot>'+
        '</table>';

    OptionTemplateSelectRow = '<tr id="product_option_{{id}}_select_{{select_id}}">'+
        '<td>'+
        '<input type="hidden" name="product[options][{{id}}][values][{{select_id}}][option_type_id]" value="{{option_type_id}}">'+
        '<input type="hidden" id="product_option_{{id}}_select_{{select_id}}_is_delete" name="product[options][{{id}}][values][{{select_id}}][is_delete]" value="">'+
        '<input type="text" class="required-entry input-text select-type-title" id="product_option_{{id}}_select_{{select_id}}_title" name="product[options][{{id}}][values][{{select_id}}][title]" value="{{title}}">{{checkboxScopeTitle}}</td>'+
        <?php if ($this->getCanReadPrice() !== false) : ?>
            '<td><input type="text" class="input-text validate-number product-option-price" id="product_option_{{id}}_select_{{select_id}}_price" name="product[options][{{id}}][values][{{select_id}}][price]" value="{{price}}"<?php if ($this->getCanEditPrice() === false) : ?> disabled="disabled"<?php endif; ?>></td>' +
            '<td><?php echo $this->getPriceTypeSelectHtml() ?>{{checkboxScopePrice}}</td>' +
        <?php else : ?>
            '<input type="hidden" id="product_option_{{id}}_select_{{select_id}}_price" name="product[options][{{id}}][values][{{select_id}}][price]">' +
            '<input type="hidden" name="product[options][{{id}}][values][{{select_id}}][price_type]" id="product_option_{{id}}_select_{{select_id}}_price_type">' +
        <?php endif; ?>
        '<td><input type="text" class="input-text" name="product[options][{{id}}][values][{{select_id}}][sku]" value="{{sku}}"></td>'+
        '<!-- Ajout colonne description --> <td><input type="text" class="input-text" name="product[options][{{id}}][values][{{select_id}}][description]" value="{{description}}"></td>'+
        '<td><input type="text" class="validate-zero-or-greater input-text" name="product[options][{{id}}][values][{{select_id}}][sort_order]" value="{{sort_order}}"></td>'+
        '<td class="last"><span title="Delete row"><?php echo $this->getDeleteButtonHtml() ?></span></td>'+
        '</tr>';

<?php
/**
* Récupérez la suite dans le fichier :
* "app/design/adminhtml/default/default/template/catalog/product/edit/options/type/select.phtml"
*/
?>

A ce stade nous pouvons déjà ajouter une description sur les options et les valeurs.

Description de l'option sur l'admin

Frontend

Commençons par le plus simple : ajouter la description de l'option. Cela se passe directement dans un des fichier du template.

app/design/frontend/{package}/{theme}/template/catalog/product/view/options/type/select.phtml

<?php /* @var $this Mage_Catalog_Block_Product_View_Options_Type_Select */ ?>
<?php $_option = $this->getOption() ?>
<dt>
    <label<?php if ($_option->getIsRequire()) echo ' class="required"' ?>><?php if ($_option->getIsRequire()) echo '<em>*</em>' ?><?php echo  $this->htmlEscape($_option->getTitle()) ?></label><br />
    <!-- On ajoute la description -->
    <?php if($_option->getDescription()): ?><em><?php echo $_option->getDescription() ?></em><?php endif; ?>
    <!-- ************************ -->
</dt>
<dd<?php if ($_option->decoratedIsLast){?> class="last"<?php }?>>
    <div class="input-box">
        <?php echo $this->getValuesHtml() ?>
        <?php if ($_option->getIsRequire()): ?>
            <?php if ($_option->getType() == Mage_Catalog_Model_Product_Option::OPTION_TYPE_RADIO || $_option->getType() == Mage_Catalog_Model_Product_Option::OPTION_TYPE_CHECKBOX): ?>
                <span id="options-<?php echo $_option->getId() ?>-container"></span>
            <?php endif; ?>
        <?php endif;?>
    </div>
</dd>

Pour les valeurs, nous sommes obligé de surcharger une classe, le code HTML est généré à partir de la méthode getValuesHtml de la classe Mage_Catalog_Block_Product_View_Options_Type_Select :

app/code/local/Magentix/ProductOptions/Block/Product/View/Options/Type/Select.php

<?php

class Magentix_ProductOptions_Block_Product_View_Options_Type_Select
      extends Mage_Catalog_Block_Product_View_Options_Type_Select {

    public function getValuesHtml() {
        $_option = $this->getOption();
        $configValue = $this->getProduct()->getPreconfiguredValues()->getData('options/' . $_option->getId());
        $store = $this->getProduct()->getStore();

        if ($_option->getType() == Mage_Catalog_Model_Product_Option::OPTION_TYPE_DROP_DOWN
            || $_option->getType() == Mage_Catalog_Model_Product_Option::OPTION_TYPE_MULTIPLE) {
            $require = ($_option->getIsRequire()) ? ' required-entry' : '';
            $extraParams = '';
            $select = $this->getLayout()->createBlock('core/html_select')
                ->setData(array(
                'id' => 'select_'.$_option->getId(),
                'class' => $require.' product-custom-option'
            ));
            if ($_option->getType() == Mage_Catalog_Model_Product_Option::OPTION_TYPE_DROP_DOWN) {
                $select->setName('options['.$_option->getid().']')
                    ->addOption('', $this->__('-- Please Select --'));
            } else {
                $select->setName('options['.$_option->getid().'][]');
                $select->setClass('multiselect'.$require.' product-custom-option');
            }
            foreach ($_option->getValues() as $_value) {
                $priceStr = $this->_formatPrice(array(
                    'is_percent' => ($_value->getPriceType() == 'percent') ? true : false,
                    'pricing_value' => $_value->getPrice(true)
                ), false);
                $select->addOption(
                    $_value->getOptionTypeId(),

                    /* On ajoute la description de la valeur */
                    $_value->getTitle() . ' ' . ($_value->getDescription() ? ' (' . $_value->getDescription() . ') ' : '') . $priceStr,
                    /* ************************************* */

                    array('price' => $this->helper('core')->currencyByStore($_value->getPrice(true), $store, false))
                );
            }
            if ($_option->getType() == Mage_Catalog_Model_Product_Option::OPTION_TYPE_MULTIPLE) {
                $extraParams = ' multiple="multiple"';
            }
            if (!$this->getSkipJsReloadPrice()) {
                $extraParams .= ' onchange="opConfig.reloadPrice()"';
            }
            $select->setExtraParams($extraParams);

            if ($configValue) {
                $select->setValue($configValue);
            }

            return $select->getHtml();
        }

        if ($_option->getType() == Mage_Catalog_Model_Product_Option::OPTION_TYPE_RADIO
            || $_option->getType() == Mage_Catalog_Model_Product_Option::OPTION_TYPE_CHECKBOX
        ) {
            $selectHtml = '<ul id="options-'.$_option->getId().'-list" class="options-list">';
            $require = ($_option->getIsRequire()) ? ' validate-one-required-by-name' : '';
            $arraySign = '';
            switch ($_option->getType()) {
                case Mage_Catalog_Model_Product_Option::OPTION_TYPE_RADIO:
                    $type = 'radio';
                    $class = 'radio';
                    if (!$_option->getIsRequire()) {
                        $selectHtml .= '<li><input type="radio" id="options_'.$_option->getId().'" class="'.$class.' product-custom-option" name="options['.$_option->getId().']"' . ($this->getSkipJsReloadPrice() ? '' : ' onclick="opConfig.reloadPrice()"') . ' value="" checked="checked" /><span class="label"><label for="options_'.$_option->getId().'">' . $this->__('None') . '</label></span></li>';
                    }
                    break;
                case Mage_Catalog_Model_Product_Option::OPTION_TYPE_CHECKBOX:
                    $type = 'checkbox';
                    $class = 'checkbox';
                    $arraySign = '[]';
                    break;
            }
            $count = 1;
            foreach ($_option->getValues() as $_value) {
                $count++;

                $priceStr = $this->_formatPrice(array(
                    'is_percent' => ($_value->getPriceType() == 'percent') ? true : false,
                    'pricing_value' => $_value->getPrice(true)
                ));

                $htmlValue = $_value->getOptionTypeId();
                if ($arraySign) {
                    $checked = (is_array($configValue) && in_array($htmlValue, $configValue)) ? 'checked' : '';
                } else {
                    $checked = $configValue == $htmlValue ? 'checked' : '';
                }

                $selectHtml .= '<li>' .
                    '<input type="'.$type.'" class="'.$class.' '.$require.' product-custom-option"' . ($this->getSkipJsReloadPrice() ? '' : ' onclick="opConfig.reloadPrice()"') . ' name="options['.$_option->getId().']'.$arraySign.'" id="options_'.$_option->getId().'_'.$count.'" value="' . $htmlValue . '" ' . $checked . ' price="' . $this->helper('core')->currencyByStore($_value->getPrice(true), $store, false) . '" />' .

                    /* On ajoute la description de la valeur */
                    '<span class="label"><label for="options_'.$_option->getId().'_'.$count.'">'.$_value->getTitle().($_value->getDescription() ? ' <em>(' . $_value->getDescription() . ')</em>' : '') .' '.$priceStr. '</label></span>';
                    /* ************************************* */

                if ($_option->getIsRequire()) {
                    $selectHtml .= '<script type="text/javascript">' .
                        '$(\'options_'.$_option->getId().'_'.$count.'\').advaiceContainer = \'options-'.$_option->getId().'-container\';' .
                        '$(\'options_'.$_option->getId().'_'.$count.'\').callbackFunction = \'validateOptionsCallback\';' .
                        '</script>';
                }
                $selectHtml .= '</li>';
            }
            $selectHtml .= '</ul>';

            return $selectHtml;
        }
    }

}

Bon, vous l'aurez constaté, pas grand chose à ajouter au final. Nous avons simplement eu besoin de modifier des méthodes assez lourdes...

Activation

Reste à activer le module, et à rafraîchir le cache :

app/etc/modules/Magentix_ProductOptions.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Magentix_ProductOptions>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Mage_Catalog />
            </depends>
        </Magentix_ProductOptions>
    </modules>
</config>
commentaires

Commentez cet article : Produit : ajouter un champ description sur les options et valeurs des options