Wie verwenden Sie die API, um einem Bundle Produkte hinzuzufügen?

7

Ich entwickle ein System, das eine vorhandene Django-Anwendung in einen Magento-Store integriert. Mit dieser Bibliothek habe ich es geschafft, erwartungsgemäß Produkte vom Typ Bundle zusammen mit Attributen und Kategorien zu erstellen. Das Problem ist, dass ich mithilfe der API (entweder über die oben genannte Bibliothek oder durch xmlrpcdirekten Aufruf der Methoden) keine Möglichkeit finden kann, Produkte zu einem zuvor erstellten Bundle hinzuzufügen. Das Aufrufen der catalog_product.infoMethode gibt nichts Nützliches über die gebündelten Objekte zurück.

Ich habe online recherchiert und nur Lösungen gefunden, die Folgendes beinhalten:

  • PHP-Skripte, die die Magento-Codebasis verwenden
  • Direktes Einfügen in die Datenbank

Beides ist derzeit keine Option für mich, und ich denke nicht, dass es keine irrealistische Erwartung ist, dies nur mit der API (entweder REST oder SOAP) tun zu können.

Rodrigo Deodoro
quelle
Habe ich die Frage beantwortet? Wenn nicht, geben Sie bitte weitere Informationen an, damit ich meine Antwort auf Ihre Situation zuschneiden kann.
Philwinkle
Hey Phil, tut mir leid. Die Antwort ist ziemlich perfekt, ich war in den letzten Tagen wegen eines örtlichen Feiertags nicht im Büro. Genieße das Kopfgeld.
Rodrigo Deodoro

Antworten:

15

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_BundlePaket, 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.

Geben Sie hier die Bildbeschreibung ein

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 $itemsund $selectionRawDataals 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 $itemsund $selectionRawDatasind Arrays (Beispiele sind oben im eigenständigen Skriptcodeblock aufgeführt).

Erstellen Sie nun eine api.xml- Datei in Ihrem etcVerzeichnis 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 saveAufruf ersticken und Ausnahmen auslösen
  • Dies nutzt nur einen radioKnopf - es gibt auch andere: dropdown, checkboxzum Beispiel.
  • Das $itemsArray 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

philwinkle
quelle