2011-10-04 111 views
2

我想在magento的管理員部分創建一個多選屬性下拉列表,以便我可以以序列化的方式將屬性值插入到數據庫中。magento multiselect插入數據庫

請注意,我想要插入值的表是一個自定義的表,即我已經通過自己的數據庫表創建。 我已經看到了多店作爲下面的代碼:

 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), 
     )); 
    } 

,但我不能夠使用這種格式,我的數據庫表是自定義的。 請讓我知道替代代碼,我可以通過它將多選屬性的值插入到數據庫中。 謝謝

回答

0

最好的例子 - 是CMS模塊。您可以調查,例如,保存CMS頁面。 主表爲cms_page,附加表爲cms_page_store。 您需要修改實體的集合。 請看Mage_Cms_Model_Mysql4_Page班,尤其是_afterSave_afterLoad方法。

6

由於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複製了大部分內容。也如上所述,網格不加載正確的值,但我不知道爲什麼。任何人都能告訴我們? :)

祝你好運,蓋爾蓋伊

2

要列出表格列選定商店附近的意見添加下面的代碼在grid.php您的自定義模塊中_filterStoreCondition()函數

protected function _afterLoadCollection() { $this->getCollection()->walk('afterLoad'); parent::_afterLoadCollection(); }

謝謝, Sreedevi