3

使うことができます:

Mage::getModel('cms/page')->getCollection()->addStoreFilter($store_id);

ストア ID でフィルター処理された CMS ページのコレクションを取得します。

しかし、他のストアにも割り当てられているものを削除するにはどうすればよいですか?

つまり、ストア ビューとして「すべてのストア ビュー」を持つアイテムを返したくありません。(または、その CMS ページに割り当てられたその他の追加のストア ID。) その 1 つのストアに固有のページのみを返す必要があります。

ストア管理者が CMS ページや他のストアに影響を与える可能性のある静的ブロックを表示または編集できないように、Aitoc パーミッション モジュールを拡張しています。これには、グリッドからのそれらのアイテムのフィルタリングが含まれます。

4

4 に答える 4

4
$collection = Mage::getModel('cms/page')->getCollection();
$collection->getSelect()
    ->join(
        array('cps' => $collection->getTable('cms/page_store')),
        'cps.page_id = main_table.page_id AND cps.store_id != 0',
        array('store_id')
    )
    ->columns(array('stores_count' => new Zend_Db_Expr('COUNT(cps.store_id)')))
    ->group('main_table.page_id')
    ->having('stores_count = ?', 1)
    ->having('cps.store_id = ?', $storeId)
;
于 2012-05-13T19:36:39.583 に答える
4

これを行うためのネイティブ コレクション メソッドはありません。

  1. cms_page_store特定のストアに固有のページのテーブルをクエリします

  2. 上記の結果をフィルターで使用する

以下を完全にはテストしていませんが、動作するはずです (動作しない場合は、独自のクエリで良いスタートを切ることができます)。

$page     = Mage::getModel('cms/page');
$resource = $page->getResource();
$read     = $resource->getReadConnection();

#$select   = $read->query('SELECT page_id FROM ' . $resource->getTable('cms/page_store') . ' GROUP BY store_id');

//set total count to look for.  1 means the page only appears once.
$total_stores_count_to_look_for = '1';

//get the table name.  Need to pass through getTable to ensure any prefix used is added
$table_name                     = $resource->getTable('cms/page_store');

//aggregate count select from the cmd_page_store database
//greater than 0 ensures the "all stores" pages aren't selected
$select = $read->query('SELECT page_id as total
FROM '.$table_name.' 
WHERE store_id > 0 
GROUP BY page_id
HAVING count(page_id) = ?',array($total_stores_count_to_look_for));

//fetch all the rows, which will be page ids
$ids   = $select->fetchAll(); 

//query for pages using IDs from above
$pages = Mage::getModel('cms/page')->getCollection()->addFieldToFilter('page_id',array('in'=>$ids));

foreach($pages as $page)
{
    var_dump($page->getData());
}

何千もの CMS ページがある場合は、cms/pageコレクションを変更selectして集計テーブル データに結合する価値があるかもしれません。この種の結合はややこしくなる可能性があるため、これは読者の演習として残しておきます。

于 2012-05-13T18:52:00.467 に答える
1

Alan と Vitaly によって提案されたソリューションのいくつかの要素を、私自身の厄介な理解と融合させて、次のコードで必要なことを達成しました。

状況を説明するために、ストア管理者が他のストアに影響を与える可能性のある CMS ページと静的ブロックを表示または編集できないように、Aitoc パーミッション モジュールを拡張していました。これには、グリッドからのそれらのアイテムのフィルタリングが含まれていました。

$collection = Mage::getModel('cms/page')->getCollection();
$collection->addStoreFilter(Mage::helper('aitpermissions')->getStoreIds());
$conn = Mage::getSingleton('core/resource')->getConnection('core_read');
$page_ids = array();
foreach($collection as $key=>$item) {
    $page_id = $item->getId();
    $results = $conn->fetchAll("SELECT * FROM cms_page_store 
                                WHERE page_id = ".$page_id.";");
    $count = 0;
    $arr_stores = array();
    foreach($results as $row) {
        $arr_stores[] = $row['store_id'];
        $count++;
    }

    //We dont want to show the item if any of the following are true:
       //The store id = 0 (Means its assigned to All Stores)
       //There is more than one store assigned to this CMS page         
    if( in_array('0',$arr_stores) || $count>1) {
            //This removes results from the grid (but oddly not the paging)
        $collection->removeItemByKey($key); 
    }
    else {
        //build an array which we will use to remove results from the paging
        $page_ids[] = $page_id; 
    }
}

//This removes results from paging (but not the grid)
$collection->addFieldToFilter('page_id',array('in'=>$page_ids)); 

ページングとグリッドからフィルター処理するために 2 つの異なる方法を使用する必要があった理由がわかりません。このサイトは magento 1.5 を使用しているため、それに関連する問題がある可能性があります。

いずれにせよ、この解決策は私にとってはうまくいきました。

于 2012-05-14T23:18:00.573 に答える