web-dev-qa-db-fra.com

Comment obtenir des options personnalisées par programme dans Magento

J'ai quelques produits à la caisse dont j'ai besoin pour pouvoir obtenir toutes les options personnalisées qui sont sélectionnées pour eux via le code.

Toute aide est très appréciée!

13
DaveC

Je vais simplement vous donner un exemple d'un produit. Disons que vous connaissez le Sku (par exemple, laissez-le être "ABCDE") de votre produit requis. Ainsi, vous pourrez obtenir l'ID de ce produit.

Le code sera un peu comme: -

$productSku = "ABCDE";
$product = Mage::getModel('catalog/product');
$productId = $product->getIdBySku( $productSku );
$product->load($productId);

/**
 * In Magento Models or database schema level, the product's Custom Options are
 * executed & maintained as only "options". So, when checking whether any product has
 * Custom Options or not, we should check by using this method "hasOptions()" only.
 */
if($product->hasOptions()) {
    echo '<pre>';

    foreach ($product->getOptions() as $o) {
        $optionType = $o->getType();
        echo 'Type = '.$optionType;

        if ($optionType == 'drop_down') {
            $values = $o->getValues();

            foreach ($values as $k => $v) {
                print_r($v);
            }
        }
        else {
            print_r($o);
        }
    }

    echo '</pre>';
}

Je pense que cela vous permettra de commencer.

Selon le type de l'option dans la variable "$optionType ", vous devez appeler une autre boucle imbriquée" foreach ". J'ai travaillé sur des zones de texte, des champs de texte, des listes déroulantes, mais pas sur d'autres types. Je suppose donc que vous devez faire plus de RnD en toi même.

23
Knowledge Craving

Pour ceux qui souhaitent voir les options personnalisées sélectionnées plus tard dans panneau d'administration dans Order/Invoice/Shipment/Creditmemo, recherchez les fichiers:/app/design/adminhtml/[default]/default/template/sales/order /view/items/renderer/default.phtml
/app/design/adminhtml/[default] /default/template/sales/order/invoice/view/items/renderer/default.phtml/app/design/adminhtml/[default]/default/template/ventes/commande/expédition/vue/items/renderer/default.phtml /app/design/adminhtml/[default Often/default/template/sales/order/creditmemo/view/items/renderer/default.phtml PS: je n'ai pas ' t changé les fichiers configurated.phtml pour facture/expédition/creditmemo

et insérez le code quelque part après <?php echo $_item->getSku(); ?></div> et avant la balise de fermeture de la ligne </td> (attention, c'est différent pour chaque fichier)

Insérer le code:

        <?php  
    //---------start:---------------          
    // if ($allOptions = $_item->_getData('product_options')) {             // only for order item
    if ($allOptions = $_item->getOrderItem()->getData('product_options')) { // for invoice, shipping, creditmemo
        $options = unserialize($allOptions);

        if (isset($options['options'])) { 
            foreach ($options['options'] as $optionValues) {
                if ($optionValues['value']) {
                    echo '&nbsp;<strong><i>'. $optionValues['label'].'</i></strong>: ';

                    $_printValue = isset($optionValues['print_value']) ? $optionValues['print_value'] : strip_tags($optionValues['value']);
                    $values = explode(', ', $_printValue);
                    foreach ($values as $value) {
                        if (is_array($value))
                          foreach ($value as $_value) 
                              echo $_value;
                        else echo $value; 
                    }
                    echo '<br />';
                }
            }    
        }
    }
    //---------end:---------------                  
    ?>        

Notez également que dans le code, il y a une ligne (si phrase) qui ne fonctionne que dans le fichier order default.phtml, et la seconde si la phrase fonctionne dans les fichiers facture/expédition/creditmemo. Cela dépend de l'endroit où vous publiez le code, assurez-vous que la bonne phrase est commentée.

j'espère que cela aide, grâce aussi à Knowledge Craving dont le code m'a beaucoup aidé :-) jazkat

7
jazkat

Veuillez noter que

$product->hasCustomOptions()

dans la solution de "Knowledge Craving" renvoie toujours false (du moins dans mon cas, Magento 1.6.2). Par conséquent, la condition if n'est jamais remplie et le bloc ci-dessous n'est pas exécuté.

7
marco birchler
    $quote=$observer->getEvent()->getQuote();
    $quoteid=$quote->getId();
    $session= Mage::getSingleton('checkout/session');
    $getotal = Mage::helper('checkout')->getQuote()->getGrandTotal();

    foreach($session->getQuote()->getAllItems() as $item)
        {

         $sellcheck = Mage::getModel('catalog/product')->load($item->getProduct()->getId())->getissellbool();
         $options = Mage::getModel('catalog/product')->load($item->getProduct()->getId())->getProductOptionsCollection();
         foreach ($options as $o) 
             { 
                $title = $o->getTitle();
                $values = $o->getValues();
                foreach($values as $v)
                  {
                     $mydata = $v->getPrice();
                     echo 'options price: ' . $mydata;                      
                        }

               } 

          }

Pour accéder aux options personnalisées du produit dans le panier, vous pouvez utiliser ce code.

3
Chiragit007

J'espère que cela vous sera utile pour obtenir uniquement les valeurs de liste déroulante personnalisée dans la page produit

Collez enfin le code suivant dans ce fichier

app/design/frontend/base/default/template/catalog/product/view/options.phtml

<?php
    $product = Mage::getModel("catalog/product")->load($this->getProduct()->getId()); //product id
    foreach ($product->getOptions() as $_option) {
        $values = $_option->getValues();
        foreach ($values as $v) {
            print_r($v->getTitle());
            echo "<br />";
        }
    }
?>
2
Naresh

Nous pouvons également résoudre comme ça, qui peut s'afficher sur la page de paiement.

 $items = Mage::getModel('checkout/cart')->getQuote()->getAllVisibleItems();
 foreach($items as $product) {
     $options = $product->getProduct()->getTypeInstance(true)->getOrderOptions($product->getProduct());
     if ($options)
     {
        if (isset($options['options']))
        {
           $result = $options['options'];
        }
        if(count($result)>0){
           foreach($result as $key =>$value){
                $resultoption =  $value['value'];
           }
        }
    }
1
502_Geek

Vous pouvez essayer ce code dans template/checkout/cart/item/default.php:

if($Product->hasOptions)
            {
                $optionsArr = $Product->getOptions();
                 foreach ($optionsArr as  $optionKey => $optionVal)
                {
                          $optStr.= "<select style='display:block; clear:both;' name='options[".$optionVal->getId()."]'>";    
                  foreach($optionVal->getValues() as $valuesKey => $valuesVal)
                    {
                          $optStr.= "<option value='".$valuesVal->getId()."'>".$valuesVal->getTitle()."</option>";
                    }
                    $optStr.= "</select>";
                    }
   echo($optStr ); 
            }
0