質問

私が構築しているサイトは、クロスセルを含む製品情報を移行しています(これは複数の場合もあります)。ローカルデータベースでは、製品SKUおよびエンティティIDに関する情報を入力しました。私のスクリプトはこの情報を取り、Cross Sells Associationを作成します。私が抱えている問題は、これらの製品でいくつかのクロス販売が手動で行われており、このスクリプトを実行すると、既存のクロスセールのすべてを書きすぎます。

私のコードは次のとおりです。

umask(0);
require_once '../app/Mage.php';
Mage::app('admin');  

$sql = "SELECT * FROM books2";
$query = mysql_query($sql);

while($row = mysql_fetch_array($query)){    

    $collection = Mage::getModel('catalog/product')->getCollection();

    $collection->addAttributeToSelect('*'); 
    $collection->addFieldToFilter(array(
    array('attribute'=>'sku',   'eq'=>$row['assocIsbn']),

    )); 

    echo "Looking at ".$row['assocIsbn']." relation prod id=".$row['magid']."<br/>";

    foreach ($collection as $product) {

        $magentoID = $row['magid'];

        $param = array(
               $magentoID=>array(
                      'position'=>1
                )
        );
        $product->setCrossSellLinkData($param);

        $product->save();

        echo "Updated ".$row['assocIsbn']." with rel3 product of ".$magentoID." <br/>";

        echo "<hr/>";
    } 

}

私に本当に必要なのは、クロス販売製品を更新するが、既存のクロスセル製品を上書きしないことです。

どんな助けも大歓迎です。

役に立ちましたか?

解決

あなたはあなたを構築することができます $param 既存のデータと既にCrosssellsとして割り当てられている製品とマージすることにより、配列。
このようなクロスセルのリストを取得できます。

$crosssells = $product->getCrossSellProducts();

これにより、製品とのコレクションが提供されます。それをint int int arrayと同じ形式の配列 $param あなたはこれを行うことができます

$param = array();
$crosssells = $product->getCrossSellProducts();
foreach ($crosssells as $item) {
    $param[$item->getId()] = array('position' => $item->getPosition());
}

今あなたは持っています $param すべての既存のクロスセルは「フレンドリーな」形式で。
あなたがする必要があるのは、新しいクロスセルを追加することだけです:

if (!isset($param[$magentoID])){ //prevent elements from beeing overwritten
    $param[$magentoID]= array(
         'position'=>1
    )
}

この後、コードを続行します:

$product->setCrossSellLinkData($param);
$product->save();
ライセンス: CC-BY-SA帰属
所属していません magento.stackexchange
scroll top