2

400 を超えるカテゴリを Magento インストールにインポートしました。各カテゴリには複数の製品がありますが、カテゴリ画像はありません。

すべてのカテゴリをループして、現在のカテゴリ内の最初の製品の画像の URL を返すスクリプトを作成しました。

次のステップは、返された製品画像をその親カテゴリの画像として設定することです。

私の最初のアプローチは、MAGMI で使用するためにカテゴリ ID とカテゴリ画像 URL を含む CSV をフォーマットすることでしたが、http://sourceforge.net/apps/mediawiki/magmi/index.php?title=Import_categories のドキュメントを調べた後カテゴリ画像のインポートに関する情報が見つかりません。これはMAGMIで可能ですか?

上記に失敗した場合、私の次のアプローチは、PHP を使用してプログラムでカテゴリ イメージを設定することでした。MAGMI アプローチが失敗した場合に変更する予定の次のスニペットを見つけました。setThumbnail メソッドの $image パラメータが完全修飾 URL を受け入れるかどうか、またはこれがローカル ファイル パスのみを参照するかどうかを確認できますか?

$category = Mage::getModel('catalog/category')->load($cat);
$category->setImage($image);
$category->save();

すべてのご意見をお待ちしております。

4

1 に答える 1

3

OK - カテゴリ イメージをインポートできる MAGMI を使用したソリューションが見つかりませんでした。代わりに、次のような PHP ソリューションにたどり着きました。

  1. すべての Magento 製品カテゴリをループします
  2. 現在のカテゴリ内の製品からランダムな (または定義された) 画像を保存します
  3. 手順 2 で保存した画像で現在のカテゴリ画像を更新します。

これは、同様のタスクを処理する場合に役立つと思われるコード全体です。

<?php

/* require the necessary magento classes */

require_once 'app/Mage.php';
Mage::app('default'); // Default or your store view name.

/* construct a category tree object to traverse */

$category = Mage::getModel('catalog/category');
$tree = $category->getTreeModel();
$tree->load();

$ids = $tree->getCollection()->getAllIds();
$arr = array(); 

/* loop through each category id */

if ($ids){
    foreach ($ids as $id){
        getImageForCategory($id);
        updateCategoryThumbnail($id);
    }
}

function getImageForCategory($id){

        $images = array();

        $catId=$id; // put your category ID in here
        $products =  Mage::getModel('catalog/product')->getCollection()
        ->addAttributeToSelect('image')
        ->addCategoryFilter(Mage::getModel('catalog/category')->load($catId));

        Mage::getSingleton('catalog/product_status')->addSaleableFilterToCollection($products); // Only select products that are salable

        $products->load();


        foreach($products as $product){
            $images[] = $product->getImageUrl();

            /* remove the following break if you want to use a random image, otherwise the image of the first product will be used. Using random images will cause the execution time to increase dramatically.  */
            break;
        }


        if (sizeof($images) > 1) {
        $random_image = array_rand($images, 1);
        } else {
        $random_image = 0;
        }

        if($images[$random_image]){
            saveImageFromURL($images[$random_image],$id);       
        }

    }

function updateCategoryThumbnail($cat){

    $image = $cat . ".jpg";

    $catc = Mage::getModel('catalog/category')->load($cat);
    $catc->setImage($image); // /media/catalog/category
    $catc->save(); 
}

function saveImageFromURL($imgUrl,$cat){


    $fout = fopen('/var/www/vhosts/your-site-folder.com/httpdocs/media/catalog/category/' . $cat . '.jpg', 'w');
    $fin = fopen($imgUrl, "rb");
    while (!feof($fin)) {
        $buffer= fread($fin, 32*1024);
        fwrite($fout,$buffer);
    }
    fclose($fin);
    fclose($fout);
}

?>

saveImageFromURL() 関数で使用されるカテゴリ イメージ フォルダに十分な書き込み権限があることを確認してください。

上記のように、getImageForCategory() から「break」ステートメントを削除すると、カテゴリー製品がランダムに選択されます。これにより、スクリプトの実行時間が大幅に増加することに注意してください。

于 2013-04-24T14:33:40.823 に答える