2

Magentoでの製品リンクには、デフォルトで次のタイプがあります。

  1. 関連している
  2. クロスセル
  3. アップセル
  4. グループ化された製品

デフォルトの機能にデフォルトのオプションを使用しています。ただし、関連商品を別の方法でリンクする必要があります。それは可能ですか?関連リンクオプションと同じように機能する新しいリンクメソッドを作成することはできますか?

グリーティングカードのようなカスタマイズ可能な印刷物を販売しています。カードの正面図をストアで検索および表示できるようにするだけです。これを「マスター製品」と呼ぶことができます。顧客が気に入ったカード製品をクリックしたら、カードの内側と裏に異なる製品オプションを表示する必要があります。これらは私の店の個々のマゼント製品です。一部のカードには、異なるテキストオプション、写真オプションなどがあります。

したがって、バックエンドに新しい「マスター製品」を追加するときは、内部に関連付けられている製品と、バックに関連付けられている製品をそのマスター製品に「リンク」する必要があります。

「関連商品」タブの仕組みは素晴らしいです。製品の作成ページにある独自のリンク属性タブを使用してその機能を再作成できれば、問題はないはずです。

4

1 に答える 1

12

さて、2つのオプションがあります。製品を照合するための迅速でそれほど柔軟ではないSKUパターンの方法、またはMagentoにまったく新しい製品リンク関係を追加することもできます。明らかに、最後のオプションはより多くの時間がかかりますが、管理者からの関係を処理し、バッチ内の表示順序を決定する可能性を提供します。

オプション1:SKUでのマッチング(簡単、迅速、おそらく少し汚い)

たとえば、現在の商品の最初の4文字を取得し、それを使用して残りの商品データベースと照合するメソッドを作成できます。

その下には、そのコードがどのように見えるかのモックアップバージョンがあります。

$match = substr($product->getSku(), 0, 4);
$resource = Mage::getModel('core/resource');
$read = $resource->getConnection('core_read');

$select = $read->select()
    ->from(array('e'=>$resource->getTableName('catalog/product')), 'entity_id')
    ->where("e.sku LIKE '" . $match . "%'");
$ids = $read->fetchAll($select);

これにより、一致する製品のIDが取得されます。次に、これらのIDを次のように商品コレクションに読み込むことができます。

$_productCollection = Mage::getModel('catalog/product')->getCollection()
    ->addAttributeToSelect('<your_needed_product_attributes>')
    ->addAttributeToFilter('entity_id',array('in'=> <your_array_of_productids>));

 Mage::getSingleton('catalog/product_status')->addSaleableFilterToCollection($_productCollection);
 Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($_productCollection);
 $_productCollection->addStoreFilter()->load();

これで、コレクションをループしてHTMLを作成するだけで済みます。

オプション2:新しい製品関係を追加する

Magentoはテーブルcatalog_product_linkを使用して、すべてのタイプの製品関係を格納します。で、catalog_product_link_type新しいリンクタイプを追加します。これは、に新しいリンクタイプのデータを挿入できるようにするために必要ですcatalog_product_link。この新しいリンクタイプは、モジュールのアップグレードスクリプトを介して追加する必要があります。

この時点から、Magento管理者に調整と追加を行う必要があります。これは答えの場所であり、本格的なモジュールソリューションではないため、新しいリンクタイプを追加するために注意が必要な場所にのみマークを付けます。ただし、以下の情報があれば、新しい関係を立ち上げて実行するのにそれほど問題はないと思います。

1)製品編集管理ページのメニューに新しいタイプのタブを追加します。

のようにMage_Adminhtml_Block_Catalog_Product_Edit_Tabs、リンクタイプの新しいタブを作成する必要があります。

        $this->addTab('combine', array(
            'label'     => Mage::helper('catalog')->__('Combine'),
            'url'       => $this->getUrl('*/*/combine', array('_current' => true)),
            'class'     => 'ajax',
        ));

*/*/combineMage_Adminhtml_Catalog_ProductControllerコントローラの結合アクションにルーティングされます。自分のモジュールへの別のルートを使用したい場合もありますが、この例ではこれに固執します。

2)ページ要求*/*/combine/を処理するには、このアクションをコントローラーで使用できるようにする必要があります。このためのコード参照がありますMage_Adminhtml_Catalog_ProductController

/**
 * Get combine products grid and serializer block
 */
public function combineAction()
{
    $this->_initProduct();
    $this->loadLayout();
    $this->getLayout()->getBlock('catalog.product.edit.tab.combine')
        ->setProductsUpsell($this->getRequest()->getPost('products_combine', null));
    $this->renderLayout();
}

このタブ内で後のグリッドアクションを処理するためのアクションも必要です。

/**
 * Get upsell products grid
 */
public function combineGridAction()
{
    $this->_initProduct();
    $this->loadLayout();
    $this->getLayout()->getBlock('catalog.product.edit.tab.combine')
        ->setProductsRelated($this->getRequest()->getPost('products_combine', null));
    $this->renderLayout();
}

さらに、このコントローラーには、->_initProductSave()製品関係が要求からフェッチされ、「保存される」製品オブジェクトに追加されるメソッドも含まれています。

コントローラを拡張するか、オブザーバを使用して、下のスニペットを追加する必要があります。あなたの呼び出し。catalog_product_before_saveオブザーバーはこれを行うための最良の方法です。

    if (isset($links['combine']) && !$product->getCombineReadonly()) {
        $product->setCombineLinkData(Mage::helper('adminhtml/js')->decodeGridSerializedInput($links['combine']));
    }

ステップ5では、新しい関係を前述catalog_product_linkのテーブルにさらに保存するために、このデータが再度取得されます。

3)ステップ2で作成しようとしているレイアウトは、次のXMLハンドルがないとあまり効果がありません。

<adminhtml_catalog_product_combine>
    <block type="core/text_list" name="root">
        <block type="<your_own_custom_block_for_product_link_type>" name="catalog.product.edit.tab.combine"/>
        <block type="adminhtml/widget_grid_serializer" name="upsell_grid_serializer">
            <reference name="upsell_grid_serializer">
                <action method="initSerializerBlock">
                    <grid_block_name>catalog.product.edit.tab.combine</grid_block_name>
                    <data_callback>getSelectedCombineProducts</data_callback>
                    <hidden_input_name>links[combine]</hidden_input_name>
                    <reload_param_name>products_combine</reload_param_name>
                </action>
                <action method="addColumnInputName">
                    <input_name>position</input_name>
                </action>
            </reference>
        </block>
    </block>
</adminhtml_catalog_product_combine>

<adminhtml_catalog_product_combinegrid>
    <block type="core/text_list" name="root">
        <block type="<your_own_custom_block_for_product_link_type>" name="catalog.product.edit.tab.combine"/>
    </block>
</adminhtml_catalog_product_combinegrid>

4)これらすべてが整ったら、「combine」タイプのブロックを作成する必要があります。

この手順はfairly簡単です。Mage_Adminhtml_Block_Catalog_Product_Edit_Tab_Upsell参考にしてください。このファイルの正確なコピーがほとんど必要です。したがって、それをモジュールに配置し、すべてのアップセルの名前を「combine」またはこの関係に使用している名前に変更します。このブロックタイプは<your_own_custom_block_for_product_link_type>、手順3で配置する必要があります。

5)Mage_Catalog_Model_Product_Linkを拡張する

Mage_Catalog_Model_Product_Linkリレーションタイプに関するすべてのデータを保持するファイルです。たとえば、使用可能なタイプや、リレーションタイプを保存およびロードするためのロジックなどです。

あなたの拡張では、少なくとも次のものが必要です:

  • リレーションタイプを定義する定数const LINK_TYPE_COMBINE = 6;
  • 次のuseCombineLinksような方法useUpsellLinks
  • saveProductRelations下に追加されたメソッドの拡張。これはおそらく適切なイベントオブザーバーを介して実行することもできますが。

    $data = $product->getCombineLinkData();
    if (!is_null($data)) {
        $this->_getResource()->saveProductLinks($product, $data, self::LINK_TYPE_COMBINE);
    }
    

このスニペットは、製品が保存された後に最終的にトリガーされます。

6)製品モデルへの新しいリレーションロジックの追加管理者を稼働させるための最後のステップは、製品モデルに追加する必要のあるロジックです(Mage_Catalog_Model_Product)。このモデルのモジュールから拡張を介してこれらのメソッドを追加することをお勧めします。

4つのメソッドを追加する必要があります。以下を参照として使用し、それらをコピーしてリレーション名に名前を変更できます。

  • getUpSellProducts
  • getUpSellProductIds
  • getUpSellProductCollection
  • getUpSellLinkCollection

上記の手順を実行すると、この新しい製品関係を追加および処理するための作業管理者が必要になります。残っているのは、ページの「フロントエンド」レイアウトで使用するブロックがあることだけです。繰り返しますが、これの良いリファレンスはですMage_Catalog_Block_Product_List_Upsell

これがあなたに最初にいくつかの良い情報を与えることを願っています。どちらに行くかを選択します。前述のように、2番目のオプションはより多くの作業ですが、管理者を通じてより柔軟性があり、より堅牢なソリューションです。

于 2012-08-06T19:48:20.317 に答える