Я пытаюсь добавить настраиваемое поле в prestashop, которое будет обрабатывать загрузку изображения и сохранить имя файла в БД в столбце «логотип».
Я создал таблицы и добавил столбец VARCHAR (255).
До сих пор я добавил в свой класс модели следующий соответствующий код относительно этого поля.
<?php
class MyModel extends ObjectModel
{
public static $definition = array(
....
'multilang' => true,
'multilang_shop' => false,
'fields' => array(
'logo' => [
'type' => self::TYPE_STRING,
'lang' => false,
'validate' => null,
'size' => 255,
],
),
);
...
public $logo;
}
Я добавил в свой контроллер администратора следующее.
public function __construct()
{
$this->fields_list = array(
'logo' => array(
'title' => $this->l('logo'),
'width' => 'auto',
'orderby' => false
),
);
parent::__construct();
}
public function init()
{
parent::init();
}
public function initContent()
{
return parent::initContent(); // TODO: Change the autogenerated stub
}
public function processAdd()
{
return parent::processAdd(); // TODO: Change the autogenerated stub
}
public function processSave()
{
return parent::processSave(); // TODO: Change the autogenerated stub
}
public function renderForm()
{
if (!($obj = $this->loadObject(true)))
return;
$this->fields_form = array(
'legend' => array(
'title' => $this->l('Stores'),
'icon' => 'icon-home',
),
'input' => array(
...
array(
'type' => 'file',
'label' => $this->l('Logo'),
'name' => 'logo',
'display_image' => true,
'image' => $image_url ? $image_url : false,
'size' => $image_size,
'hint' => $this->l('Storefront picture.'),
),
...
),
'submit' => array(
'title' => $this->l('Save'),
),
);
$this->fields_form['buttons'] = array(
'save-and-stay' => array(
'title' => $this->l('Save and stay'),
'name' => 'submitAdd' . $this->table . 'AndStay',
'type' => 'submit',
'class' => 'btn btn-default pull-right',
'icon' => 'process-icon-save',
),
);
return parent::renderForm();
}
}
Появляется селектор изображений, и я могу выбрать изображение в области администратора, когда пытаюсь добавить новый элемент MyModel. Элемент также сохраняется правильно, а все остальные поля переходят в соответствующие таблицы и столбцы
Столбец, который должен содержать имя изображения, остается пустым, и нигде не загружается файл.
В документации по загрузке изображений в модулях не хватает, так что вы не знаете, что мне не хватает?
Нужно ли обрабатывать загрузку вручную или есть интерфейс, который я мог бы использовать?
-
Мне удалось найти способ загрузки изображений в моем случае.
В случае, если кто-то еще ищет это
Шаг 1.
В контроллере объявите следующую переменную и убедитесь, что каталог существует.
$this->fieldImageSettings = [];
$this->fieldImageSettings['logo'] = array(
'name' => 'logo',
'dir' => self::IMG_DIR_NAME,
);
Шаг 2.
В контроллере переопределите функцию, чтобы она обрабатывала расширение файла и сохраняла значение в правильном свойстве модели.
protected function uploadImage($id, $name, $dir, $ext = false, $width = null, $height = null)
{
$pathInfo = pathinfo($_FILES[$name]['name']);
$ext = $pathInfo['extension'];
$this->imageType = $ext;
parent::uploadImage($id, $name, $dir, $ext, $width, $height); // TODO: Change the autogenerated stub
$this->object->logo = $this->id_object . '.' . $this->imageType;
if (!(count($this->errors) > 0)) {
$this->object->save();
return true;
}
}
Шаг 3
Чтобы показать изображение в форме, добавьте следующее в функцию renderForm
$image = self::IMG_DIR . $obj->logo;
$image_url = ImageManager::thumbnail($image, $this->table . '_' . (int)$obj->id . '.' . $this->imageType, 150,
$this->imageType, true, true);
$image_size = file_exists($image) ? filesize($image) / 1000 : false;
$this->fields_form = array(
...
'input' => array(
array(
'type' => 'file',
'label' => $this->l('logo'),
'name' => 'logo',
'display_image' => true,
'image' => $image_url ? $image_url : false,
'size' => $image_size,
'hint' => $this->l('Storefront picture.'),
'delete' => true,
),
Буду признателен за любые сведения относительно того, является ли это правильным или безопасным способом или если вы можете обнаружить какие-либо проблемы с этой реализацией.
PS: До сих пор я не смог найти способ удалить текущее изображение в форме администратора.