Вспомогательная форма Prestashop типа «файл»

Я работаю над prestasshop и создал вспомогательную форму внутри контроллера (для бэк-офиса). Мой вопрос заключается в том, как загрузить документ, используя тип: «файл» из вспомогательной формы. Вот код:

public function __construct()
{
    $this->context = Context::getContext();
    $this->table = 'games';
    $this->className = 'Games';
    $this->lang = true;
    $this->addRowAction('edit');
    $this->addRowAction('delete');
    $this->bulk_actions = array('delete' => array('text' => $this->l('Delete selected'),
    'confirm' => $this->l('Delete selected items?')));
    $this->multishop_context = Shop::CONTEXT_ALL;

    $this->fieldImageSettings = array(
        'name' => 'image',
        'dir' => 'games'
    );

    $this->fields_list = array(
        'id_game' => array(
            'title' => $this->l('ID'),
            'width' => 25
        )
    );

    $this->identifier = 'id_game';
    parent::__construct();
}

public function renderForm()
{
    if (!($obj = $this->loadObject(true)))
        return;

    $games_list = Activity::getGamesList();     

    $this->fields_form = array(
        'tinymce' => true,          
        'legend' => array(
            'title' => $this->l('Game'),
            'image' => '../img/admin/tab-payment.gif'
        ),
        'input' => array(
            array(
                  'type' => 'select',
                  'label' => $this->l('Game:'),
                  'desc' => $this->l('Choose a Game'),
                  'name' => 'id_games',
                  'required' => true,
                  'options' => array(
                        'query' => $games_list,
                        'id' => 'id_game',
                        'name' => 'name'
                    )
            ),
            array(
                'type' => 'text',
                'label' => $this->l('Game Title:'),
                'name' => 'name',
                'size' => 64,
                'required' => true,
                'lang' => true,
                'hint' => $this->l('Invalid characters:').' <>;=#{}'
            ),
            array(
                'type' => 'file',
                'label' => $this->l('Photo:'),
                'name' => 'uploadedfile',
                'id' => 'uploadedfile',
                'display_image' => false,
                'required' => false,
                'desc' => $this->l('Upload your document')
            )
        )
    );

    $this->fields_form['submit'] = array(
        'title' => $this->l('   Save   '),
        'class' => 'button'
    );

    return AdminController::renderForm();
}

Теперь, как я могу загрузить документ? Должен ли я создавать столбец в таблице БД (таблица игр) для хранения файла или чего-то связанного?

заранее спасибо


person tsxs    schedule 29.11.2014    source источник


Ответы (2)


Я предполагаю, что это AdminController для вашей модели. Теперь модель явно не может хранить файл в столбце таблицы. Что вы можете сделать, так это сохранить путь к загруженному файлу. Это то, что вы можете спасти.

Вы должны посмотреть в классе AdminController (который вы расширили). Когда вы отправляете форму, выполняется один из двух методов:

processAdd()
processUpdate()

Теперь исследуйте логику потока в этих методах. Из этого метода вызываются другие методы, например:

$this->beforeAdd($this->object); -> calls $this->_childValidation();
$this->validateRules();
$this->afterUpdate($object);

Как видите, это методы, с помощью которых вы можете делать свои собственные вещи. Если вы посмотрите на эти функции в классе AdminController, они пусты. Они специально добавлены, чтобы люди могли переопределить их и поместить туда свою собственную логику.

Таким образом, используя эти функции, вы можете проверить загруженные вами поля файла (даже если это не в самой модели), если он проверяет, вы можете назначить путь к объекту; а затем в методе beforeAdd вы можете фактически переместить загруженный файл в нужное место (поскольку прошла как дочерняя проверка, так и проверка по умолчанию).

Как я это сделал:

protected function _childValidation()
{
   // Check upload errors, file type, writing permissions
   // Use $this->errors['file'] if there is an error;

protected function beforeAdd($object)
{
   // create filename and filepath
   // assign these fields to object;

protected function afterAdd($object)
{
   // move the file

Если вы разрешаете обновлять поле файла, вам также необходимо выполнить эти шаги для методов обновления.

person gskema    schedule 29.11.2014
comment
Спасибо за ваш полезный ответ! В этом случае, где я должен написать фактический код для фактической загрузки? Что-то вроде ((move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)). - person tsxs; 30.11.2014

вы можете получить загруженный файл, используя $_FILES['uploadedfile'] в обеих функциях processAdd() и processUpdate(), вы можете проверить все условия там и перед вызовом $this->object->save(); чтобы сохранить данные формы, вы можете написать код для загрузки файла в нужное место, например

move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)

поскольку вы не можете сохранить файл в базе данных, вам нужно сохранить только имя файла или местоположение в базе данных.

надеюсь, это поможет

person Knowband Plugins    schedule 21.01.2016