3

我可以用:

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

检索按商店 ID 过滤的 CMS 页面集合。

但是我如何让它删除那些也分配给其他商店的呢?

即:我不希望它返回具有“所有商店视图”作为商店视图的项目。(或分配给该 CMS 页面的任何其他附加商店 ID。)它必须只返回该商店唯一的页面。

我正在扩展 Aitoc 权限模块,以便商店管理员无法查看或编辑可能影响其他商店的 CMS 页面和静态块。这涉及从网格中过滤这些项目。

4

4 回答 4

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 回答
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 回答
1

将 Alan 和 Vitaly 提出的解决方案的一些元素与我自己的繁琐理解融合在一起,我通过以下代码实现了我所需要的。

具体来说,我正在扩展 Aitoc 权限模块,以便商店管理员无法查看或编辑可能影响其他商店的 CMS 页面和静态块。这涉及从网格中过滤这些项目。

$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)); 

我不确定为什么需要使用两种不同的方法从分页和网格中过滤。该站点使用magento 1.5,因此可能存在与此相关的问题。

无论哪种方式,这个解决方案都对我有用。

于 2012-05-14T23:18:00.573 回答
0

我通过加入将字段 store_id 添加到页面集合的解决方案,并使用集合方法 addFieldToFilter()。

$pages = Mage::getModel('cms/page')->getCollection();

$pages->getSelect()->joinInner(
     array('cms_page_store' => 'cms_page_store'),
     'main_table.page_id = cms_page_store.page_id',
     array()
);

$pages->addFieldToFilter('store_id', ['in' => [1, 2]]);
于 2017-03-24T12:58:33.543 回答