Новости Joomla

👩‍💻 События плагинов и порядок их срабатывания при работе с пользовательскими полями Joomla и использовании FieldsHelper.

👩‍💻 События плагинов и порядок их срабатывания при работе с пользовательскими полями Joomla и использовании FieldsHelper.

В процессе работы с Joomla бывает необходимо работать с пользовательским интерфейсом более тонко, чем обычно. Все формы Joomla состоят из стандартных полей, содержанием, стилем отображения, состоянием (включено/выключено, доступно для редактирования или нет и т.д.) можно управлять с помощью плагинов. Да и для нестандартных проектов хорошей практикой является создание одного системного или нескольких плагинов групп "под проект", в которых храниться весь "нестандарт".

В этой статье описаны все триггеры, которые вызываются через Event Dispatcher из administrator/components/com_fields/src/Helper/FieldsHelper.php, с привязкой к жизненному циклу (порядку этапов работы запроса), аргументам, изменяемым данным и дальнейшему распространению по Joomla. Это поможет вам работать с Joomla свободнее и не опасаясь при этом потерять изменения при очередном обновлении движка.

Подходы, описанные в статье, полезны в тех случаях, когда вы работаете с данными в com_fields - механизме создания и редактирования пользовательских полей ядра Joomla и при использовании FieldsHelper. Многие сторонние компоненты не используют эту возможность, поэтому данная статья будет полезна лишь частично.

🏆 Открыто голосование за Joomla в премии CMS Critic People’s Choice Awards 2025

🏆 Открыто голосование за Joomla в  премии CMS Critic People’s Choice Awards 2025

🗓 Голосование продлится до 27 февраля 2026 года.

👩‍💻 Проголосовать! 👩‍💻

Номинации, в которых можно проголосовать за Joomla:
⭐️ Best Free CMS
⭐️ Best Open Source CMS
⭐️ Best Enterprise CMS

Также в номинации Best e-Commerce Solution участвуют компоненты интернет-магазинов для Joomla:
⭐️ HikaShop
⭐️ Virtuemart

В номинации Best Website Builder оказались:
⭐️ YooTheme
⭐️ SP Page Builder

Что такое CMS Critic Awards?
С 2012 года премия CMS Critic Awards занимает особое место в сообществе систем управления контентом (CMS). Это единственный в своем роде сайт, который составляет рейтинг системы управления контентом и связанных с ними решений на рынке — от малого до крупного и подчеркивает их инновации и услуги.

Каждый год награда CMS Critic Awards присуждается одному победителю в различных отраслевых категориях, таких как: «Лучшая облачная CMS», «Лучший DXP», «Лучшая Headless CMS и других. Затем результаты оглашаются через СМИ вместе с выбором редакции CMS Critic.
В этом году премия вернулась к своим традициям и только TOP-5 движков по количеству номинаций попали в 2-й этап - голосование.

@joomlafeed

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

master-smeta

  • Захожу иногда
  • 298
  • 10 / 0
Обработка данных из базы
« : 13.05.2015, 10:12:52 »
Здравствуйте. У меня возникла проблема с динамическими выпадающими списками. В моей форме используются выпадающие списки, в которые загружаются данные из базы, как описано в инструкции: https://www.rsjoomla.com/support/documentation/view-article/94-auto-populate-a-list-from-a-table.html
Код
//<code>
// Prepare the empty array
$items = array();
// Prepare the database connection
$db = JFactory::getDbo();
// Keep this if you'd like a "Please select" option, otherwise comment or remove it
$items[] = "|Please Select[c]";
 
// Run the SQL query and store it in $results
$db->setQuery("SELECT your_value, your_label FROM #__your_table");
$results = $db->loadObjectList();
 
// Now, we need to convert the results into a readable RSForm! Pro format.
// The Items field will accept values in this format:
// value-to-be-stored|value-to-be-shown
// Eg. m|M-sized T-shirt
foreach ($results as $result) {
  $value = $result->your_value;
  $label = $result->your_label;
  $items[] = $value.'|'.$label;
}
 
// Multiple values are separated by new lines, so we need to do this now
$items = implode("\n", $items);
 
// Now we need to return the value to the field
return $items;
//</code>
Проблема в том, что выпадающих списков в форме несколько десятков, и при загрузке страницы они создают огромную нагрузку на сервер.
Решить проблему просто - нужно загрузить данные из базы один раз при загрузке формы, а затем передать их в выпадающие списки, чтобы сделать выборку полученных данных из массива. Но у меня не получается это сделать. Я могу добавить скрытое поле в которое будут загружены данные из базы данных, но как эти данные передать в выпадающий список?

P.S. Задача состоит в следующем: 1) Есть таблица БД с расписанием занятий.
2) Есть форма записи на курсы. Пользователю доступен выпадающий список с названием курсов. Он выбирает курс и появляется дополнительный список, в котором можно выбрать конкретную дату обучения на выбранном курсе.
3) Т.к. заранее не известно, какой курс выберет пользователь, то все расписания загружаются заранее и просто скрыты.
« Последнее редактирование: 13.05.2015, 11:59:32 от master-smeta »
*

SeBun

  • BanMaster
  • 4030
  • 259 / 5
  • @SeBun48
Re: Обработка данных из базы
« Ответ #1 : 13.05.2015, 11:36:53 »
Мне кажется не особо вам поможет то, что вы хотите сделать. На нагрузку большей частью влияют не запросы, они выполняются долю секунды. Нагрузку у вас создают циклы, формирующие массивы для списков, а потом такие же циклы, формирующие сами списки, особенно если их несколько десятков.

По сабжу:
Код
$db->setQuery("SELECT your_value, your_label FROM #__your_table");
$results = $db->loadObjectList();
Здесь у вас делается запрос в базу и создается объект, содержащий результат этого запроса. Можете продублировать для всех ваших запросов и создать несколько объектов.
Код
foreach ($results as $result) {
  $value = $result->your_value;
  $label = $result->your_label;
  $items[] = $value.'|'.$label;
}
Чтение из объекта в массив. Так же можно продублировать для каждого вашего запроса. Как раз такой цикл и будет жрать ресурсы сервака. И чем их больше, тем хуже.

Как передать странице данные? Вопрос не понял, так как форма формируется на стороне сервера, набивается данными и отдается клиенту.
 
Пример:
Код
$db->setQuery("SELECT your_value, your_label FROM #__your_table");
$results_1 = $db->loadObjectList();
$db->setQuery("SELECT your_value, your_label FROM #__your_table2");
$results_2 = $db->loadObjectList();

foreach ($results_1 as $result) {
  $value = $result_1->your_value;
  $label = $result_1->your_label;
  $items[1][] = $value.'|'.$label;
}
foreach ($results_2 as $result) {
  $value = $result_2->your_value;
  $label = $result_2->your_label;
  $items[2][] = $value.'|'.$label;
}

Ну и далее создаете формы уже с использованием этого массива.

P.S. Не уверен, что такая конструкция вам поможет - циклы остаютя. Подумайте, можно ли как то оптимизировать выборку? Объем данных в базе одинаков, можно выборку засунуть в один цикл?
P.P.S. Писал на коленке, мог и ошибится )
« Последнее редактирование: 13.05.2015, 11:54:46 от sebun »
Оказываю услуги по Joomla | Миграция/Обновление | Сопровождение | IT-аутсорсинг | Недорогие домены и хостинг
*

master-smeta

  • Захожу иногда
  • 298
  • 10 / 0
Re: Обработка данных из базы
« Ответ #2 : 13.05.2015, 11:54:44 »
Код
$db->setQuery("SELECT your_value, your_label FROM #__your_table");
$results = $db->loadObjectList();
Здесь у вас делается запрос в базу и создается объект, содержащий результат этого запроса.
Да, это я знаю. Сейчас у меня такой код в каждом выпадающем списке (а их несколько десятков). Вот я и попытался получить все необходимые данные один раз, а уже потом передавать объект в списки и там его форычить этим:
Код
foreach ($results as $result) {
  $value = $result->your_value;
  $label = $result->your_label;
  $items[] = $value.'|'.$label;
}

Цитировать
Чтение из объекта в переменную. Так же можно продублировать для каждого вашего запроса. Как раз такой цикл и будет жрать ресурсы сервака. И чем их больше, тем хуже.
Т.е. нагрузку на сервер дает не выборка из базы (несколько десятков раз сразу), а непосредственно "форычинги" этого объекта?
Цитировать
Как передать странице данные? Хм, а вы уверены, что у пользователя такая страница загрузится и что данных не будет слишком много?
Ну, в данный момент страница загружается, но данных очень много. (дополнил первый топик, чтобы была понятнее задача).
Цитировать
В принципе я вижу решение этого вопроса в том, что вы создаете на сервере многомерный массив, в который загружаете все данные для ваших форм и отдаете его клиенту. А на стороне клиента создаются формы, которые получают данные из этого массива.
Так ведь и я это примерно так представляю. И массив создаю... Но вот передать этот массив никуда не получается
*

SeBun

  • BanMaster
  • 4030
  • 259 / 5
  • @SeBun48
Re: Обработка данных из базы
« Ответ #3 : 13.05.2015, 14:27:56 »
А вы поэкспериментируйте - поставьте временные метки в коде и посмотрите, что и сколько времени выполняется. Соберите в кучу все запросы к базе и все ваши циклы и засеките. И получите наглядную картину работы вашего кода.

По сабжу - можете сделать подгрузку на JQuery. Тут я лопух, так как сам в такой фиче нуждаюсь а язык так и не выучил. Пусть клиент получает страницу с формой, где подгружены только первые несколько строк в ваши селекты. Остальные подгружаются по мере листания списка.
Оказываю услуги по Joomla | Миграция/Обновление | Сопровождение | IT-аутсорсинг | Недорогие домены и хостинг
*

master-smeta

  • Захожу иногда
  • 298
  • 10 / 0
Re: Обработка данных из базы
« Ответ #4 : 13.05.2015, 14:39:12 »
А вы поэкспериментируйте - поставьте временные метки в коде и посмотрите, что и сколько времени выполняется. Соберите в кучу все запросы к базе и все ваши циклы и засеките. И получите наглядную картину работы вашего кода.

По сабжу - можете сделать подгрузку на JQuery. Тут я лопух, так как сам в такой фиче нуждаюсь а язык так и не выучил. Пусть клиент получает страницу с формой, где подгружены только первые несколько строк в ваши селекты. Остальные подгружаются по мере листания списка.
Дык и я лопух :) Даже не знаю как временные метки ставить и замерять время выполнения скриптов :)
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Re: Обработка данных из базы
« Ответ #5 : 13.05.2015, 15:40:31 »
Вне зависимости от того, показываете вы данные или нет, их все равно нужно загрузить, поэтому:
1. В случае, когда их много, лучше разбить форму на несколько:
1-я форма: вырать курс > обработчик > на основании ID курса загружается 2-я форма: выбрать дату и т.д.
Каждая страница (форма) требует сравнительно немного времени и, как следствие, пользователь не раздражается. А если вы еще и AJAX прикрутите, то будет эффект плавного хода.
2. Если данных не очень много, можно впихнуть данные в объект JavaScript'а (сразу на сервере или на основе скрытых полей) с ключами, равными значениям ID курсов и выводить в зависимости от выбранного ID и т.д.
Готового решения я вам, даже если захочу, дать не могу. Максимум - это простенький пример, но и на него сейчас нет времени.
Не будь паразитом, сделай что-нибудь самостоятельно!
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Вывод формы горизонтально ?

Автор warlocksp

Ответов: 5
Просмотров: 2270
Последний ответ 08.12.2016, 15:35:26
от DeniTornado
Автозаполнение полей формы

Автор 68pin

Ответов: 1
Просмотров: 1482
Последний ответ 15.06.2016, 17:06:35
от 68pin
Подставить значение одного поля в другое

Автор Agard

Ответов: 1
Просмотров: 1885
Последний ответ 09.01.2016, 12:53:48
от Agard
PDF разметка документа

Автор Agard

Ответов: 1
Просмотров: 1607
Последний ответ 31.12.2015, 17:58:57
от Agard
Формирование номера заявки/заказа в RSForm

Автор css_ufa

Ответов: 17
Просмотров: 10406
Последний ответ 28.12.2015, 23:29:53
от Agard