Magento - действие редактирования нового модуля создает новый элемент

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

Проблема в том, что когда я нажимаю «сохранить», Magento создает новый баннер и не изменяет исходный баннер. Это происходит, когда я что-то изменяю, и если я ничего не изменяю и нажимаю «сохранить».

У меня другая проблема. У меня есть поле изображения, и оно отлично работает, но когда я нажимаю «редактировать», оно показывает изображение предварительного просмотра и флажок «Удалить», но поле пусто, и если я сохраняю баннер, поле изображения остается пустым.

Я надеюсь, что вы можете мне помочь. Заранее спасибо, если вам нужна дополнительная информация, спросите меня.


person saturno    schedule 20.10.2011    source источник
comment
Добавление рассматриваемого кода к вашему вопросу очень поможет.   -  person Allan MacGregor    schedule 20.10.2011
comment
Я прикрепил несколько файлов (сетка, форма и контроллер, все они очень короткие ^^) в этом другом посте: magentocommerce.com/boards/viewthread/263717 Спасибо за комментарий (мне всегда нужно это редактировать, я ненавижу это, когда я нажимаю ввод, он отправляет комментарий jaja.)   -  person saturno    schedule 20.10.2011


Ответы (1)


о сохранении вашего баннера, адаптируйте следующий код к вашей ситуации: Здесь важно использовать реестр при сохранении. Убедитесь также, что идентификатор баннера указан в $data при сохранении. Ваш form.php должен предоставить его, добавьте приведенный ниже код перед строкой $form->setValues(...):

$model = Mage::registry('BannerManagement_data');
if ($model->getEntityId()) {
   $fieldset->addField('entity_id', 'hidden', array('name' => 'entity_id'));// or banner_id depends on what id title you gave in your database table
}

Конечно, вы должны проверить ввод пользователей перед сохранением. Используйте защищенный метод _beforeSave() в вашей модели баннера, чтобы реализовать эту проверку ввода, или в контроллере непосредственно в действии сохранения.

/**
 * Common init to almost all actions
 */
protected function _initAction(){
    $this->_title ($this->__("Banner"));

    $this->loadLayout();
    $this->_setActiveMenu('mymenu/banner');
    $this->_addBreadcrumb(Mage::helper('banner')->__('Banners'), Mage::helper('banner')->__('Items'));
    }

    if(! Mage::registry('current_banner')){
        Mage::register('current_banner', Mage::getModel('banner/item'));
    }

    $id = $this->getRequest()->getParam('id');
    if (!is_null($id)) {
        $model = Mage::registry('current_banner')->load($id);

        if (! $model->getId()) {
            $this->_getSession()->addError(Mage::helper('banner')->__('This banner item no longer exists'));
            $this->_redirect('*/*/');
            return;
        }
    }

    return $this;
}


/**
 * Banner edit page
 */ 
public function editAction(){
    $this->_initAction();
    $this->_title('Banner Edit');

    // 1. Get ID and create model
    $banner = Mage::registry('current_banner');

    // 2. set entered data if there had errors when we do save
    $data = $this->_getSession()->getBannerData(true);

    // 3. restore data from SESSION and provide a correct date format
    if (!empty($data)) {
        $banner->addData($data);
    }

    // 4. Build Edit form
    $this->_addBreadcrumb(Mage::helper('banner')->__('Edit banner Item'), Mage::helper('banner')->__('Edit Banner Item'));
    $this->_addContent($this->getLayout()->createBlock('banner/adminhtml_banner'));
    $this->renderLayout();
}

/**
 * Subscritpion save process
 */ 
public function saveAction(){

    $this->_initAction();
    $banner = Mage::registry('current_banner');
    $data = $this->getRequest()->getParams();

    if ($data) {

        try {
            $banner->addData($data);
            $banner->save();

            $this->_getSession()->addSuccess(Mage::helper('banner')->__('The banner item has been saved.'));

            if ($this->getRequest()->getParam('back', false)) {
                $this->_redirect('*/*/edit', array('id'    => $banner->getId(), '_current'=>true));
                return;
            }
        } catch (Exception $e) {
            $this->_getSession()->addError($e->getMessage());
            $this->_getSession()->setBannerData($banner->getData());
            $this->_redirectUrl($this->getUrl('*/*/edit', array('id' => $banner->getId())));
            return;
        }
    }
    $this->_redirectUrl($this->getUrl('*/adminhtml_overview'));
}
person Sylvain Rayé    schedule 20.10.2011
comment
Я пробовал с Mage::registry, но не работает. И я не знаю, что это такое ;) Как я могу проверить данные? Я хотел бы программировать на php, без Magento... - person saturno; 20.10.2011
comment
проверьте, что я написал о вашем файле form.php, entity_id вашего баннера отсутствует как скрытое значение - person Sylvain Rayé; 20.10.2011
comment
Да, я добавил это, но тоже не работает. Я видел, что когда я вхожу на страницу редактирования, у меня есть все правильные данные и идентификатор. Большое спасибо за время, которое вы используете со мной. - person saturno; 20.10.2011
comment
Хорошо, теперь это работает. Я использовал скрытое поле, как вы сказали, и некоторые изменения в контроллере, и теперь он работает. Большое спасибо. - person saturno; 04.11.2011