RSS Мои друзья Контакты

Magento backend - грузим картинку через админку

Если кто-то пропустил предыдущие главы, то модуль для дальнейшей работы можно скачать ЗДЕСЬ.

Итак для начала нужно написать mysql-upgrade для нашего модуля, чтобы добавить поле в котором будет сохраняться путь к файлу. Создаем app/code/local/Freaks/Quotes/sql/quotes_setup/mysql4-upgrade-0.2.0-0.3.0.php

<?php
$installer = $this;
$installer->startSetup();

$installer->run("
ALTER TABLE `{$this->getTable('freaks_quotes/quote')}` ADD `image` VARCHAR( 255 ) NOT NULL
"
);

$installer->endSetup();

ВНИМАНИЕ!!! Не забываем сменить версию нашего в модуля в config.xml, иначе upgrade не запустится!!!

Крутим педали

Открываем теперь файл формы (app/code/local/Freaks/Quotes/Block/Adminhtml/Edit/Form.php) и добавляем новое поле с типом image

<?php
class Freaks_Quotes_Block_Adminhtml_Edit_Form extends Mage_Adminhtml_Block_Widget_Form
{
protected function _prepareForm()
{
$quote = Mage::registry('current_quote');
$form = new Varien_Data_Form(array(
'enctype'=> 'multipart/form-data'
));
$fieldset = $form->addFieldset('edit_quote', array(
'legend' => Mage::helper('freaks_quotes')->__('Quote Details')
));

if ($quote->getId()) {
$fieldset->addField('id', 'hidden', array(
'name' => 'id',
'required' => true
));
}

$fieldset->addField('name', 'text', array(
'name' => 'name',
'title' => Mage::helper('freaks_quotes')->__('Title'),
'label' => Mage::helper('freaks_quotes')->__('Title'),
'maxlength' => '250',
'required' => true,
));

$fieldset->addField('dscr', 'textarea', array(
'name' => 'dscr',
'title' => Mage::helper('freaks_quotes')->__('Contents'),
'label' => Mage::helper('freaks_quotes')->__('Contents'),
'style' => 'width: 98%; height: 200px;',
'required' => true,
));

$fieldset->addField('image', 'image', array(
'name' => 'image',
'label' => Mage::helper('freaks_quotes')->__('Image')
));

$form->setMethod('post');
$form->setUseContainer(true);
$form->setId('edit_form');
$form->setAction($this->getUrl('*/*/save'));

$data = $quote->getData();
$data['image'] = $quote->getImage();
$form->setValues($data);

$this->setForm($form);
}
}

Меняем модель (app/code/local/Freaks/Quotes/Model/Quote.php), чтобы он умел сохранять рисунок на файловую систему в папку media.

<?php
class Freaks_Quotes_Model_Quote extends Mage_Core_Model_Abstract
{
protected $imagePath = 'freaks_quotes';

protected function _construct()
{
$this->_init('freaks_quotes/quote');
}

protected function _beforeSave()
{
if ($this->getData('image/delete')) {
$this->unsImage();
}
try {
$uploader = new Varien_File_Uploader('image');
$uploader->setAllowedExtensions(array('jpg','jpeg','gif','png'));
$uploader->setAllowRenameFiles(true);

$this->setImage($uploader);
} catch (Exception $e) {
// it means that we do not have files for uploading
}

return parent::_beforeSave();
}

public function getImagePath()
{
return Mage::getBaseDir('media') . DS . $this->imagePath . DS;
}

public function setImage($image)
{
if ($image instanceof Varien_File_Uploader) {
$image->save($this->getImagePath());
$image = $image->getUploadedFileName();
}
$this->setData('image', $image);
return $this;
}

public function getImage()
{
if ($image = $this->getData('image')) {
return Mage::getBaseUrl('media') . $this->imagePath . DS . $image;
} else {
return '';
}
}

protected function prepareImageForDelete()
{
$image = $this->getData('image');
return str_replace(Mage::getBaseUrl('media'), Mage::getBaseDir('media') . DS, $image['value']);
}

public function unsImage()
{
$image = $this->getData('image');
if (is_array($image)) {
$image = $this->prepareImageForDelete();
} else {
$image = $this->getImagePath() . $image;
}

if (file_exists($image)) {
unlink($image);
}
$this->setData('image', '');
return $this;
}
}

Сначала переопределим метод _beforeSave модели, в котором будем сохранять или удалять картинку. Чтобы сохранить загружаемый пользователем файл, используем стандартный Varien_File_Uploader, в конструктор которого передаем ключ файла из массива $_FILES (если передать ключ, которого не существует в супер глобальной переменной $_FILES, то будет брошено исключение). Он сделает всю грязную работу за нас.

Рассмотрим теперь методы unsImage и setImage.

  • setImage - проверяет, если передаваемое значение является объектом класса Varien_File_Uploader, если да - сохраняет его на файловую систему в нужную нам директорию и устанавливает значение в модель
  • unsImage - проверяет, если значение в модели является массивом, если да - это значит данные были переданы из формы, поэтому заменяем media base url на media base path. Проверяем если файл существует, то удаляем его

Вот и все, так просто!!!

Скачать модифицированый модуль можно ЗДЕСЬ

Добавить комментарий

Комментариев: 7

  • Naujasdizainas
    Ответить 30 сентября 2011 г., 8:10
    Есть проблема. При (Edit form) после обновления даных сохраняется image в базу как array хоть и имаге нетрогали. Временое решение .... После $data = $quote->getData(); в файле app/code/local/Freaks/Quotes/Block/Adminhtml/Edit/Form.php Добавляем $image = $this->getData('image'); if (is_array($image)) { $data['image'] = $quote->getImage(); } else { $data['image'] = ''; } Теперь image Ок
  • vicodin
    Ответить 17 октября 2011 г., 14:25
    Hello, nice site. Posted by myself in bookmarks
  • Anthony
    Ответить 18 января 2012 г., 1:45
    Немного неясный момент с полем картинки. Смотрю генерацию html кода в Varien_Data_Form_Element_Image.
    Если мы посмотрим на метод getElementHtml, то можно увидеть где генерится пустое поле изображения parent::getElementHtml(). Далее вызывается _getDeleteCheckbox. Если изображение имеет уже какое-то значение, то выводится второе скрытое поле с этим значением. Cначала генерится имя name="image", а если значение уже есть, то генерится еще другое имя name="image[value]". В результате при попытке сохранить новое изображение поверх старого заканчивается неудачей, т.к. name="image[value]" перекрывает значение поста поля name="image". Как быть в этом случае, если мы хотим записать новое изображение поверх старого? Еще вопрос - файлы на сервер не заливаются почему-то, хотя в каталоге media каталог freaks_quotes присутствует, в чем может быть проблема?
    • Anthony
      Ответить 18 января 2012 г., 1:48
      по второму вопросу - возникает эксепшн "$_FILES array is empty"
    • Anthony
      Ответить 18 января 2012 г., 2:03
      Второй вопрос закрыт. В файле form.php нужно изменить определение объекта формы: $form = new Varien_Data_Form(array('enctype' => 'multipart/form-data'));
    • Anthony
      Ответить 18 января 2012 г., 2:19
      Я нашел в чем причина была. Просто я забыл добавить array('enctype' => 'multipart/form-data'). Теперь все работает. Спасибо!
  • Antropusx
    Ответить 13 мая 2012 г., 15:24
    Да...дизайн явно надо было бы сменить:)
    Тёмно-зелёный цвет отлично подошёл бы xD