7

Magentoから最も売れている製品を選択するための次のコードがあります。

$productCollection = Mage::getResourceModel('reports/product_collection')
            ->addOrderedQty($startTime, $currentTime)
            ->addAttributeToSelect('*')
            ->setStoreId($storeId)
            ->addStoreFilter($storeId)
            ->setOrder('ordered_qty', 'desc')
            ->setPageSize($this->limit());
    }

バックエンドで「フラットカタログ製品を使用する」を「はい」に設定するまでは、正常に機能します。フラットテーブルを使用せず、代わりにEAVを使用するようにmagentoに指示する方法はありますか?
誰かがこれで私を助けることができますか?

4

6 に答える 6

9

元の製品クラスを拡張する新しいモデルクラスを作成します('mycatalog/product')が、EAVリソースモデルとEAVリソースコレクションを使用するようにハードコーディングしてから、クエリコードでそのモデルを使用します。

于 2011-05-27T20:41:07.607 に答える
4

スタンドアロンのphpファイルからコードを実行していましたが、コードを管理モジュールに移動するとすぐに、flat_fileの使用が停止し、eavに戻りました。

ご覧の場合:Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Collection

方法があります:

public function isEnabledFlat()
{
    if (Mage::app()->getStore()->isAdmin()) {
        return false;
    }
    if (!isset($this->_flatEnabled[$this->getStoreId()])) {
        $this->_flatEnabled[$this->getStoreId()] = $this->getFlatHelper()
            ->isEnabled($this->getStoreId());
    }
    return $this->_flatEnabled[$this->getStoreId()];
}

これを変更して、独自の基準に基づいてfalseを返す条件を追加することができます。

ところで、Blazoによる最初の投稿で言及されたレポートコレクションは、このコレクションの拡張です。

于 2011-05-30T10:35:42.957 に答える
2

アランの答えを拡張するには:

class Namespace_Module_Model_Category extends Mage_Catalog_Model_Category
{
    protected function _construct()
    {
        $this->_init('catalog/category');

    }

}

上記は、フラットが有効になっているかどうかを確認するためのチェックを削除し、カタログ/カテゴリリソースの標準のバージョンのみを初期化します。

そして、モデルをロードしたい場合は、フラットデータが有効になっているかどうかに関係なく、eavモデルを確実に取得します。

$category = Mage::getModel('namespace_module/category')->load($id)
于 2013-12-13T22:51:10.290 に答える
2

私は使用しています

Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);

Mage::getModel('catalog/product')->getCollection()

そして、eavベースのシステムからデータのフェッチを開始します。

于 2016-08-14T10:31:26.690 に答える
1

これは古い投稿ですが、重要な点が1つ述べられていないと思いました。1.フラットカタログをオンに設定したら、cronまたはadmin / shellを介してインデクサーを実行し、フラットカタログテーブルにデータが入力されるようにする必要があります。

  1. フラットカタログテーブルをバイパスして検索に多くの製品がある場合、サイトの速度が低下し、各検索コードが多くのリソースを消費します。
于 2013-03-18T04:08:37.633 に答える
-2

最も簡単な解決策は、フラットテーブルをオフにしてから、-> load(true)パラメーターを使用してmagentoが実行するSQLクエリを取得することであることがわかりました。

例えば

$collection = Mage::getModel('catalog/category')->getCollection();
$collection
    ->setStoreId($store->getId())
    ->addAttributeToSelect('*')
    ->addAttributeToFilter(array(array('attribute'=>'ig_unifeed_ids', 'like'=>"%:".$this->getId().":%")))
    ->load(true);

次に、フラットテーブルをオンに戻し、このコードを次のように置き換えます。

$resource = Mage::getSingleton('core/resource');
$readConnection = $resource->getConnection('core_read');
$query = "SELECT `e`.*, `at_ig_unifeed_ids`.`value` AS `ig_unifeed_ids` FROM `catalog_category_entity` AS `e` INNER JOIN `catalog_category_entity_varchar` AS `at_ig_unifeed_ids` ON (`at_ig_unifeed_ids`.`entity_id` = `e`.`entity_id`) AND (`at_ig_unifeed_ids`.`attribute_id` = '139') AND (`at_ig_unifeed_ids`.`store_id` = 0) WHERE (`e`.`entity_type_id` = '3') AND ((at_ig_unifeed_ids.value LIKE '%:".$this->getId().":%'))";
$collection = $readConnection->fetchAll($query);

この時点から、おそらく置換などの他のコードを変更する必要があります

$ category-> getId()

$ category ["entity_id"]

これが少し役立つことを願っています...

注:これは、フラットテーブルを使用するときにカテゴリフィルタリングを無視するIG_UnifeedモジュールのMagentoバグの実際の解決策です。

于 2015-06-22T09:51:01.557 に答える