Magento: Adminhtml поле «Изображение» - PullRequest
2 голосов
/ 30 января 2010

Я установил поле ввода типа «Изображение» в форме администратора, используя код ниже:

<?php
// Tab Form
// File: app/code/local/MyCompany/Mymodule/Block/Adminhtml/Items/Edit/Tab/Form.php

class MyCompany_Mymodule_Block_Adminhtml_Items_Edit_Tab_Form extends Mage_Adminhtml_Block_Widget_Form
{
  protected function _prepareForm()
  {
      $form = new Varien_Data_Form();
      $this->setForm($form);
      $fieldset = $form->addFieldset('mymodule_form',        array('legend'=>Mage::helper('mymodule')->__('Item information')));     

      $fieldset->addField('photo', 'image', array(
          'label'     => Mage::helper('mymodule')->__('Photo'),
          'required'  => false,
          'name'      => 'photo',
      ));     

      if ( Mage::getSingleton('adminhtml/session')->getMymoduleData() )
      {
          $form->setValues(Mage::getSingleton('adminhtml/session')->getMymoduleData());
          Mage::getSingleton('adminhtml/session')->setMymoduleData(null);
      } elseif ( Mage::registry('mymodule_data') ) {
          $form->setValues(Mage::registry('mymodule_data')->getData());
      }
      return parent::_prepareForm();
  }
}

А затем внутри контроллера сохраните изображение, используя:

public function saveAction() 
{
 if($data = $this->getRequest()->getPost()) {              
     $model = Mage::getModel('mymodule/speakers');        
     $model->setData($data)->setId($this->getRequest()->getParam('id'));

     $model->setKeynote($this->getRequest()->getParam('keynote'));

     // Save photo
     if(isset($_FILES['photo']['name']) && $_FILES['photo']['name'] != '') {
         try {    
             $uploader = new Varien_File_Uploader('photo');

             $uploader->setAllowedExtensions(array('jpg','jpeg','gif','png'));
             $uploader->setAllowRenameFiles(false);
             $uploader->setFilesDispersion(false);

             // Set media as the upload dir
             $media_path  = Mage::getBaseDir('media') . DS;                

             // Upload the image
             $uploader->save($media_path, $_FILES['photo']['name']);

             $data['photo'] = $media_path . $_FILES['photo']['name'];

         } 
         catch (Exception $e) {
             print_r($e);
             die;
         }                            
     }
     else {       
         if(isset($data['photo']['delete']) && $data['photo']['delete'] == 1) {
             $data['photo'] = '';
         }
         else {
             unset($data['photo']);
         }
      }
     if(isset($data['photo'])) $model->setPhoto($data['photo']);    

     try {                
         $model->save();

         Mage::getSingleton('adminhtml/session')->addSuccess(Mage::helper('mymodule')->__('Item was successfully saved'));
         Mage::getSingleton('adminhtml/session')->setFormData(false);

         if ($this->getRequest()->getParam('back')) {
             $this->_redirect('*/*/edit', array('id' => $model->getId()));
             return;
         }
         $this->_redirect('*/*/');
         return;
     } 
     catch (Exception $e) {
         Mage::getSingleton('adminhtml/session')->addError($e->getMessage());
         Mage::getSingleton('adminhtml/session')->setFormData($data);
         $this->_redirect('*/*/edit', array('id' => $this->getRequest()->getParam('id')));
         return;
     }
 }

 Mage::getSingleton('adminhtml/session')->addError(Mage::helper('mymodule')->__('Unable to find item to save'));
 $this->_redirect('*/*/');
}

Короче говоря: Когда я сохраняю элемент (используя «Сохранить» или «Сохранить» и «Продолжить редактирование») в бэкэнде, он хорошо сохраняется один раз. Затем в следующий раз выдает следующую ошибку:

Примечание: преобразование массива в строку в /home/wwwadmin/public_html/aaa.bbb.ccc/public/lib/Zend/Db/Statement/Pdo.php по линии 232

Следующее сохраняет нормально. Следующее: ошибка. Следующий хорошо ... Вы понимаете, о чем я ...

Я искал некоторый код, чтобы увидеть, как используется этот тип ввода. Но пока ничего. Ни внутри кода magento. Это единственное, что я нашел: http://www.magentocommerce.com/wiki/how_to/how_to_create_pdf_upload_in_backend_for_own_module

Есть идеи?

Спасибо

Ответы [ 2 ]

0 голосов
/ 21 февраля 2017

Попробуйте приведенный ниже код для сохранения действия в вашем контроллере

    if ($data = $this->getRequest()->getPost()) {
        $id = $this->getRequest()->getParam('id');
        $model = Mage::getModel('your_model')->load($id);

        if (isset($data['image']['delete'])) {
            Mage::helper('your_helper')->deleteImageFile($data['image']['value']);
        }
        $image = Mage::helper('your_helper')->uploadBannerImage();
        if ($image || (isset($data['image']['delete']) && $data['image']['delete'])) {
            $data['image'] = $image;
        } else {
            unset($data['image']);
        }            
        $model->setData($data)
                ->setId($id);
        try {
            $model->save();
            Mage::getSingleton('adminhtml/session')->addSuccess('Your request Save.');
            $this->_redirect('*/*/');
        } catch (Exception $e) {
            Mage::getSingleton('adminhtml/session')->addError($e->getMessage());
            Mage::getSingleton('adminhtml/session')->setFormData($data);
            $this->_redirect('*/*/edit', array('id' => $this->getRequest()->getParam('id')));
            return;
        }
    } else {
        Mage::getSingleton('adminhtml/session')->addError(Mage::helper('your_helper')->__('Unable to find your request to save'));
        $this->_redirect('*/*/');
    }

В твоем помощнике

    public function uploadBannerImage() {
    $path = Mage::getBaseDir('media') . DS . 'images';
    $image = "";
    if (isset($_FILES['image']['name']) && $_FILES['image']['name'] != '') {
        try {
            /* Starting upload */
            $uploader = new Varien_File_Uploader('image');

            // Any extention would work
            $uploader->setAllowedExtensions(array(
                'jpg', 'jpeg', 'gif', 'png'
            ));
            $uploader->setAllowRenameFiles(true);

            $uploader->setFilesDispersion(true);

            $uploader->save($path, $uploader->getCorrectFileName($_FILES['image']['name']));
            $image = substr(strrchr($uploader->getUploadedFileName(), "/"), 1);
        } catch (Exception $e) {
            Mage::getSingleton('customer/session')->addError($e->getMessage());
        }
    }
    return $image;
}

    public function deleteImageFile($image) {
    if (!$image) {
        return;
    }
    try {
        $img_path = Mage::getBaseDir('media') . "/" . $image;
        if (!file_exists($img_path)) {
            return;
        }
        unlink($img_path);
    } catch (Exception $exc) {
        echo $exc->getTraceAsString();
    }
}
0 голосов
/ 16 сентября 2010

Когда эта строка запускается:

$model->setData($data)->setId($this->getRequest()->getParam('id'));<br/>
$model->_data['image'] will be set to   array('image'=>'[YOUR path]')<br/>

Вы должны вызывать метод setData() после всех манипуляций с data['image'];

...