由於Magento有自己的方式來存儲數據庫中的存儲ID,我會建議遵循這些標準。使用序列化值不是一個好主意...
YM =您的模塊 YM_store是我們稍後將創建的新表。 YM_entity_id是您要在此使用的任何實體的ID。 (例如在Core/cms/block中,「YM_entity_id」是「block_id」。)
請確保在任何地方都使用相同的大寫。
1)
您將需要創建一個新的表來存儲ENTITY_ID <> STORE_ID地圖。
在你mysql4升級-XXX-nnnphp文件(YM/SQL/YM_setup /)添加以下代碼來創建一個新表:
<?php
$installer = $this;
$installer->startSetup();
$installer->run("
CREATE TABLE {$this->getTable('YM_store')} (
`YM_entity_id` smallint(6) NOT NULL default '0',
`store_id` smallint(5) NOT NULL default '0',
PRIMARY KEY (`YM_entity_id`,`store_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
");
$installer->endSetup();
2)
下一步是此表添加到模塊配置: 以下行添加到config.xml(YM的/ etc/config.xml中)
查找和最後一個表實體後補充一點:
<YM_store>
<table>YM_store</table>
</YM_store>
確保將config.xml中的版本號更改爲與您的mysql升級文件相同。
3)
下一步是下拉形式元素添加到你的form.php的 (YM /砌塊/ Adminhtml/YM /編輯/ form.php的)
/**
* Check is single store mode
*/
if (!Mage::app()->isSingleStoreMode()) {
$fieldset->addField('store_id', 'multiselect', array(
'name' => 'stores[]',
'label' => Mage::helper('cms')->__('Store View'),
'title' => Mage::helper('cms')->__('Store View'),
'required' => true,
'values' => Mage::getSingleton('adminhtml/system_store')->getStoreValuesForForm(false, true),
));
}
else {
$fieldset->addField('store_id', 'hidden', array(
'name' => 'stores[]',
'value' => Mage::app()->getStore(true)->getId()
));
$model->setStoreId(Mage::app()->getStore(true)->getId());
}
4)
下一步是讓控制器知道新表: 在你的YMController中。PHP文件(YM /控制器/ Adminhtml /)你應該有哪些中有以下行saveAction功能:
$model->setData($data);
這是一個通用的保存功能,這將確保從表單發送的所有數據保存功能。 (包括新創建的下拉的值))
下一步是將addStoreFilter函數添加到 的碼,該位被從複製的Collection.php(YM /型號/ Mysql4/YM) cms/block Collection.php。您將需要更改表字段名稱。 (YM_entity_id)
/**
* Add Filter by store
*
* @param int|Mage_Core_Model_Store $store
* @return Mage_Cms_Model_Mysql4_Page_Collection
*/
public function addStoreFilter($store, $withAdmin = true)
{
if ($store instanceof Mage_Core_Model_Store) {
$store = array($store->getId());
}
$this->getSelect()->join(
array('store_table' => $this->getTable('YM/YM_store')),
'main_table.YM_entity_id = store_table.YM_entity_id',
array()
)
->where('store_table.store_id in (?)', ($withAdmin ? array(0, $store) : $store))
->group('main_table.YM_entity_id');
return $this;
}
6)
讓我們的商店添加到網格中爲好。 在_prepareColumns()函數(YM /座/ Adminhtml/YM/Grid.php)你想要的商店出現在列後添加以下行:
if (!Mage::app()->isSingleStoreMode()) {
$this->addColumn('store_id', array(
'header' => Mage::helper('cms')->__('Store View'),
'index' => 'store_id',
'type' => 'store',
'store_all' => true,
'store_view' => true,
'sortable' => false,
'filter_condition_callback'
=> array($this, '_filterStoreCondition'),
));
}
這個功能添加到該文件的末尾在結束「}」之前。
protected function _filterStoreCondition($collection, $column)
{
if (!$value = $column->getFilter()->getValue()) {
return;
}
$this->getCollection()->addStoreFilter($value);
}
請注意,此代碼將只列出「網格中的所有商店視圖」作爲缺少的東西,我無法弄清楚什麼。也許別人會給我們答案... :)
7)
最後一步是將某些功能添加到YM.php所以這將是能夠保存和加載store_ids(YM /型號/Mysql4/YM.php)以下函數從cms/blocks複製。
BeforeSave:
/**
*
*
* @param Mage_Core_Model_Abstract $object
*/
protected function _beforeSave(Mage_Core_Model_Abstract $object)
{
if (! $object->getId()) {
$object->setCreationTime(Mage::getSingleton('core/date')->gmtDate());
}
$object->setUpdateTime(Mage::getSingleton('core/date')->gmtDate());
return $this;
}
AfterSave
/**
*
* @param Mage_Core_Model_Abstract $object
*/
protected function _afterSave(Mage_Core_Model_Abstract $object)
{
$condition = $this->_getWriteAdapter()->quoteInto('YM_entity_id = ?', $object->getId());
$this->_getWriteAdapter()->delete($this->getTable('YM/YM_store'), $condition);
foreach ((array)$object->getData('stores') as $store) {
$storeArray = array();
$storeArray['YM_entity_id'] = $object->getId();
$storeArray['store_id'] = $store;
$this->_getWriteAdapter()->insert($this->getTable('YM/YM_store'), $storeArray);
}
return parent::_afterSave($object);
}
負載。你可能沒有標識符,所以我認爲你不需要if語句。
public function load(Mage_Core_Model_Abstract $object, $value, $field=null)
{
if (!intval($value) && is_string($value)) {
$field = 'identifier'; // You probably don't have an identifier...
}
return parent::load($object, $value, $field);
}
後負荷
/**
*
* @param Mage_Core_Model_Abstract $object
*/
protected function _afterLoad(Mage_Core_Model_Abstract $object)
{
$select = $this->_getReadAdapter()->select()
->from($this->getTable('YM/YM_store'))
->where('YM_entity_id = ?', $object->getId());
if ($data = $this->_getReadAdapter()->fetchAll($select)) {
$storesArray = array();
foreach ($data as $row) {
$storesArray[] = $row['store_id'];
}
$object->setData('store_id', $storesArray);
}
return parent::_afterLoad($object);
}
getLoadSelect
/**
* Retrieve select object for load object data
*
* @param string $field
* @param mixed $value
* @return Zend_Db_Select
*/
protected function _getLoadSelect($field, $value, $object)
{
$select = parent::_getLoadSelect($field, $value, $object);
if ($object->getStoreId()) {
$select->join(array('cbs' => $this->getTable('YM/YM_store')), $this->getMainTable().'.YM_entity_id = cbs.YM_entity_id')
->where('is_active=1 AND cbs.store_id in (0, ?) ', $object->getStoreId())
->order('store_id DESC')
->limit(1);
}
return $select;
}
lookupStoreIds
/**
* Get store ids to which specified item is assigned
*
* @param int $id
* @return array
*/
public function lookupStoreIds($id)
{
return $this->_getReadAdapter()->fetchCol($this->_getReadAdapter()->select()
->from($this->getTable('YM/YM_store'), 'store_id')
->where("{$this->getIdFieldName()} = ?", $id)
);
}
好吧,如果我沒有留下任何東西出來這應該工作。 :) 登錄到管理區域,進入系統>高級。這應該運行mysql升級,如果你設置正確的版本。你可以檢查你是否有一個新的表格數據庫。
轉到您的實體並檢查是否有新的商店選擇下拉菜單。 嘗試保存新的值... :)
讓我知道如果它不起作用。我可能在代碼中犯了一些錯誤。如前所述,我從cms/blocks複製了大部分內容。也如上所述,網格不加載正確的值,但我不知道爲什麼。任何人都能告訴我們? :)
祝你好運,蓋爾蓋伊