Hintergrund
Mit der Out-of-Box-API allein ist dies nicht möglich . Die Dokumentation scheint diesbezüglich ziemlich klar zu sein, da sie keine Möglichkeit dokumentiert, Auswahlen und Optionen für ein Bundle festzulegen
Abgesehen davon zeigt das Fehlen einer api.xml- Datei im Mage_Bundle
Paket, dass es keine Unterstützung gibt. Vergleichen Sie dies mit einem anderen Produkttyp, der nach 1.0 verfügbar ist, wie z. B. Downloadable, und es ist offensichtlich, dass der Mangel an Unterstützung beabsichtigt zu sein scheint.
Warum sollten sie hier absichtlich auf Unterstützung verzichten? Das Kernteam kann sich wahrscheinlich diesem Ziel anschließen. Ich vermute, dass die Anzahl der verfügbaren Optionen und die Komplexität beim Entwerfen einer solchen API in den Kosten-Nutzen-Berechnungen nicht berücksichtigt wurden.
Also, was tun?
Wie Oleksii bereits betont hat, müssen Sie die Magento-API erweitern, damit dies möglich ist.
Ein eigenständiges Barebone-Skript, das eine Bundle-Auswahl / -Option erstellt, sieht ungefähr so aus:
<?php
require('app/Mage.php');
Mage::app();
$items[] = array(
'title' => 'test title',
'option_id' => '',
'delete' => '',
'type' => 'radio',
'required' => 1,
'position' => 0
);
$selections = array();
$selectionRawData[] = array(
'selection_id' => '',
'option_id' => '',
'product_id' => '159',
'delete' => '',
'selection_price_value' => '10',
'selection_price_type' => 0,
'selection_qty' => 1,
'selection_can_change_qty' => 0,
'position' => 0
);
$selections[] = $selectionRawData;
$product = Mage::getModel('catalog/product')->setStoreId(0);
$product->load(182);
if (!$product) {
//bail
throw new Exception('Product loaded does not exist');
}
Mage::register('product', $product);
Mage::register('current_product', $product);
$product->setCanSaveConfigurableAttributes(false);
$product->setCanSaveCustomOptions(true);
$product->setBundleOptionsData($items);
$product->setBundleSelectionsData($selections);
$product->setCanSaveCustomOptions(true);
$product->setCanSaveBundleSelections(true);
$product->save();
Wir müssten also höchstens eine API-Schnittstelle für die erforderlichen Optionen bereitstellen. Erstellen Sie ein neues Modul mit einem Modell, das das abstrakte Magento-API-Modell erweitert, und einer Methode, die die Parameter $items
und $selectionRawData
als Parameter verwendet:
<?php
class YourCompany_YourModule_Model_Api extends Mage_Api_Model_Resource_Abstract
{
public function createSelectionLink($items, $selectionRawData, $productId, $storeid)
{
$selections = array();
//check if product id in selection data is valid
$optionProduct = Mage::getModel('catalog/product')->load($selectionRawData['product_id']);
if(!$optionProduct->getId()){
throw new Exception('Selection product provided does not reference a valid product');
}
$selections[] = $selectionRawData;
$product = Mage::getModel('catalog/product')->setStoreId($storeid);
$product->load($productId);
if (!$product->getId()) {
//bail
throw new Exception('Product loaded does not exist');
}
Mage::register('product', $product);
Mage::register('current_product', $product);
$product->setCanSaveConfigurableAttributes(false);
$product->setCanSaveCustomOptions(true);
$product->setBundleOptionsData($items);
$product->setBundleSelectionsData($selections);
$product->setCanSaveCustomOptions(true);
$product->setCanSaveBundleSelections(true);
$product->save();
}
}
Denken Sie daran $items
und $selectionRawData
sind Arrays (Beispiele sind oben im eigenständigen Skriptcodeblock aufgeführt).
Erstellen Sie nun eine api.xml- Datei in Ihrem etc
Verzeichnis Ihres Moduls mit den folgenden Inhalten:
<?xml version="1.0"?>
<config>
<api>
<resources>
<bundle_link translate="title" module="yourcompany_bundleapi">
<title>Bundle creation extension</title>
<model>bundleapi/api</model>
<methods>
<createSelectionLink translate="title" module="yourcompany_bundleapi">
<title>Create a selection link</title>
</createSelectionLink>
</methods>
</bundle_link>
</resources>
</api>
</config>
Das ist es.
Und um die neue API aufzurufen, die wir verwenden:
$proxy->call($sessionId, 'bundle_link.createSelectionLink', array($items, $selectionRawData, $productId, $storeid));
Vorsichtsmaßnahmen / Voraussetzungen
- Sie müssen bereits ein Shell-Bundle-Produkt erstellt haben
- Sie müssen bereits ein einfaches Produkt haben, um es in die Auswahl einzubinden
- Sie müssen das Format der API-Array-Parameter verstehen, sonst wird der
save
Aufruf ersticken und Ausnahmen auslösen
- Dies nutzt nur einen
radio
Knopf - es gibt auch andere: dropdown
, checkbox
zum Beispiel.
- Das
$items
Array erstellt ein Bündelelement zum Festpreis. Dies kann ignoriert werden oder für ein dynamisches Preispaket ersticken.
- Der obige Code ist nur ein Beispiel und wird der Kürze halber gekürzt. Wenn Sie dies erstellen, möchten Sie es so codieren, dass es umfassender / ausfallsicherer ist, damit Ihre Entwickler nicht verrückt werden, wenn Sie versuchen, Schnittstellen zu erstellen, die Produkte herstellen.
Verweise:
http://kavinduthundeniya.blogspot.de/2012/11/magento-extention-api-for-bundle.html
/programming/3108775/programmatisch-add-bundle-products-in-magento-using-the-sku-id-of-simple-it