2015-08-26 5 views
0

Я пытаюсь создать модуль импорта XML, который преобразует данный файл в формат CSV, а затем использует этот CSV для импорта категорий и продуктов.Загрузка файла в панель конфигурации модуля, Prestashop

У меня есть рабочая страница конфигурации, созданная с помощью getContent(), она в основном вызывает метод, который генерирует эту форму через $ helper-> generateForm(). $ helper - это объект HelperForm().

protected function getConfigForm() 
{ 
    return array(
     'form' => array(
      'legend' => array(
      'title' => $this->l('Settings'), 
      'icon' => 'icon-cogs', 
      ), 
      'input' => array(
       array(
        'type' => 'file', 
        'label' => $this->l('XML file'), 
        'name' => 'XMLIMPORT_XML_FILE', 
        'desc' => $this->l('Select file you wish to import.'), 
        'required' => true 
       ), 
       array(
        'col' => 3, 
        'type' => 'text', 
        'prefix' => '<i class="icon icon-envelope"></i>', 
        'desc' => $this->l('Enter a valid email address'), 
        'name' => 'XMLIMPORT_LINES', 
        'label' => $this->l('Records per file'), 
       ), 
      ), 
      'submit' => array(
       'title' => $this->l('Save'), 
      ), 
     ), 
    ); 
} 

Мне нужно передать эти данные в мой XML-конвертер. Как загрузить файл (около 10-20 МБ) в Prestashop, чтобы он мог делать с ним другие вещи? Как сохранить его на сервере?

Я попытался сделать это:

return array(
    'XMLIMPORT_XML_FILE' => Configuration::get('XMLIMPORT_XML_FILE', null), 
    'XMLIMPORT_LINES' => Configuration::get('XMLIMPORT_LINES', 1000) 
); 

И после того, что это:

$form_values = $this->getConfigFormValues(); // returned array from above 

foreach (array_keys($form_values) as $key) 
    Configuration::updateValue($key, Tools::getValue($key)); 

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

$xml_converter = new XMLToCSVConverter(Configuration::get('XMLIMPORT_XML_FILE'), 'output', 'example_products.php'); 

По-видимому, это не произошло, поскольку ничего не происходит. Сам класс отлично работает за пределами модуля Prestashop. Конструктор - __construct($xml_file, $csv_filename, $template_file).

Мне нужно передать файл, который я загружаю в этот конструктор. Я уже много дней борется.

@edit: Я вижу содержимое файла внутри HTTP-вызова при нажатии на кнопку отправки. Но как передать этот файл в мой класс?

ответ

0

Насколько я помню 'type' => 'file', фактически не сохраняет никаких значений в базе данных. Этот тип предназначен только для вывода поля файла в вашей форме.

После отправки вам необходимо выполнить специальную обработку с помощью $_FILES['XMLIMPORT_XML_FILE']: перейдите на страницу upload/ или в любое удобное для вас время.

'XMLIMPORT_XML_FILE' => Configuration::get('XMLIMPORT_XML_FILE', null), не вернет вам ничего. После того, как вы загрузите мое желание сохранить загруженный путь к файлу здесь, но он не появится в следующий раз в форме, если вы сами не создадите вывод.

Модуль configratuon предназначен для сохранения значений конфигурации текста. Обработка файлов сложнее, и вы должны делать это самостоятельно каждый раз.

EDIT:

Чтобы перехватить процесс сохранения, просмотра представить название кнопки и сделать, если заявление:

public function getContent() { 
    if(Tools::isSubmit('submitButtonName')) { 
     error_log(print_r($_FILES, 1)); 
    } 
} 

Там, вероятно, функция postProcess, которая делает то же самое (это выглядит, как вы скопировали методы из модуля по умолчанию).

+0

AFAIK PHP сохраняет все файлы, которые поступают из формы во временном состоянии, если только не перемещено в другое место. И в этом случае «XMLIMPORT_XML_FILE» содержит обработчик файла. Также я смущен, потому что $ _FILES пуст. –

+0

Вы должны, вероятно, посмотреть массив $ _FILEs до рендеринга getContent – gskema

0

prestashop обрабатывает загрузку изображения с помощью класса ImageManager, этот класс содержит больше методов, которые полезны для обработки загрузки изображений, изменения размера и т. Д., Поэтому лучше всего использовать модуль homeslider по умолчанию для загрузки изображения с помощью модуля. Этот модуль обрабатывает процесс загрузки изображений в методе postProcess с помощью класса ImageManager, этот метод класса будет выполнять все процессы, связанные с загрузкой.

Смежные вопросы