0 Пользователей и 1 Гость просматривают эту тему.
  • 19 Ответов
  • 1079 Просмотров
*

hemicide

  • Осваиваюсь на форуме
  • 29
  • 0 / 0
Добрый день. Пытаюсь разработать модуль для Joomla.
На странице пользователя есть логика, которая отправляет выбранные файлы через AJAX на сервер.
На сервере, в Helper.php есть метод getAjax() который должен принимать данные.
При отправке через AJAX обычный текст\массив работает. Но если отправлять FormData, то данные на сервер даже не уходят. А метод AJAX в jQuery возвращает успех, но в ответе содержится полный HTML код страницы, на которой все это находится. Метод getAjax соответственно не срабатывает.

На стороне клиента в default.php
Код
<?php defined('_JEXEC') or die;
JHtml::_('jquery.framework');
JHtml::script('modules/mod_uploadschedule/js/post.js');
?>

<div id="mod_uploadschedule">
<div id="uploadschedule">
<form action="" class="form-upload">
<input type="text" required=""><br>
<input type="file" id="files"><br>
<button type="button" class="btn btn-success" id="btn_upload">Загрузить</button>
</form>
</div>
</div>
и post.js
Код
	jQuery(document).ready(function (jQuery) {
jQuery('#btn_upload').on( 'click', function(event){

event.stopPropagation();
event.preventDefault();

if( typeof files == 'undefined' ) return;

var form = jQuery('.form-upload')[0];
var input = jQuery('#files')[0];
var data = new FormData(form);
jQuery.each( input.files, function( key, value ){
data.append( key, value );
});

var request = {
'option': 'com_ajax',
'module': 'uploadschedule',
'format': 'json',
'data'  : data
  };
jQuery.ajax({
type    : 'POST',
processData : false,
contentType : false,
data    : request,
success: function ( response, status, jqXHR ) {
if( typeof response.error === 'undefined' ){

} else {
console.log('ОШИБКА: ' + response.data );
}
},
error: function(response, jqXHR, exception) {
console.log('ОШИБКА: ' + response.responseText );
}
});

return false;
});
})

На сервере Helper.php
Код
<?php defined('_JEXEC') or die;

class modUploadscheduleHelper {
public static function getAjax() {
jimport('joomla.application.module.helper');
try {
$input  = JFactory::getApplication()->input;
$files  = $input->files->get('jform');
$post = $input->post->get('jform', array(), 'array');

var_dump($data);
var_dump($post);

//return array('status' => 'ok', 'message' => '');


if ($input->get('cmd')) {
$cmd  = $post_array['cmd'];
$data = $post_array['data'];

switch ($cmd) {
case "download" :
break;

case "set" :
break;

default:
return array('status' => 'error', 'message' => 'cmd not identify');
break;
}
}
} catch (Error $e) {
echo new JResponseJson($e->getMessage());
}
}
}

Помогите разобраться.
« Последнее редактирование: 23.10.2020, 12:03:12 от hemicide »
*

sivers

  • Живу я здесь
  • 2464
  • 336 / 0
Попробуйте подправить скрипт, чтоб получилось так:
Код
jQuery(document).ready(function (jQuery) {
jQuery('#btn_upload').on( 'click', function(event){

event.stopPropagation();
event.preventDefault();

if( typeof files == 'undefined' ) return;

var form = jQuery('.form-upload')[0];
var formData = new FormData(form);
jQuery.ajax({
type    : 'POST',
processData : false,
contentType : false,
url: '/index.php?option=com_ajax&module=uploadschedule&format=json',
data: formData,
success: function ( response, status, jqXHR ) {
if( typeof response.error === 'undefined' ){

} else {
console.log('ОШИБКА: ' + response.data );
}
},
error: function(response, jqXHR, exception) {
console.log('ОШИБКА: ' + response.responseText );
}
});

return false;
});
})
На связи в telegram @sivers
sivers @ inbox . ru
https://sivers.su/
*

hemicide

  • Осваиваюсь на форуме
  • 29
  • 0 / 0
Спасибо. Напрямую работает. файл уходит на сервер. Метод getAjax срабатывает, но:
1) я не могу получить эти файлы:
Код
			$input  = JFactory::getApplication()->input;
$files  = $input->files->get('jform');
$post = $input->post->get('jform', array(), 'array');
$files или $post пустые.
2) А есть возможность отправлять вместе с FormData, свои пользовательские данные, ведь теперь в AJAX.data я сразу записываю FormData
*

sivers

  • Живу я здесь
  • 2464
  • 336 / 0
1) я не могу получить эти файлы:
Посмотрите что вообще приходит на сервер. Попробуйте там сделать:
Код
print_r($_FILES);
2) А есть возможность отправлять вместе с FormData, свои пользовательские данные
Да. У вас там 2 формы объединяются в одну отправку что ли? Попробуйте тогда сделать так:
Код
jQuery(document).ready(function (jQuery) {
jQuery('#btn_upload').on( 'click', function(event){

event.stopPropagation();
event.preventDefault();

if( typeof files == 'undefined' ) return;

var form = jQuery('.form-upload')[0];
var input = jQuery('#files')[0];
var data = new FormData(form);
jQuery.each( input.files, function( key, value ){
data.append( key, value );
});
data.append('option', 'com_ajax');
data.append('module', 'uploadschedule');
data.append('format', 'json');

jQuery.ajax({
type    : 'POST',
processData : false,
contentType : false,
data    : data,
success: function ( response, status, jqXHR ) {
if( typeof response.error === 'undefined' ){

} else {
console.log('ОШИБКА: ' + response.data );
}
},
error: function(response, jqXHR, exception) {
console.log('ОШИБКА: ' + response.responseText );
}
});

return false;
});
})
Если же отправка будет идти не по адресу - добавьте параметр url: '/index.php?option=com_ajax&module=uploadschedule&format=json', из предыдущего варианта.
На связи в telegram @sivers
sivers @ inbox . ru
https://sivers.su/
*

hemicide

  • Осваиваюсь на форуме
  • 29
  • 0 / 0
Добавление параметров в FormData сработал.  :D

На сервере вот что:
Код
Array([0] => Array([name] => Книга2.xls [type] => application/vnd.ms-excel [tmp_name] => C:\\Windows\\Temp\\php801C.tmp\ [error] => 0 [size] => 32768)){\"success\":true,\"message\":null,\"messages\":null,\"data\":[]}
*

sivers

  • Живу я здесь
  • 2464
  • 336 / 0
На сервере вот что:
в таком случае не получится читать инфу о переданных файлах через $files  = $input->files->get('jform');
Проверьте атрибут name в вашем <input type="file' .../> через который добавляете файлы. Там должно быть что-то вроде name="jform[myfiles]", если этого нет - добавьте и еще раз посмотрите что сервер вернет в print_r($_FILES);
На связи в telegram @sivers
sivers @ inbox . ru
https://sivers.su/
*

hemicide

  • Осваиваюсь на форуме
  • 29
  • 0 / 0
print_r($_FILES);
Код
Array(
[jform] => Array ([name] => Array ([files] => Clip2net_181018153949.png)
[type] => Array([files] => image/png\)
[tmp_name] => Array([files] => C:\\Windows\\Temp\\php7916.tmp)
[error] => Array([files] => 0)
[size] => Array([files] => 54669))

[0] => Array([name] => Certificate.png
[type] => image/png
[tmp_name] => C:\\Windows\\Temp\\php7917.tmp
[error] => 0
[size] => 777052)

[1] => Array([name] => Clip2net_181018153949.png
[type] => image/png
[tmp_name] => C:\\Windows\\Temp\\php7957.tmp
[error] => 0
[size] => 54669)
)

Получается что в $_FILES теперь какбы три элемента jform, 0, 1, но в jform всегда последний файл ( в данном случае тотже что и в 1, но с другим tmp_name)
В $files  = $input->files->get('jform'); также только последний файл
*

hemicide

  • Осваиваюсь на форуме
  • 29
  • 0 / 0
Получается что в $_FILES теперь какбы три элемента jform, 0, 1, но в jform всегда последний файл ( в данном случае тотже что и в 1, но с другим tmp_name)
В $files  = $input->files->get('jform'); также только последний файл

Из js скрипта при инициализации FormData убрал параметр, теперь имеет вид:
Код
var data = new FormData();
И элементов в массиве два, 0 и 1, без jform. Однако
Код
$files  = $input->files->get('jform');
теперь тоже пустой
*

sivers

  • Живу я здесь
  • 2464
  • 336 / 0
Из js скрипта при инициализации FormData убрал параметр, теперь имеет вид:
Код

var data = new FormData();

Так откуда ж ему теперь данные брать? )
В FormData должна быть передана форма параметром (аргументом), чтоб из ее полей (в т.ч. с файлом) вытянулись данные. А в таком виде там пусто, конечно.
Разберитесь с вашими формами и именам полей. Мне вашу форму не видно. Непонятно сколько там полей с файлами и как они названы. И почему составляется из нескольких форм, а не из одной. Получать же файлы на сервере можно и из $_FILES напрямую, главное - чтоб там не пусто было.
На связи в telegram @sivers
sivers @ inbox . ru
https://sivers.su/
*

hemicide

  • Осваиваюсь на форуме
  • 29
  • 0 / 0
Код
<div id="mod_uploadschedule">
<div id="uploadschedule">
<form action="" class="form-upload">
<input type="text" required=""><br>
<input type="file" id="files" name="jform[files]" multiple="multiple"><br>
<button type="button" class="btn btn-success" id="btn_upload">Загрузить</button>
</form>
</div>
</div>


Получается, если я при создании экземпляра FormData передаю ему форму, то он сам захватывает файлы которые там есть.
Либо я могу не передевать ему форму, но тогда вручную с помощью .append должен эти файлы добавить?

Мне бы подошёл второй вариант. Но тогда $files  = $input->files->get('jform'); пустой по понятным причинам, зато в $_FILES содержит все файлы. А если первый вариант, то в $_FILES только последний файл из множества выбранных

Так как же мне средствами фреймворма Joomla обработать то что в $_FILES? гдето читал что есть для этого класс JInputFiles. Или плюнуть и работать напрямую?
« Последнее редактирование: 23.10.2020, 15:07:06 от hemicide »
*

sivers

  • Живу я здесь
  • 2464
  • 336 / 0
Попробуйте первым способом (без ручного "аппенд"), имя поля поменяйте на name="test_files". В массиве $_FILES должны быть видны все переданные файлы.
На связи в telegram @sivers
sivers @ inbox . ru
https://sivers.su/
*

NewUsers

  • Живу я здесь
  • 2307
  • 215 / 0
  • +375 (25) 627-16-99 (WhatsApp, Telegram)
Отправить файл
Код: js
var files = jQuery('#files').prop("files"),
data = new FormData();

jQuery.each(files, function (k) {
data.append("file_" + k, this);
});

data.append("total", files.length);
data.append('option', 'com_ajax');
data.append('module', 'uploadschedule');
data.append('format', 'json');

jQuery.ajax({
processData: false,
contentType: false,
dataType: "json",
method: "POST",
data: data,
success: function (result) {
// code
}
});

Получить файлы
Код: php
$app = JFactory::getApplication();

$total = $app->input->getInt('total', 0);

for($i = 0; $i < $total; $i++)
{
    $file = $app->input->files->get(
        'file_' . $i, null, 'array'
    );

    if(empty($file))
    {
        continue;
    }

    print_R($file);
}
Занимаюсь создание расширений для Joomla 3.10.x и 4.2.x | Доработка и настройка сайтов. Занимаюсь создание Интернет магазинов с нуля на собственном компоненте + оптимизация загрузки страницы (после предоставляю техподдержку).
Работа с DOM деревом на PHP
*

hemicide

  • Осваиваюсь на форуме
  • 29
  • 0 / 0
Спасибо большое Вам за помощь. Думаю с избытком решили мою проблему!
*

sivers

  • Живу я здесь
  • 2464
  • 336 / 0
Отправить файл
Кстати, может сработать еще вариант, если сделать name, заканчивающимся на [].
Код
<input type="file" id="files" name="jform[files][]" multiple="multiple">
Тогда это data.append("file_" + k, this); не понадобится.
На связи в telegram @sivers
sivers @ inbox . ru
https://sivers.su/
*

hemicide

  • Осваиваюсь на форуме
  • 29
  • 0 / 0
Кстати, может сработать еще вариант, если сделать name, заканчивающимся на [].
Да, сработало. Теперь и в $_FILES и в $files  = $input->files->get('jform'); все файлы без ручного аппенда
« Последнее редактирование: 24.10.2020, 10:21:26 от hemicide »
*

imanager

  • Новичок
  • 9
  • 0 / 1
Помогите почему AJAX не отправляет файл ?
tmpl/default.php
« Последнее редактирование: 12.04.2022, 12:57:32 от imanager »
*

NewUsers

  • Живу я здесь
  • 2307
  • 215 / 0
  • +375 (25) 627-16-99 (WhatsApp, Telegram)
Помогите почему AJAX не отправляет файл ?
Для начала уточните: именно файл не отправляется или вы его принять не можете?

Вы отправляете файл
Код: js
data.append("files",files);
Значит вы и принять его должны правильно!
Код: php
$files  = $input->files->get('files');
Если отправляете несколько файлов сразу, то пример отправки и приема есть чуть выше
Занимаюсь создание расширений для Joomla 3.10.x и 4.2.x | Доработка и настройка сайтов. Занимаюсь создание Интернет магазинов с нуля на собственном компоненте + оптимизация загрузки страницы (после предоставляю техподдержку).
Работа с DOM деревом на PHP
*

imanager

  • Новичок
  • 9
  • 0 / 1
И ТО И ДРУГОЕ вобще не понятно! файл загружается по json или raw должен ??
поделитесь рабочим модулем
*

imanager

  • Новичок
  • 9
  • 0 / 1
могу денег закинуть немного)
*

sivers

  • Живу я здесь
  • 2464
  • 336 / 0
И ТО И ДРУГОЕ вобще не понятно! файл загружается по json или raw должен ??
для начала он должен отправляться. открывайте консоль браузера и в сети  смотрите пост-запрос, который AJAX генерит, на предмет - есть ли в нем файл (поток двоичных данных трудно спутать, да и по весу запроса можно понять).
На связи в telegram @sivers
sivers @ inbox . ru
https://sivers.su/
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Документация по разработки компонента для Joomla 3.x

Автор Aspik

Ответов: 9
Просмотров: 2900
Последний ответ 23.01.2021, 07:55:56
от hmr
Применение ajax (Аякс) в модуле Joomla

Автор tm2010

Ответов: 34
Просмотров: 3961
Последний ответ 26.09.2020, 09:38:35
от b2z
Автоматическая отправка в архив по дате

Автор Санчо

Ответов: 16
Просмотров: 1943
Последний ответ 19.09.2020, 23:09:00
от Санчо
ajax проверку на вход. В стандартном модуле входа?

Автор Dolphin4ik_1

Ответов: 4
Просмотров: 472
Последний ответ 23.07.2020, 15:03:57
от sivers
Обработка AJAX в компоненте Joomla!3

Автор balancer

Ответов: 33
Просмотров: 10341
Последний ответ 23.07.2020, 07:45:53
от Dolphin4ik_1