Question

Je développe un système qui intègre une application Django existante avec un magasin Magento. J'ai réussi, en utilisant cette bibliothèque , de créer des produits de type bundle, ainsi que les attributs et les catégories comme prévu. Le problème est que je ne peux pas trouver un moyen, en utilisant l'API (soit par la bibliothèque mentionnée ci-dessus ou en appelant les méthodes de xmlrpc directement), d'ajouter des produits à un paquet précédemment créé. Appel de la méthode catalog_product.info ne retourne pas quelque chose d'utile sur les objets groupés.

La recherche en ligne, je n'ai trouvé des solutions qui impliquent soit:

  • scripts PHP qui utilisent la base de code Magento
  • insertion droite à la base de données

Aucune de ces est actuellement une option pour moi en ce moment, et je ne pense pas être en mesure de le faire en utilisant simplement l'API (soit REST ou SOAP) ne soit pas une attente irréaliste d'avoir.

Était-ce utile?

La solution

Arrière-plan

Il est pas possible avec l'API hors-boîte seule; la documentation semble assez claire à ce sujet car il documente aucun moyen d'établir des sélections, des options pour un paquet

En dehors de cela, l'absence d'un fichier api.xml dans le paquet Mage_Bundle est dit qu'il n'y a pas de soutien. Voilà qui contraste avec un autre type de produit qui est arrivé après 1,0, comme téléchargeable, et il est évident que le manque de soutien semble être intentionnel.

entrer image description ici

Alors, pourquoi seraient-ils intentionnellement soutien Omettre ici? L'équipe de base peut probablement carillon à cette fin. Je pense que le nombre d'options disponibles et de la complexité dans la conception d'une API comme celui-ci n'a tout simplement pas marché dans les calculs coûts / bénéfices.

Alors, Wut faire?

Comme Oleksii déjà indiqué, vous devrez étendre l'API Magento pour permettre que cela se produise.

Un barebone de script autonome qui crée ressemblerait à quelque chose comme une sélection option / bundle ceci:

<?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();

au plus tout ce que nous aurions à faire est de fournir une interface API pour les options requises. Créer un nouveau module avec un modèle qui étend le modèle abstrait API Magento, et une méthode qui prend la $items et $selectionRawData comme paramètres:

<?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();
    }

}

Rappelez-vous que $items et $selectionRawData sont des tableaux (exemples sont énumérés ci-dessus dans le bloc de code script autonome).

Maintenant, créez un api.xml fichier dans votre répertoire etc de votre module avec le contenu suivant:

<?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>

Voilà.

Et d'appeler la nouvelle API, nous utilisons:

$proxy->call($sessionId, 'bundle_link.createSelectionLink', array($items, $selectionRawData, $productId, $storeid));

Mises en garde / pré-requis

  • Vous devez avoir déjà créé un produit de paquet shell
  • Vous devez avoir déjà un produit simple lien dans la sélection
  • Vous devez comprendre le format des paramètres du tableau API ou bien l'appel save va étouffer, lancer des exceptions
  • Il utilise uniquement un type de bouton radio - il y a d'autres. dropdown, checkbox par exemple
  • Le tableau de $items crée un élément de paquet à prix fixe. Cela peut être ignoré ou peut étouffer pour un faisceau de prix dynamique.
  • Le code ci-dessus est un exemple et raccourci pour des raisons de brièveté; si vous construisez ce que vous voudriez le code pour être plus riche en fonctionnalités / résiliente afin de ne pas conduire vos développeurs fou en essayant de créer des interfaces qui fabriquent des produits.

Références:

http: // kavinduthundeniya. blogspot.de/2012/11/magento-extention-api-for-bundle.html

https://stackoverflow.com/questions/3108775/programmatically-add-bundle-products-in-magento-using-the-sku-id-of-simple-it

Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top