Новости Joomla

Свои типы полей в Joomla.Это большая тема, о которой можно говорить очень много

Свои типы полей в Joomla.Это большая тема, о которой можно говорить очень много

👩‍💻 Свои типы полей в Joomla.Это большая тема, о которой можно говорить очень много. Самое главное, что возможности применения ограничиваются только вашей больной фантазией. Вы строите интерфейс своего модуля или плагина и вам нужно подтянуть данные из сторонней системы (список чего-нибудь по какому-нибудь API), чтобы сохранить выбранный id в Joomla. Или сделать какую-то проверку и в зависимости от неё показать то или иное сообщение пользователю. Для этого подойдут свои пользовательские типы полей. Интерфейс Joomla по большей части описан в XML-файлах. У каждого из них свои параметры. Некоторые не описаны в документации (manual.joomla.org), поэтому самым любопытным будет полезно заглянуть в собственно файлы фреймворка по пути

libraries/src/Form/FormField.php, а так же в
libraries/src/Form/Fields. У каждого класса поля перечислены его специфические свойства, которые можно описывать в XML. А в своём типе поля вы можете устанавливать эти значения программно. В моём модуле WT Quick links под капотом происходят изменения. Теперь для работы (в админке) ему нужен вспомогательный плагин. А в самом модуле нам бы проверить, а не выключен ли он? В Joomla есть тип поля Note - заметка. Его можно использовать для вывода примечаний.

<field type="note"     name="your_note_for_user"     label="Заголовок примечания"     title="Альтернативный способ для заголовка"     description="Текст примечания"     class="col-12 alert alert-info"     heading="h1"     close="true"/>
heading - указывать уровень заголовка.
close - позволяет закрыть это примечание. В классе поля
libraries/src/Form/Field/NoteField.php описана логика вывода. И в принципе оно нам подходит для нашей задачи. Но оно будет выводить сообщение всегда, а нам нужно только тогда, когда плагин отключён.Поэтому берём и создаём свой класс поля, который мы унаследуем от
NoteField. Это значит, что у нас в руках будет весь инструментарий стандартного поля
Note + то, что мы сами добавим. В XML-манифест добавляем наше поле
<field type="systempluginstatus"      name="systempluginstatus"     addfieldprefix="Joomla\Module\Wtquicklinks\Site\Fields"/>
-
type - имя файла и класса,-
addfieldprefix - указываем namespace к нашему классу, может быть любой нам нужный-
name - нельзя полю без имени...Это означает, что Joomla будет использовать класс поля из файла
modules/mod_wt_quick_links/src/Fields/SystempluginstatusField.php.А в классе поля будет написано следующее:
<?php// namespace для атрибута addfieldprefixnamespace Joomla\Module\Wtquicklinks\Site\Fields;// нельзя напрямую обращаться к этому файлуdefined('_JEXEC') or die;// подключаем родительский класс для переопределенияuse Joomla\CMS\Form\Field\NoteField;use Joomla\CMS\Language\Text;use Joomla\CMS\Plugin\PluginHelper;// имя класса и имя файла точь-в-точьclass SystempluginstatusField extends NoteField{     protected $type = 'Systempluginstatus';     protected function getLabel()          {               // если плагин не включён               if(PluginHelper::isEnabled('system','wtquicklinks')) {                    // меняем свойства родительского класса                    $this->class = 'alert alert-danger w-100';                    $this->element['label'] = '⚠️ А-а-а-а!';                    $this->element['description'] = 'Плагин не включён!!';                    // и просто рендерим его с нашими свойствами                    return parent::getLabel();               }          // А иначе всё хорошо, скрываем поле из виду.          $this->parentclass = 'd-none';          return '';     }}
Просто и удобно. И людям приятно, что о них позаботились и рассказали почему что-то не работает.@webtolkru#joomla #php #webdev #разработка

Обновлена информация в Плане развития Joomla

👩‍💻 Обновлена информация в Плане развития Joomla.Здесь собрана информация о датах релизов, описаны принципы версионирования, указаны ответственные за релизы, а так же даты окончания поддержки релизов. Опираясь на эту информацию вы можете планировать развитие ваших интернет-проектов.👩‍💻 Что нового?⛔️ Joomla 4.Дата окончания исправления ошибок безопасности в версии 4.x - 14 октября 2025г. ⚠️ После этой даты Joomla 4 прекратит получать какие-либо обновления, в том числе безопасности - вообще. Рекомендуем обновить ваши сайты до актуальной Joomla 5.✅ Joomla 5.- Дата окончания исправления ошибок в версии 5.x - 13 октября 2026г.- Дата окончания исправления ошибок безопасности в версии 5.x - 12 октября 2027 года.- Текущая актуальная (на момент написания заметки) версия - 5.3.1.- Опубликовано расписание выхода релизов Joomla 5.4. Стабильный релиз ожидается 14 октября 2025 года.✅ Joomla 6.- Дата окончания исправления ошибок в версии 6.x - 17 октября 2028г.- Дата окончания исправления ошибок безопасности в версии 6.x - 16 октября 2029г.- Опубликовано расписание выхода релизов Joomla 6.0. Стабильный релиз ожидается 14 октября 2025 года.- Для разработчиков уже доступна Joomla 6.0.0-alpha1.✅ Joomla! Framework.Обновлена информация о Joomla! Framework - полноценном PHP-фреймворке для разработки. Он в версиях 1.х и 2.х был самостоятельным параллельным проектом, однако начиная с версии Joomla 4.0 стал её основой. Добавлена информация о Joomla! Framework 3.x, который вышел 6 октября 2023 года. Его можно использовать в тех случаях, когда вам в проекте не нужна CMS Joomla целиком.Подробнее на сайте Joomla-сообщества Joomlaportal.ru#joomla #community

Компания JetBrains рассказала о своей поддержке Joomla

Компания JetBrains рассказала о своей поддержке Joomla

JetBrains - один из мировых лидеров в разработке программного обеспечения для разработчиков. Её программные продукты - это IDE - профессиональные среды разработки, которые отличаются от простого блокнота/редактора с плагинами набором всевозможных инструментов для разработчиков, глубоким анализом кодовой базы, подсказками по ней и по языку программирования, отладкой ошибок и многим-многим другим. Одним из самых известных продуктов компании является IDE PHP Storm, который можно назвать отраслевым стандартом PHP-разработчика.

В статье How PhpStorm Helps Maintain PHP Open-Source Projects: Interviews and Real-World Examples в блоге компании описываются Open Source проекты, которым JetBrains оказывает поддержку (это могут быть бесплатные лицензии для разработчиков для некоммерческих проектов).

В список попали:

  • PHPUnit - фреймворк для unit-тестирования в PHP
  • Doctrine DBAL - библиотека для PHP, которая предоставляет лёгкий и гибкий слой для коммуникации с базой данных. Она поддерживает различные базы данных через единый и согласованный API.
  • CodeIgniter — популярный MVC-фреймворк для разработки на PHP
  • Joomla! - наша любимая CMS.

Эти названия (кроме "Joomla") чаще всего не слышат вебмастера и разработчики обычных сайтов и интернет-магазинов. Но эти названия хорошо знакомы PHP-разработчикам, которые создают сложные и высоконагруженные проекты и микросервисы. То, что Joomla оказалась в одном ряду с такими программными инструментами - делает ей честь.

🙏 За ссылку спасибо участнику нашего сообщества Ринату Кажетову (@rkazhet).

Подпишитесь на @joomlafeed

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

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
Просмотров: 3171
Последний ответ 23.01.2021, 07:55:56
от hmr
Применение ajax (Аякс) в модуле Joomla

Автор tm2010

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

Автор Санчо

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

Автор Dolphin4ik_1

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

Автор balancer

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