Preis für konfigurierbare Produktoptionen abrufen


9

Ich muss alle Produkte mit Preisen von Magento 1.7 exportieren.

Für einfache Produkte ist dies kein Problem, aber für konfigurierbare Produkte habe ich dieses Problem: Der exportierte Preis ist der Preis, der für das zugehörige einfache Produkt festgelegt wurde! Wie Sie wissen, ignoriert Magento diesen Preis und verwendet den Preis des konfigurierbaren Produkts plus Anpassungen für die ausgewählten Optionen.

Ich kann den Preis des übergeordneten Produkts ermitteln, aber wie berechne ich die Differenz in Abhängigkeit von den ausgewählten Optionen?

Mein Code sieht ungefähr so ​​aus:

foreach($products as $p)
   {
    $price = $p->getPrice();
            // I save it somewhere

    // check if the item is sold in second shop
    if (in_array($otherShopId, $p->getStoreIds()))
     {
      $otherConfProd = Mage::getModel('catalog/product')->setStoreId($otherShopId)->load($p->getId());
      $otherPrice = $b2cConfProd->getPrice();
      // I save it somewhere
      unset($otherPrice);
     }

    if ($p->getTypeId() == "configurable"):
      $_associatedProducts = $p->getTypeInstance()->getUsedProducts();
      if (count($_associatedProducts))
       {
        foreach($_associatedProducts as $prod)
         {
                            $p->getPrice(); //WRONG PRICE!!
                            // I save it somewhere
                        $size $prod->getAttributeText('size');
                        // I save it somewhere

          if (in_array($otherShopId, $prod->getStoreIds()))
           {
            $otherProd = Mage::getModel('catalog/product')->setStoreId($otherShopId)->load($prod->getId());

            $otherPrice = $otherProd->getPrice(); //WRONG PRICE!!
                            // I save it somewhere
            unset($otherPrice);
            $otherProd->clearInstance();
            unset($otherProd);
           }
         }
                     if(isset($otherConfProd)) {
                         $otherConfProd->clearInstance();
                            unset($otherConfProd);
                        }
       }

      unset($_associatedProducts);
    endif;
  }

Antworten:


13

So erhalten Sie die Preise für die einfachen Produkte. Das Beispiel bezieht sich auf ein einzelnes konfigurierbares Produkt, das Sie jedoch in Ihre Schleife integrieren können.
Möglicherweise liegt ein Problem mit der Leistung vor, da es viele foreachSchleifen gibt, aber zumindest haben Sie einen Ausgangspunkt. Sie können später optimieren.

//the configurable product id
$productId = 126; 
//load the product - this may not be needed if you get the product from a collection with the prices loaded.
$product = Mage::getModel('catalog/product')->load($productId); 
//get all configurable attributes
$attributes = $product->getTypeInstance(true)->getConfigurableAttributes($product);
//array to keep the price differences for each attribute value
$pricesByAttributeValues = array();
//base price of the configurable product 
$basePrice = $product->getFinalPrice();
//loop through the attributes and get the price adjustments specified in the configurable product admin page
foreach ($attributes as $attribute){
    $prices = $attribute->getPrices();
    foreach ($prices as $price){
        if ($price['is_percent']){ //if the price is specified in percents
            $pricesByAttributeValues[$price['value_index']] = (float)$price['pricing_value'] * $basePrice / 100;
        }
        else { //if the price is absolute value
            $pricesByAttributeValues[$price['value_index']] = (float)$price['pricing_value'];
        }
    }
}

//get all simple products
$simple = $product->getTypeInstance()->getUsedProducts();
//loop through the products
foreach ($simple as $sProduct){
    $totalPrice = $basePrice;
    //loop through the configurable attributes
    foreach ($attributes as $attribute){
        //get the value for a specific attribute for a simple product
        $value = $sProduct->getData($attribute->getProductAttribute()->getAttributeCode());
        //add the price adjustment to the total price of the simple product
        if (isset($pricesByAttributeValues[$value])){
            $totalPrice += $pricesByAttributeValues[$value];
        }
    }
    //in $totalPrice you should have now the price of the simple product
    //do what you want/need with it
}

Der obige Code wurde auf CE-1.7.0.2 mit den Magento-Beispieldaten für 1.6.0.0 getestet.
Ich habe das Produkt Zolof The Rock'n'Roll Destroyer: LOL Cat T-Shirt getestet und es funktioniert nahtlos. Ich erhalte als Ergebnis die gleichen Preise wie im Frontend, nachdem ich das Produkt von Sizeund konfiguriert habeColor


3

Könnte es sein , dass Sie ändern müssen , $pum $prodin der unten stehenden Code?

 foreach($_associatedProducts as $prod)
         {
                            $p->getPrice(); //WRONG PRICE!!

2

So mache ich es:

$layout = Mage::getSingleton('core/layout');
$block = $layout->createBlock('catalog/product_view_type_configurable');
$pricesConfig = Mage::helper('core')->jsonDecode($block->getJsonConfig());

Zusätzlich können Sie es in Varien_Object konvertieren:

$pricesConfigVarien = new Varien_Object($pricesConfig);

Im Grunde genommen verwende ich dieselbe Methode, mit der die Preise für Ihre konfigurierbare Produktseite im Magento-Kern berechnet werden.


0

Ich bin mir nicht sicher, ob dies helfen würde, aber wenn Sie diesen Code zur Seite configure.phtml hinzufügen, sollten die Superattribute der konfigurierbaren Produkte mit dem Preis jeder Option und ihrer Bezeichnung ausgespuckt werden.

   $json =  json_decode($this->getJsonConfig() ,true);


    foreach ($json as $js){
        foreach($js as $j){

      echo "<br>";     print_r($j['label']); echo '<br/>';

            foreach($j['options'] as $k){
                echo '<br/>';     print_r($k['label']); echo '<br/>';
                print_r($k['price']); echo '<br/>';
            }
        }
    }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.