14

今日、私は再びMagentoと戦っています:)そして私は

$product = Mage::getModel('catalog/product')->loadByAttribute('sku', $product_sku);

$product = Mage::getModel('catalog/product')->load($product_id);

誰かが私にこれらの2つのアプローチの違いを説明できますか?skuで製品をロードしているときに、変更されたデータで製品を再保存しようとすると、エラー例外「Varien_Exception」とメッセージ「無効なメソッドVarien_Object :: save in app \ code \ core\Mage」が表示されることがわかりました。 \ CatalogInventory \ Model \ Observer.php(153):Varien_Object-> __ call('save'、Array)これは本当です。skuでロードしようとすると、別のオブザーバーが製品のストックアイテムをVarien_Objectとして設定します。これは、落とし穴のように見えます。十分に理解していませんが

私は最初から毎日Magentoの開発を行っているので、システムについて多くのことを知っています。これは私にとって新しいことです。よろしくお願いします、ヤロ。

4

2 に答える 2

17

面白い。どちらの方法でも、EAVデータが完全にロードされた単一の製品モデルインスタンスが取得されますが(の3番目のパラメーターがloadByAttribute()渡されていないか、渡されている場合*)、在庫関連データを追加するオブザーバーは、製品と製品コレクションで異なりますが、両方の在庫情報オブジェクトが製品データキー「stock_item」に追加されます。議論の余地はありますが、これはバグのように感じます。私はそれを考えるか、Mage_CatalogInventory_Model_Observer::saveInventoryData()これMage_CatalogInventory_Model_Observer::_prepareItemForSave()を処理します。

この問題は、stock_itemオブジェクトを使用して商品インスタンスに商品在庫アイテムを完全に設定することで解決できます。

于 2012-06-07T15:01:38.297 に答える
1

loadByAttributeそれは実際にはトリガーされないので、私の意見では深刻な誤称load()です。むしろそれは使用しますgetResourceCollection()

public function loadByAttribute($attribute, $value, $additionalAttributes = '*')
{
    $collection = $this->getResourceCollection()
        ->addAttributeToSelect($additionalAttributes)
        ->addAttributeToFilter($attribute, $value)
        ->setPage(1,1);

関連付けられたオブザーバーイベントをトリガーしないためload()、結果の製品オブジェクトには、必要な製品データの完全なセットが含まれていません。私の場合、「description」属性が必要でしたが、含まれていませんでした。

これを解決するには、いくつかの方法があります。

  • 別の方法を使用してSKUでロードします。

      $product = Mage::getModel("catalog/product");
      $product->load($product->getIdBySku("whatever"));
    
  • アクセスしてインデックスを再作成することにより、目的の属性データをデフォルトの製品リソースデータに含めるように強制しますMagento Admin > Catalog > Attributes > Edit attribute > "Used in Product Listing" = "Yes"。これで、を使用して(少なくともフロントエンドで)属性データを使用できるようになりますloadByAttribute()

https://magento.stackexchange.com/a/197286/18855も参照してください

于 2020-07-24T23:25:27.120 に答える