Может ли кто-нибудь указать мне в правильном направлении, как сохранить редактируемые столбцы в сетке Magento?
У меня есть столбец с именем «sort_order», который имеет «editable» => true, он добавляет поле для редактирования, но как мне его сохранить в строке?
Спасибо заранее за вашу помощь.
вот мой код grid.php,
class ***_Imagegallery_Block_Manage_Imagegallery_Grid extends Mage_Adminhtml_Block_Widget_Grid { public function __construct() { parent::__construct(); $this->setId('imagegalleryGrid'); $this->setDefaultSort('sort_order'); $this->setDefaultDir('ASC'); $this->setSaveParametersInSession(true); } protected function _getStore() { $storeId = (int) $this->getRequest()->getParam('store', 0); return Mage::app()->getStore($storeId); } protected function _prepareCollection() { $collection = Mage::getModel('imagegallery/imagegallery')->getCollection(); $store = $this->_getStore(); if ($store->getId()) { $collection->addStoreFilter($store); } $filter = $this->getParam('filter'); $filter_data = Mage::helper('adminhtml')->prepareFilterString($filter); if(!isset($filter_data['status'])) { $collection->addFieldToFilter('status', array('eq' => 1)); } $this->setCollection($collection); return parent::_prepareCollection(); } protected function _prepareColumns() { $this->addColumn('sort_order', array( 'header' => Mage::helper('imagegallery')->__('Sort'), 'align' =>'right', 'width' => '50px', 'index' => 'sort_order', 'type' => 'number', 'width' => '1', 'sortable' => true, 'editable' => true )); $this->addColumn('post_id', array( 'header' => Mage::helper('imagegallery')->__('ID'), 'align' =>'right', 'width' => '50px', 'index' => 'post_id', )); $this->addColumn('nfile', array( 'header' => Mage::helper('cms')->__('Image File'), 'align' => 'left', 'index' => 'nfile', 'type' => 'image', 'width' => '100', )); $this->addColumn('title', array( 'header' => Mage::helper('imagegallery')->__('Title'), 'align' =>'left', 'index' => 'title', )); /*$this->addColumn('identifier', array( 'header' => Mage::helper('imagegallery')->__('Identifier'), 'align' => 'left', 'index' => 'identifier', )); $this->addColumn('user', array( 'header' => Mage::helper('imagegallery')->__('Poster'), 'width' => '150px', 'index' => 'user', ));*/ $this->addColumn('created_time', array( 'header' => Mage::helper('imagegallery')->__('Created'), 'align' => 'left', 'width' => '120px', 'type' => 'date', 'default' => '--', 'index' => 'created_time', )); $this->addColumn('update_time', array( 'header' => Mage::helper('imagegallery')->__('Updated'), 'align' => 'left', 'width' => '120px', 'type' => 'date', 'default' => '--', 'index' => 'update_time', )); $this->addColumn('status', array( 'header' => Mage::helper('imagegallery')->__('Status'), 'align' => 'left', 'width' => '80px', 'index' => 'status', 'type' => 'options', 'options' => array( 1 => Mage::helper('imagegallery')->__('Enabled'), 2 => Mage::helper('imagegallery')->__('Disabled'), 3 => Mage::helper('imagegallery')->__('Hidden'), ), )); $this->addColumn('action', array( 'header' => Mage::helper('imagegallery')->__('Action'), 'width' => '100', 'type' => 'action', 'getter' => 'getId', 'actions' => array( array( 'caption' => Mage::helper('imagegallery')->__('Edit'), 'url' => array('base'=> '*/*/edit'), 'field' => 'id' ) ), 'filter' => false, 'sortable' => false, 'index' => 'stores', 'is_system' => true, )); return parent::_prepareColumns(); } protected function _prepareMassaction() { $this->setMassactionIdField('post_id'); $this->getMassactionBlock()->setFormFieldName('imagegallery'); $this->getMassactionBlock()->addItem('delete', array( 'label' => Mage::helper('imagegallery')->__('Delete'), 'url' => $this->getUrl('*/*/massDelete'), 'confirm' => Mage::helper('imagegallery')->__('Are you sure?') )); $statuses = Mage::getSingleton('imagegallery/status')->getOptionArray(); array_unshift($statuses, array('label'=>'', 'value'=>'')); $this->getMassactionBlock()->addItem('status', array( 'label'=> Mage::helper('imagegallery')->__('Change status'), 'url' => $this->getUrl('*/*/massStatus', array('_current'=>true)), 'additional' => array( 'visibility' => array( 'name' => 'status', 'type' => 'select', 'class' => 'required-entry', 'label' => Mage::helper('imagegallery')->__('Status'), 'values' => $statuses ) ) )); return $this; } public function getRowUrl($row) { return $this->getUrl('*/*/edit', array('id' => $row->getId())); } }
Это на самом деле довольно сложно; в идеале ваша сетка должна быть частью Контейнера, который создает экземпляр формы и вызывается через раздел Tab. Кнопки сохранения обычно являются частью пользовательского шаблона phtml, который вызывается вместе с блоком макета, который вызывается посредством действия контроллера в вашем Adminhtml.
Этот form.phtml может быть очень простым, но обычно содержит некоторый javascript, который форматирует URL-адрес сохранения (см. Ниже) и собирает данные отправки.
form.php
Конструктор:
public function __construct() { parent::__construct(); $this->setTemplate('your/adminhtml/edit/form.phtml'); }
И метод _prepareLayout:
protected function _prepareLayout() { // Save button $this->setChild('save_button', $this->getLayout()->createBlock('adminhtml/widget_button') ->setData(array( 'label' => Mage::helper('catalog')->__('Save Category'), 'onclick' => "formSubmit('" . $this->getSaveUrl() . "', true)", 'class' => 'save' )) );
Кнопка сохранения – это то, что направляет представление правильному контроллеру. В этом примере выше они используют getSaveUrl как метод этих блочных классов. Вы также можете жестко закодировать это или использовать $this->getUrl('*/*/save')
как вы, вероятно, делаете в другом месте. Нажатие этой кнопки сохранения приведет к сериализации формы:
form.phtml
Файл по умолчанию просто имеет:
<div class="entry-edit"> <?php echo $this->getFormHtml();?> </div> <?php echo $this->getChildHtml('form_after');?>
Расширенный файл form.phtml, который включает редактируемые данные post, делает примерно следующее:
<div class="entry-edit"> <?php echo $this->getFormHtml();?> </div> <?php echo $this->getChildHtml('form_after');?> <script> function formSubmit(url){ var elements = $('[yourformid]').select('input'); var serialized = Form.serializeElements(elements, true); window.location(url + '?' + serilized.[element_name].join(',')); } </script>
Я не тестировал каждую часть вышеуказанного кода, но теория прочная, и это то, что я делаю в этих ситуациях.
Приветствия.
Хотя вы правы, что этот атрибут доступен как свойство для addColumn, я считаю, что FlorinelChis на самом деле правильный, так как требуется форма. Единственный пример, который я знаю в основном коде Magento, – это упорядочение продукта при редактировании категории. Если вы посмотрите на него, вы увидите, что рассматриваемая Grid фактически добавлена в качестве вкладки в Редактировать форму категории. Сохранение базы данных выполняется как часть стандартного сохранения формы редактирования (в saveAction
из Mage_Adminhtml_Catalog_CategoryController
продукты хранятся с Varien_Object
Magic setPostedProducts
, а затем, когда действие вызывает сохранение в модели категории, функция _afterSave
в триггерах модели категории _saveCategoryProducts
, который сохраняет информацию в базе данных).
Существует (к сожалению) отсутствие автоматической поддержки для сохранения значений непосредственно со стандартной сетки.