Manipuler les options personnalisables associées aux produits (Custom Options)

  • De le 19 juin 2012
  • Difficulté : 1/4

Manipuler les options personnalisables associées aux produits (Custom Options) Voici quelques fonctions utiles pour manipuler les options personnalisables associées aux produits : récupérer la liste des options et leurs valeurs, ajouter un produit au panier avec options, interagir sur les valeurs une fois le produit ajouté au panier... (Rédigé à partir d'un Magento CE 1.7)

Custom Options

Obtenir la liste des options associées à un produit :


$productId = 1;
$product = Mage::getModel('catalog/product')->load($productId);

foreach($product->getOptions() as $o) {
    // Zend_debug::dump($o->getData());

    // echo $o->getTitle();
    // echo $o->getOptionId();
    // echo $o->getType();
    // etc...
}

Obtenir la liste des options associées à un produit, puis la liste des valeurs de l'option :


$productId = 1;
$product = Mage::getModel('catalog/product')->load($productId);

foreach($product->getOptions() as $o) {
    $values = $o->getValues();

    foreach($values as $v) {
        // Zend_debug::dump($v->getData());

        // echo $v->getTitle();
        // echo $v->getOptionId();
        // echo $v->getSku();
        // echo $v->getPrice();
        // echo $v->getPriceType();
        // etc...
    }
    
}

Charger une option selon son id :


$optionId = 1;

$option = Mage::getModel('catalog/product_option')->load($optionId);

// Zend_debug::dump($option->getData());

Obtenir la liste des options associées aux produits ajoutés dans le panier :


$items = Mage::getSingleton('checkout/session')->getQuote()->getAllItems();

foreach($items as $item) {
    $_options = $item->getProduct()->getTypeInstance(true)->getOrderOptions($item->getProduct());

    foreach($_options["options"] as $option) {
        // Zend_debug::dump($option);

        // echo $option['label'];
        // echo $option['value'];
        // echo $option['print_value'];
        // echo $option['option_id'];
        // echo $option['option_type'];
        // echo $option['option_value'];
        // echo $option['custom_view'];

        // Pour charger l'option :

        // $_option = Mage::getModel('catalog/product_option')->load($option['option_id']);
    }
}

Ajouter un produit au panier avec une option par défaut et une valeur associée par défaut :


$cart = Mage::getSingleton('checkout/cart');

$productId = 1;
$product = Mage::getModel('catalog/product')->load($productId);

$optionId = 1;
$valueId = 1;

$options['options'][$optionId] = $valueId;

$cart->addProduct($product,$options)->save();

Modifier la valeur de l'option d'un produit déjà ajouté au panier :


$productId = 1;
$optionId = 1;
$valueId = 1;

$items = Mage::getSingleton('checkout/session')->getQuote()->getAllItems();

foreach($items as $item) {

    if($item->getProductId() == $productId) {

        $o = $item->getOptionByCode('option_'.$optionId);
        $o->setHasQtyOptionUpdate(true);
        $item->updateQtyOption($o,$value);
        $o->setValue($valueId);

    }
}

Mage::getSingleton('checkout/cart')->save();

Ajouter une option à un produit déjà présent dans le panier :


$productId = 1;
$optionId = 1;
$valueId = 1;

$items = Mage::getSingleton('checkout/session')->getQuote()->getAllItems();

foreach($items as $item) {

    if($item->getProductId() == $productId) {

        $item->addOption(new Varien_Object(
                array(
                    'product' => $item->getProduct(),
                    'code' => 'option_'.$optionId,
                    'value' => $valueId
                )
            )
        );

        $item->setQty(1);

        $o = $item->getOptionByCode('option_ids');
        $o->setHasQtyOptionUpdate(true);
        $item->updateQtyOption($o,$o->getValue().','.$optionId);
        $o->setValue($o->getValue().','.$optionId);

    }

}

Mage::getSingleton('checkout/cart')->save();

Supprimer l'option d'un produit déjà présent dans le panier :


$productId = 1;
$optionId = 1;

$items = Mage::getSingleton('checkout/session')->getQuote()->getAllItems();

foreach($items as $item) {

    if($item->getProductId() == $productId) {

        $o = $item->getOptionByCode('option_'.$optionId);

        if($o) {
            $item->removeOption('option_'.$optionId);

            $oIds = $item->getOptionByCode('option_ids');
            $oIds->setHasQtyOptionUpdate(true);

            $selected = explode(',',$oIds->getValue());
            $selected = implode(',',array_diff($selected, array($optionId)));
            $item->updateQtyOption($oIds,$selected);
            $oIds->setValue($selected);

            $value = $o->getValue();

            $o->setHasQtyOptionUpdate(true);
            $item->updateQtyOption($o,$value);
            $o->setValue($value);
        }
    }

}

Mage::getSingleton('checkout/cart')->save();

Obtenir les options sélectionnées pour les produits d'une commande :


$orderId = 1;
$order = Mage::getModel('sales/order')->load($orderId);

$items = $order->getAllItems();

foreach($items as $item) {
    $_options = $item->getProductOptions();

    foreach($_options["options"] as $option) {
        // Zend_debug::dump($option);

        // echo $option['label'];
        // echo $option['value'];
        // echo $option['print_value'];
        // echo $option['option_id'];
        // echo $option['option_type'];
        // echo $option['option_value'];
        // echo $option['custom_view'];
    }
}

Obtenir les informations des valeurs, toutes options confondues et tous produits confondus :


$values = Mage::getModel('catalog/product_option_value')->getCollection()
          ->addTitleToResult(Mage::app()->getStore()->getId())
          ->addPriceToResult(Mage::app()->getStore()->getId());

// "addTitleToResult" et "addPriceToResult" peuvent être remplacés par "getValues" :

// $storeId = Mage::app()->getStore()->getId();
// Mage::getModel('catalog/product_option_value')->getCollection()->getValues($storeId);

foreach($values as $value) {
    // Zend_debug::dump($value->getData());
}

Obtenir les informations d'une valeur, selon son identifiant :


$idValue = 1;

$value = Mage::getModel('catalog/product_option_value')->getCollection()
          ->getValuesByOption($idValue)
          ->addTitleToResult(Mage::app()->getStore()->getId())
          ->addPriceToResult(Mage::app()->getStore()->getId())
          ->getFirstItem();

// Zend_debug::dump($value->getData());

// echo $value->getTitle();
// echo $value->getOptionId();
// echo $value->getSku();
// echo $value->getPrice();
// echo $value->getPriceType();
// etc...

Obtenir les informations de plusieurs valeurs, selon leur identifiant :


$valuesId = array(1,2,3,4,5);

$values = Mage::getModel('catalog/product_option_value')->getCollection()
          //->addFieldToFilter('main_table.option_type_id',$valuesId)
          ->getValuesByOption($valuesId)
          ->addTitleToResult(Mage::app()->getStore()->getId())
          ->addPriceToResult(Mage::app()->getStore()->getId());

// "getValuesByOption" accepte aussi bien un Array qu'un Integer
// Utiliser "addFieldToFilter" ou "getValuesByOption" revient au même
// Voir "Mage_Catalog_Model_Resource_Product_Option_Value_Collection"

foreach($values as $value) {
    // Zend_debug::dump($value->getData());

    // echo $value->getTitle();
    // echo $value->getOptionId();
    // echo $value->getSku();
    // echo $value->getPrice();
    // echo $value->getPriceType();
    // etc...
}
commentaires

Commentez cet article : Manipuler les options personnalisables associées aux produits (Custom Options)