база данных magento multiselect insert - PullRequest
2 голосов
/ 04 октября 2011

Я хочу создать раскрывающийся список атрибутов множественного выбора в разделе администратора magento, чтобы я мог вставить значения атрибутов в последовательном порядке в базу данных.

Обратите внимание, что таблица, в которую я хочу вставить значения, является пользовательской, то есть я создал собственную таблицу в базе данных. Я видел код для нескольких магазинов, как показано ниже:

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

но я не могу использовать такой формат, так как моя таблица базы данных является пользовательской. Пожалуйста, дайте мне знать альтернативный код, с помощью которого я могу вставить значения атрибута multi select в базу данных. спасибо

Ответы [ 3 ]

6 голосов
/ 04 октября 2011

Поскольку у Magento есть свой собственный способ хранения идентификаторов магазина в БД, я бы предложил следовать этим стандартам.Использование сериализованных значений не очень хорошая идея ...

YM = Ваш модуль YM_store - это новая таблица, которую мы создадим позже.YM_entity_id - это идентификатор любой сущности, которую вы хотите использовать здесь.(Например, в Core / cms / block "YM_entity_id" равен "block_id".)

Пожалуйста, убедитесь, что везде используется одинаковая заглавная буква.

1)

Выпотребуется создать новую таблицу для хранения карты entity_id <> store_id.

В вашем файле mysql4-upgrade-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 / Block / Adminhtml / YM / Edit / 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 / controllers / Adminhtml /) должен иметь функцию saveAction со следующей строкой:

$model->setData($data);

Это общая функция сохранения, которая обязательно отправит вседанные из формы в функцию сохранения.(Включая значения вновь созданного раскрывающегося списка)

5)

Следующим шагом является добавление функции addStoreFilter в Collection.php (YM / Model / 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)

Давайте также добавим Store в сетку.В функции _prepareColumns () (YM / Block / 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);
  } 

Обратите внимание, что этот код будет перечислять только "Все представления магазина" в Grid как что-то отсутствующее, и я не мог понять, что именно.Может быть, кто-то еще даст нам ответ ...:)

7)

Последний шаг - добавить некоторые функции в YM.php, чтобы он мог сохранять и загружать store_ids(YM / Model / Mysql4 / YM.php) Следующие функции скопированы из cms / блоков.

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

AfterLoad

/**
 *
 * @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 / блоков.Также, как указано выше, Grid не загружает правильное значение, но я не знаю почему.Кто-нибудь может сказать нам?:)

Удачи, Гергели

2 голосов
/ 21 января 2012

Чтобы вывести список выбранных представлений магазина в столбце сетки, добавьте следующий фрагмент кода в grid.php в свой пользовательский модуль рядом с функцией _filterStoreCondition ()

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

Спасибо, Sreedevi

0 голосов
/ 04 октября 2011

Лучший пример - это модуль CMS.Вы можете исследовать, например, сохранение страницы CMS.Основной стол - cms_page, а дополнительный стол - cms_page_store.Вам нужно изменить коллекцию вашей сущности.Взгляните на класс Mage_Cms_Model_Mysql4_Page, особенно методы _afterSave и _afterLoad.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...