1

基本的に階層化されたナビゲーション (私の場合は左側のフィルター) を使用して特定のカテゴリのすべての製品をリストするページを Magento で作成しようとしていますが、リストは 1 日に 1 回ランダムに生成する必要があります。

「product_list_random」を使用しようとしましたが、CategoryIDs の設定を無視しているようです。

さらに調査すると、Random.php が見つかりました。問題は、Random.php の保護された関数 _getProductCollection が完全な製品コレクションから開始するだけであるのに対し、List.php では、現在のカテゴリを取得するためのロジックがいくつかあることです。

今、私は List.php から Random.php にコードを適応させるために戦っていますが、成功していません...

これまでの私のコードは次のとおりです。

         $layer = $this->getLayer();
        /* @var $layer Mage_Catalog_Model_Layer */

        $origCategory = null;
        if ($this->getCategoryId()) {
            $category = Mage::getModel('catalog/category')->load($this->getCategoryId());
            if ($category->getId()) {
                $origCategory = $layer->getCurrentCategory();
                $layer->setCurrentCategory($category);
            }
        }
        //$this->_productCollection = $layer->getProductCollection();
        $this->_productCollection = $layer->getSelect()->order('rand()');

        $this->prepareSortableFieldsByCategory($layer->getCurrentCategory());

        if ($origCategory) {
            $layer->setCurrentCategory($origCategory);
        }        

現在、Magento のレイヤー モデルを「ランド」化することはできないようですが、ここで少し迷っています。これを終了する方法についてのアイデアはありますか? 私は非常に近いことを感じることができますが、何かが欠けています... :(

前もって感謝します!

更新 2

Ok。私は何が起こっているのか理解したと思います。「より最適化された/合理的な」方法でコードを書き直しましたが、それでもページングの問題が発生します。

レンダリング プロセスの一部を xdebugged したところ、Toolbar.phtml/php が PRIOR TO Random.php と呼ばれているようです。その理由は 2 つあります。(1) My Layout は実際にはツールバーを Random の子として示しているため、最初に呼び出す必要があります。(2) ツールバーは、ページングする要素の数を知る必要があるため、最初に呼び出す必要があります。

このため、コードで setCollection を呼び出すと、すべてのページング パラメータが既に存在するため、ページングが壊れます... :( それが私の理論です。

考えられる唯一の回避策は、コレクションの読み込み後にすべてのツールバー パラメータをリセットすることです。これは、(1) 不合理に思えます (もっと良い方法があるはずです!)、(2) それを引き出す方法がわかりません.. . :( :(

現在のコードは次のとおりです... いつものように、ポインタは大歓迎です!

protected function _getProductCollection()
{
    //xdebug_start_trace('/Library/WebServer/talcha/var/log/random-trace.txt');

    /* get ready to build collection */
    $collection=Mage::getResourceModel('catalog/product_collection');
    $genlayer=Mage::getModel('catalog/layer');
    $genlayer->prepareProductCollection($collection);
    $collection->addAttributeToFilter('status',1); //only enabled product
    $collection->addAttributeToFilter('visibility',4); //only 'catalog,search' products
    $collection->addStoreFilter();


    /* Find out where I am */
    $newrandom=false; // flag to check if random collection was generated
    $interna=false;
    $currentUrl = $this->helper('core/url')->getCurrentUrl();
    Mage::log("URL:".$currentUrl,null,"paulo.log");
    if (strpos($currentUrl,"chas")!==false) {  // estou em CHAS
       $interna=true;       
    }

    /* if I am where I need to be, then check whether I need to update the collection */
    if ($interna) {
        $now=time();

        /* fetch collection file name and generated time */
        if (strpos($currentUrl,"?")===false) {
            $name=substr($currentUrl,strpos($currentUrl,"index.php")+10);
        } else {
            $name=substr($currentUrl,strpos($currentUrl,"index.php")+10,strpos($currentUrl,"?")-strlen($currentUrl));
        }
        if ($name=="chas2") { $name="chas"; }
        Mage::log("Nome:".$name,null,"paulo.log");  
        $dir=Mage::getBaseDir('tmp');
        $dh=opendir($dir);
        while (($file=readdir($dh))!=false) {
            Mage::log("Arq.:".$file,null,"paulo.log");
            if (strpos($file,$name)!==false) {
                $epoch=substr($file,strpos($file,"-")+1);
                $fname=$file;
                Mage::log("Hora:".$epoch,null,"paulo.log");
                break;
            }
        }

        /* tests whether elapsed time between now and last update is longer that "x" seconds */
        /* if true, generates new random collection, serialize it and flag it */
        /* if false, just picks up last generated collection from file */
        if (($now-$epoch) > 3600) {  //set 1 hour
            $collection->addCategoryFilter(Mage::getModel('catalog/category')->load($this->get_cur_category()));
            $collection->getSelect()->order('rand()');
            file_put_contents($dir."/".$name."-".$now,serialize($collection));
            unlink($dir."/".$fname);
            $newrandom=true;
            Mage::log("Fiz shuffle!",null,"paulo.log");
            Mage::log("Count:".$collection->count(),null,"paulo.log");
        } else {
            $collection=unserialize(file_get_contents($dir."/".$fname));
        }
    } // close if($interna)     

    /* build the final collection.  If we are using the generated collection, we need
        to adjust pagination according to request parameters.
        If we are filtering, then we set proper filters and load the ordinary collection
        (no random stuff when filtering through) */
    if (is_null($this->_productCollection)) {

        $layer=$this->getLayer();   

        foreach($this->getRequest()->getParams() as $key=>$value) {
            Mage::log("Random:".$key."=>".$value,null,"paulo.log");

            switch ($key) {
              case "p":
                $collection->setPageSize($this->get_prod_count())->setCurPage($value);
                break;
              case "cat":
                $collection->addCategoryFilter(Mage::getModel('catalog/category')->load($value));
                break;
              case "price":
                list($range,$step)=explode(",",$value);
                $gt_value=($range-1)*$step;
                $lt_value=$range*$step;
                $collection->addAttributetoFilter($key,array('gt'=>$gt_value));
                $collection->addAttributetoFilter($key,array('lteq'=>$lt_value));
                break;
              case "limit":
                $collection->setPageSize($value)->setCurPage(1);
                break;
              case "page_id":
              case "dir":
              case "order":
              case "mode":
                break;
              default:
                $collection->addAttributeToFilter($key,$value); //filters
            }
        }   

        /* if we are filtering, then the collection wasn't loaded yet */
        if (!$interna) {
            $collection->load();    
        }

    }

    $this->setCollection($collection);
    $this->_productCollection=$collection;

    return $this->_productCollection;
}
4

1 に答える 1

0
<?php // get Random prdocut list

$_productCollection = Mage::getResourceModel('catalog/product_collection');
Mage::getModel('catalog/layer')->prepareProductCollection($_productCollection);
$_productCollection->getSelect()->order('rand()');
$_productCollection->addStoreFilter();
$numProducts = $this->getNumProducts() ? $this->getNumProducts() : 20;
$_productCollection->setPage(1, $numProducts);

if (sizeof($_productCollection) < $numProducts) {
        $numProducts = sizeof($_productCollection);
}
$displayed_products = array();
foreach ($_productCollection as $_product) {
        $displayed_products[] = $_product;
}
$random_products = array();
if (sizeof($_productCollection) > 1) {
        $random_products = array_rand($displayed_products, $numProducts);
} else {
        $random_products = array('0');
}

?>
于 2012-11-22T05:18:40.860 に答える