Переключатели в таблице с данными админки Joomla 4 для внесения прямых изменений в данные списка

  1. Введение
  2. Просмотр списка в default.php
  3. Файл Javascript myview.js
  4. Серверный скрипт-обработчик
  5. CSS
  6. Результат


Введение

Этот рецепт рассматривается для компонента, у которого есть список данных, который больше похож на электронную таблицу, чем на таблицу базы данных. Некоторые ячейки содержат простое содержимое, такое как значения "Да" / "Нет", которые необходимо время от времени изменять, часто ежедневно. Форма ввода данных содержит множество полей, расположенных на нескольких вкладках, и очень утомительно открывать форму, находить нужное поле на нужной вкладке и менять "Нет" на "Да" и наоборот. Пользователям нужен был простой способ внесения таких изменений. Нажмите "Нет", чтобы изменить его на "Да" в таблице данных. В списке статей Joomla есть что-то похожее на изменение Опубликованных на Неопубликованные или Показанных на Непубликованные. Однако это также приводит к перезагрузке страницы, что нежелательно для изменения "Да" / "Нет", поскольку это приводит к потере позиции в таблице, с которой работает пользователь.

Вот отрывок из таблицы представления списка:

Вот отрывок из таблицы представления списка в админке Joomla 4

Просмотр списка в 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 без перезагрузки страницы и изменения простых переключателей в один клик!

Перевод с английского официальной документации по Joomla 4:
https://docs.joomla.org/Joomla_4_Tips_and_Tricks:_Data_Table_Toggles

Заберите ссылку на статью к себе, чтобы потом легко её найти!
Раз уж досюда дочитали, то может может есть желание рассказать об этом месте своим друзьям, знакомым и просто мимо проходящим?
Не надо себя сдерживать! ;)

Старт! Горячий старт на просторы интернета
Старт! Горячий старт на просторы интернета
Старт! Меню