製品のURLと画像を取得する効率的な方法


12

Magentoウェブショップへの追加を構築しているときに、いくつかの問題に出会いました。可能な限り高速なコードを作成するために、2つのことを理解できないことがわかりました。

私の(関連する)コードは次のとおりです。

$rc = Mage::getResourceSingleton('catalog/product');
$productName = $rc->getAttributeRawValue($productId, 'name', Mage::app()->getStore());
$productPrice = $rc->getAttributeRawValue($productId, 'price', Mage::app()->getStore());
$productImage = $rc->getAttributeRawValue($productId, 'image', Mage::app()->getStore());
$productUrl = $rc->getAttributeRawValue($productId, 'url_key', Mage::app()->getStore());

私が理解できない2つのことは:

1)製品URLを取得するにはどうすればよいですか?url_keyすべてのウェブショップが正規のURLを使用したり、URLにカテゴリを持っているわけではないため、常に正しいURLを提供するとは限りません。

2)画像全体ではなく、幅/高さを設定した製品画像を取得するにはどうすればよいですか?->resize()(それはURLを返すので)関数は、この場合のI偵察では機能しません。それに追加しました、それは得ることが可能であるBase ImageSmall ImageThumbnail別に?

私の主な目標は、コードを可能な限り高速に保つことです。製品の子をループ処理するため、製品IDのみがあります。->load()読み込みに時間がかかるため、使用したくありません。

回答:


7

次のようにできます:

$smallImage = $rc->getAttributeRawValue($productId, 'small_image', Mage::app()->getStore());
$imageModel = Mage::getModel('catalog/product_image');
$imageModel->setDestinationSubdir('small_image');
$imageModel->setBaseFile($smallImage);
var_dump($imageModel->getUrl());

同様に、「画像」と「サムネイル」に対しても行うことができます。


これは通常の画像では機能するようですが、に間違ったフォルダを選択しますsmall_image。小さな画像はすべてサイズ変更され、サイズ変更されたバリアントは選択されないようです。それを解決する方法はありますか?また、製品URLのソリューションもありますか?
サンダーKoedood 14年

@SanderKoedoodサイズ変更のために、$ imageModel-> setWidth(150)-> setHeight(150)-> resize()-> getUrl();を追加します。
mpaepper 14年

150の代わりに、もちろん必要な値を使用してください;)
mpaepper 14年

私の知識はそこまで広がっています;-)しかし、指摘してくれてありがとう。ただし、サイトが間違ったフォルダーをロードするという問題は変わりません。そのため、小さな画像を使用すると画像は表示されません。
サンダーKoedood 14年

5
$productId = 'SOME_PRODUCT_ID';
$product = Mage::getModel('catalog/product')->load($productId);
$productMediaConfig = Mage::getModel('catalog/product_media_config');

$baseImageUrl = $productMediaConfig->getMediaUrl($product->getImage());
$smallImageUrl = $productMediaConfig->getMediaUrl($product->getSmallImage());
$thumbnailUrl = $productMediaConfig->getMediaUrl($product->getThumbnail());

上記のコードを実行すると、ブラウザーは空白のページを返します。私のコード:justpaste.it/7hwc9
宝石

3

以下のコードを試して、画像のURLを取得してください。

<?php echo Mage::helper('catalog/image')->init($product, 'thumbnail'); ?>
<?php echo Mage::helper('catalog/image')->init($_product, 'small_image') ?>

または

$productId = 1; // get product ID dynamically instead of 1.
$products = Mage::getModel('catalog/product')->load($productId);
$productUrl = $products->getProductUrl();
$baseImage = $products->getImage(); 
$SmallImage = $products->getSmallImage(); 
$thumbnail = $products->getThumbnail(); 

または

To get product URL:
$_products->getProductUrl();

2

$ products / $ product変数なしではできません:

製品のURLの場合:

$product->getUrlPath();
'mondrian-large-coffee-table-set-multicolour'

$product->getUrlPath($category);
'tables/mondrian-large-coffee-table-set-multicolour'

// _store_to_urlをfalseに設定しても、URLに___storeを追加するこのメソッドを停止することはできません

$product->getUrlInStore();
'http://made.local/tables/mondrian-large-coffee-table-set-multicolour?___store=default'

** // _store_to_urlをfalseに設定しても、URLに___storeを追加するこのメソッドを停止することはできません。

$product->getUrlInStore(array('_ignore_category' => true));
'http://made.local/mondrian-large-coffee-table-set-multicolour?___store=default'

$product->getProductUrl();
'http://made.local/tables/mondrian-large-coffee-table-set-multicolour'

$product->getProductUrl(true);
'http://made.local/tables/mondrian-large-coffee-table-set-multicolour'

製品イメージの場合:

$productId = 1; 
$products = Mage::getModel('catalog/product')->load($productId);
$products->getImage(); $products->getSmallImage(); 
$products->getThumbnail(); 

画像のURLをタグで使用する場合は、

Mage::helper('catalog/image')->init($products, 'small_image')->resize(163,100); // resize function is used to resize image 
Mage::helper('catalog/image')->init($products, 'image')->resize(400,400); 
Mage::helper('catalog/image')->init($products, 'thumbnail')->resize(60,60); 

を取得することで、$product->getUrlPath();すでに結果が得られていurl_keyます。そのため、$product変数がなくても可能です。そのため、製品全体をロードせずに、製品イメージを取得してサイズを変更することも可能であるはずです。(だから使用しないMage::getModel('catalog/product')->load($productId);
サンダーKoedood 14年

2

mpaepperのコメントに1行のコードを追加したいのですが、これは特定のシナリオでは素晴らしいソリューションだと思います。製品モデルを介して画像を読み込むための製品オブジェクトを持たないページのループで使用しました。

製品オブジェクトに画像をロードしたくない場合は、アプローチmpaepper exlpainsを使用できます。このソリューションを使用するときは、手動で作成した画像を保存することを忘れないでください。画像オブジェクトを保存すると、Magentoの通常の画像と同様にキャッシュファイルが作成されます。

したがって、完全なコードは次のようになります。

$rc = Mage::getResourceModel('catalog/product'); //empty product model which you only have to load it once. (for the people who want to use this in a loop, put this Resource Model outside the loop.

$smallImage = $rc->getAttributeRawValue($productId, 'small_image', Mage::app()->getStore());
$imageModel = Mage::getModel('catalog/product_image');
$imageModel->setDestinationSubdir('small_image');
$imageModel->setBaseFile($smallImage);
$imageModel->saveFile(); //important line to create an cache file of the image
var_dump($imageModel->getUrl());

1

製品の画像には、次の方法でアクセスできます。

$this->helper('catalog/image')->init($_products, 'small_image');

画像のサイズを変更するには、これを追加できます:

$this->helper('catalog/image')->init($_products, 'small_image')->resize(150,150);

製品のURLを取得するには:

$_products->getProductUrl();

ここで、$ _ productsは製品自体ではなく、製品IDです。


2
$_products変数にアクセスすることはできません。製品全体をロードする必要があるためです。そして、ループしているすべての製品をロードするには、ロード時間が数秒になりますが、これは多すぎます。
サンダーKoedood 14年

製品をロードせずに製品データを取得したくないのはなぜですか?attributeToSelect関数を追加して、すべての属性をロードするのではなく、必要な属性のみを選択できます。
ロジャンシュレスタ14年

1
製品のURLと画像を取得する方法を教えてください。コレクションを取得しないことの主な目的は、これが遅すぎるという前提でした。
サンダーKoedood 14年

私は通常、製品をロードしますが、決して遅くなることはありません。$ _products = Mage :: getModel( 'catalog / product')-> loadByAttribute( 'sku'、 'productsku');
ロジャンシュレスタ14年

その後、上記の私の答えに従ってください
ロジャンシュレスタ14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.