- Введение
- Просмотр списка в
default.php
- Файл Javascript
myview.js
- Серверный скрипт-обработчик
- CSS
- Результат
Введение
Этот рецепт рассматривается для компонента, у которого есть список данных, который больше похож на электронную таблицу, чем на таблицу базы данных. Некоторые ячейки содержат простое содержимое, такое как значения "Да
" / "Нет
", которые необходимо время от времени изменять, часто ежедневно. Форма ввода данных содержит множество полей, расположенных на нескольких вкладках, и очень утомительно открывать форму, находить нужное поле на нужной вкладке и менять "Нет
" на "Да
" и наоборот. Пользователям нужен был простой способ внесения таких изменений. Нажмите "Нет
", чтобы изменить его на "Да
" в таблице данных. В списке статей Joomla есть что-то похожее на изменение Опубликованных на Неопубликованные или Показанных на Непубликованные. Однако это также приводит к перезагрузке страницы, что нежелательно для изменения "Да
" / "Нет
", поскольку это приводит к потере позиции в таблице, с которой работает пользователь.
Вот отрывок из таблицы представления списка:
Просмотр списка в default.php
Именно сюда идет код для загрузки файла Javascript в верхней части:
/** @var Joomla\CMS\WebAsset\WebAssetManager $wa */ $wa = $this->document->getWebAssetManager(); $wa->useScript('com_mycompoent.myview');
И далее по коду для кнопок переключения. Это один из примеров:
<td class="text-center"> <button id="onhold_<?php echo $item->id;?>" class="yntoggle btn btn-sm btn-secondary"> <?php echo Text::_($yesno[$item->on_hold]); ?> </button> </td>
Файл Javascript myview.js
Файл Javascript нуждается в прослушивателе событий для каждой кнопки переключения и асинхронной функции для взаимодействия с сервером:
// ===== Yes/No toggle ===== let toggles = document.getElementsByClassName('yntoggle'); if (toggles) { for (let i = 0; i < toggles.length; i++) { toggles[i].addEventListener('click', toggler, false); } } async function toggler(event) { event.preventDefault(); let tds = document.querySelectorAll('td.update-ok'); tds && tds.forEach(function (item, index) { item.classList.remove('update-ok'); }); tds = document.querySelectorAll('td.update-dud'); tds && tds.forEach(function (item, index) { item.classList.remove('update-dud'); }); let id = this.id; let parts = id.split('_'); let td = this.closest('td'); let oldvalue = this.textContent.trim; const token = Joomla.getOptions('csrf.token', ''); const url = 'index.php?option=com_mycomponent&task=myview.yntoggle&' + token + '=1'; let data = new URLSearchParams(); data.append(`field`, parts[0]); data.append(`item_id`, parts[1]); data.append(`oldvalue`, oldvalue); const options = { method: 'POST', body: data } let response = await fetch(url, options); if (!response.ok) { td.classList.add('update-dud'); throw new Error (Joomla.Text._('COM_MYCOMPONENT_JS_ERROR_STATUS') + `${response.status}`); } else { let result = await response.text(); this.textContent = result; td.classList.add('update-ok'); } }
Серверный скрипт-обработчик
Этот код находится в файле src/Controller/MyviewController.php
. Некоторые чувствительные части запроса были оставлены здесь, и он был унаследован от Joomla 3 и не совсем подходит для Joomla 4.
public function yntoggle() { Session::checkToken( 'post' ) or die( 'Срок действия вашей сессии истек! Попробуйте перезагрузить страницу!'); //|Недопустимый токен' ); $app = Factory::getApplication(); $item_id = $app->input->get('item_id', 0, 'int'); if (empty($item_id)) { die( 'NOTOK #1'); } $field = $app->input->get('field', '', 'word'); $oldvalue = $app->input->get('oldvalue', '', 'word'); // проверьте, есть ли разрешенные вещи для переключения $db = Factory::getDbo(); $query = $db->getQuery(true); ... $db->execute(); // get the updated value $query = $db->getQuery(true); ... $db->setQuery($query); $new_value = $db->loadResult(); exit($new_value ? 'Yes' : 'No'); }
CSS
Немного, но css необходимо, чтобы показать, что запрос был выполнен и возвращен результат:
.update-ok { background-color: #eeffee !important; background-image: url(tick-12.png) !important; background-repeat: no-repeat !important; background-position: 95% 0 !important; border-color: #009900 !important; } .update-dud { background-color: #ffeeee !important; background-image: url(cross-12.png) !important; background-repeat: no-repeat !important; background-position: 95% 0 !important; border-color: #990000 !important; }
Результат
В итоге получаем рабочий инструмент для работы с простыми таблицами в Joomla 4 без перезагрузки страницы и изменения простых переключателей в один клик!
Перевод с английского официальной документации по Joomla 4:
https://docs.joomla.org/Joomla_4_Tips_and_Tricks:_Data_Table_Toggles
Заберите ссылку на статью к себе, чтобы потом легко её найти!
Раз уж досюда дочитали, то может может есть желание рассказать об этом месте своим друзьям, знакомым и просто мимо проходящим?
Не надо себя сдерживать! ;)