Как добавить поле изображения в модуль Custom Prestashop 1.6 - PullRequest
0 голосов
/ 06 сентября 2018

Я пытаюсь добавить настраиваемое поле в 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: До сих пор я не смог найти способ удалить текущее изображение в форме администратора.

...