3

Observer フォルダーにパブリック関数があります。(私はこれを使って画像を閲覧しています)しかし、問題は、「Mage::app()->setCurrentStore()」を使いたくないということです

setCurrentStore() を使用せずに指定されたストアをブラウズする代替手段は何ですか?

function getImages($store, $v){
    Mage::app()->setCurrentStore($store);
    $products = Mage::getModel('catalog/product')->getCollection();
    $products->addAttributeToSelect('name');
    foreach($products as $product) {
        $images = Mage::getModel('catalog/product')->load($product->getId())->getMediaGalleryImages();
        if($images){    
           $i2=0; foreach($images as $image){ $i2++;
              $curr = Mage::helper('catalog/image')->init($product, 'image', $image->getFile())->resize(265).'<br>';
           }
        }
    }
}

foreach (Mage::app()->getWebsites() as $website) {
    foreach ($website->getGroups() as $group) {
        $stores = $group->getStores();
        foreach ($stores as $store) {
            getImages($store, $i);
            $i++;
        }
    }
}

PS: setCurrentStore() を使用すると、管理者が失敗します:-S

4

2 に答える 2

11

これは、関数を終了するときにストアをデフォルトに戻さないために発生すると思います。しかし、より良い解決策は、エミュレーション環境を使用することです:

function getImages($store, $v){
    $appEmulation = Mage::getSingleton('core/app_emulation');
    $initialEnvironmentInfo = $appEmulation->startEnvironmentEmulation($storeId); 
    //if $store is a model you can use $store->getId() to replace $storeId
    try {
        //your function code here
    catch(Exception $e){
        // handle exception code here
    }
    $appEmulation->stopEnvironmentEmulation($initialEnvironmentInfo);
}

環境エミュレーション間のすべてのコードは、magento が目的のストアを設定したように機能し、外部のすべてが正常に動作するはずです。

また、コードが例外をスローする可能性があるため、環境エミュレーションを停止する関数の最後の行が毎回実行されるようにするために、try catch ステートメントを使用する必要があることに注意してください。

于 2013-02-24T19:38:52.223 に答える
6

これにはエミュレーションを使用できます。http://inchoo.net/ecommerce/magento/emulate-store-in-magento/から:

$appEmulation = Mage::getSingleton('core/app_emulation');
//Start environment emulation of the specified store
$initialEnvironmentInfo = $appEmulation->startEnvironmentEmulation($storeId);
/*
 * Any code thrown here will be executed as we are currently running that store
 * with applied locale, design and similar
 */
//Stop environment emulation and restore original store
$appEmulation->stopEnvironmentEmulation($initialEnvironmentInfo);

load()コレクションの繰り返しを呼び出すときは、リソースを大量に消費する決定を下していることを指摘したいと思います。カタログのサイズと実行中のコンテキストを考えると問題ないかもしれませんが、$products->addAttributeToSelect('*'). ただし、これはすべての属性と値を取得します。現在のケースを考えると、次のように必要なものを取得できます。

$products = Mage::getModel('catalog/product')->getCollection();
$products->addAttributeToSelect('name')
         ->addAttributeToSelect('media_gallery');
foreach($products as $product) {
    $images = $product->getMediaGalleryImages();
    if($images){
        // your logic/needs
    }
}
于 2013-02-24T19:36:00.480 に答える