どのようにAPIを使用して製品をバンドルに追加しますか?


7

既存のDjangoアプリケーションをMagentoストアと統合するシステムを開発しています。このライブラリーを使用し、バンドルタイプの製品を作成し、属性とカテゴリーを期待どおりに作成しました。問題は、APIを使用して(前述のライブラリを介して、またはxmlrpcメソッドを直接呼び出して)、以前に作成したバンドルに製品を追加する方法が見つからないことです。catalog_product.infoメソッドを呼び出しても、バンドルされたオブジェクトに関する有用なものは何も返されません。

オンラインで調査したところ、次のいずれかを含む解決策しか見つかりませんでした。

  • Magentoコードベースを使用するPHPスクリプト
  • データベースへの直接挿入

現在、これらはどちらも私にとって選択肢ではありません。API(RESTまたはSOAP)だけを使用してこれを実行できることは、非現実的な期待ではありません。



質問に答えましたか?そうでない場合は、状況に応じて回答を調整できるように、詳しい情報を提供してください。
philwinkle 2014年

フィルさん、ごめんなさい。答えはほぼ完璧です。私は、地元の休日のため、ここ数日間オフィスを出ていませんでした。賞金をお楽しみください。
ロドリゴデオドロ2014年

回答:


15

バックグラウンド

すぐに使用できるAPIだけでは不可能です。バンドルの選択、オプションを確立する方法が記載されていないため、ドキュメントはこれについてかなり明確に思われます

それとは別に、パッケージにapi.xmlファイルMage_Bundleがないことは、サポートがないことを示しています。1.0の後にリリースされたDownloadableなどの別の製品タイプとは対照的です。サポートの欠如は意図的なもののようです。

ここに画像の説明を入力してください

では、なぜ彼らはここで故意にサポートを省略したのでしょうか?コアチームは、おそらくその目的を達成することができます。私の推測では、このようなAPIの設計に関する利用可能なオプションの数と複雑さは、コスト/利益の計算ではうまくいきませんでした。

それで、どうですか?

Oleksiiがすでに指摘したように、これを可能にするにはMagento APIを拡張する必要があります。

バンドルの選択/オプションを作成する最小限のスタンドアロンスクリプトは、次のようになります。

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

したがって、せいぜい必要なことは、必要なオプションにAPIインターフェースを提供することだけです。Magento API抽象モデルを拡張するモデルと、$itemsおよび$selectionRawDataをパラメーターとして受け取るメソッドを使用して、新しいモジュールを作成します。

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

}

$items$selectionRawDataは配列であることを覚えておいてください(例は上記のスタンドアロンスクリプトコードブロックにリストされています)。

次に、モジュールのディレクトリにapi.xmlファイルを作成etcし、次の内容を含めます。

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

それでおしまい。

そして、使用する新しいAPIを呼び出すには:

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

注意事項/前提条件

  • シェルバンドル製品をすでに作成している必要があります
  • 選択にリンクする単純な製品をすでに持っている必要があります
  • API配列パラメーターの形式を理解する必要があります。そうしないと、save呼び出しによってチョークが発生し、例外がスローされます
  • これはのみ使用するradioボタンの種類を-などがありますdropdowncheckbox例えば。
  • $items配列は、固定価格のバンドルアイテムを作成します。これは無視されるか、動的価格バンドルでは窒息する可能性があります。
  • 上記のコードは例にすぎず、簡潔にするために省略されています。これを構築している場合は、製品を作成するインターフェイスを作成しようとするときに開発者を狂わせないように、より完全に機能/回復力があるようにコーディングする必要があります。

参照:

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

/programming/3108775/programmatically-add-bundle-products-in-magento-using-the-sku-id-of-simple-it

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.