Новости Joomla

Joomla 6 нуждается в вашей помощи с тестированием.Вышел недавно релиз Joomla 6 alpha1

Joomla 6 нуждается в вашей помощи с тестированием.Вышел недавно релиз Joomla 6 alpha1

👩‍💻 Joomla 6 нуждается в вашей помощи с тестированием.Вышел недавно релиз Joomla 6 alpha1. Это релиз, в который включены уже проверенные изменения, но ещё очень многие исправления и улучшения ждут своей очереди. Joomla следит за качеством и безопасностью своего кода и каждое изменение должно быть успешно протестировано как минимум ещё двумя участниками сообщества. Разработка Joomla ведётся на платформе GitHub.Филипп Уолтон (Philip Walton) - один из разработчиков, кто активно вносит свой вклад в ядро Joomla. Он уже несколько месяцев посвящает свои послеполуденные часы пятницы работе с Joomla и предлагает присоединиться к нему. 📆 Пятница, 30 мая 2025, с 15:00 до 17:00 по UTC (Лондон) - с 18:00 до 20:00 по Москве.В чате Google Meet Филипп готов помочь с тестированием тем, кто будет делать это в первый раз. А так же он подготовил список лёгких Pull Request, которые можно протестировать довольно быстро. Чем больше тестов будет проведено сейчас, тем меньше ошибок вылезет потом. На данный момент 148 (уже 147 на момент написания заметки) PR на GitHub Joomla ждут тестирования.👩‍💻 Open to all. All together.Также вам поможет сделать первые шаги это видео.GitHub JoomlaДа, это вечер пятницы. Но тестирование занимает порой минут 15, а доброе дело сделано. Просто убедитесь, что разработчик чего-то не пропустил и всё работает как ожидается.#joomla #joomla6 #community

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

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

  • Живу я здесь
  • 2578
  • 357 / 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

  • Живу я здесь
  • 2578
  • 357 / 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

  • Живу я здесь
  • 2578
  • 357 / 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

  • Живу я здесь
  • 2578
  • 357 / 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

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

NewUsers

  • Живу я здесь
  • 2310
  • 216 / 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 4.2.x | Доработка и настройка сайтов. Занимаюсь создание Интернет магазинов с нуля на собственном компоненте + оптимизация загрузки страницы (после предоставляю техподдержку).
*

hemicide

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

sivers

  • Живу я здесь
  • 2578
  • 357 / 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

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

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

imanager

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

imanager

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

sivers

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

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

Автор Aspik

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

Автор tm2010

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

Автор Санчо

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

Автор Dolphin4ik_1

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

Автор balancer

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