Набросал вам примерный вариант, можно это собрать в отдельный модуль, но не стал, для наглядности понимания
Для работы потребуется подключенная библиотека jQuery, далее пошагово с кодом
1 - в папке \templates\ваш шаблон\html\mod_custom создать файл testbtn.php (в кодировке UTF-8) следующего содержания
<?php
defined('_JEXEC') or die;
$db = JFactory::getDBO();
$query = 'select * from #__testbtn';
$db->setQuery($query);
$rows = $db->loadObjectList();
// если юзер авторизован - добавим класс позволяющий менять статус
$user = JFactory::getUser();
$js_class = '';
if ($user->id) {
$js_class = 'js_testbtn';
}
?>
<div class="testbtn_wrapper">
<?php foreach ($rows as $row) {
if ($row->status == '1') {
$status = 'active';
} else {
$status = 'noactive';
}
?>
<a href="#" class="<?php echo $js_class; ?> testbtn <?php echo $status; ?>"
data-status="<?php echo $row->status; ?>"
data-id="<?php echo $row->id; ?>"
>
<?php echo $row->title; ?></a>
<?php } ?>
<div class="testbtn_result"></div>
</div>
2 - в вашем файле где всякий JS код пишите (внутри объекта jquery), в блоке $.ajax({ параметр url дописываете название своего шаблона вместо моей заглушки
$(document).on('click', '.js_testbtn', function() {
// сразу переключим класс
$(this).toggleClass('active');
// получим ID и новый статус объекта
var thisstatus = $(this).attr('data-status');
var thisid = $(this).attr('data-id');
// проверим текущий статус и изменим на противоположный, можно и на сервере делать
var newstatus = '';
if (thisstatus == 0) {
newstatus = 1;
} else {
newstatus = 0;
}
$(this).attr('data-status', newstatus);
// соберем в массив наши данные
var fd = new FormData();
fd.append('newstatus', newstatus);
fd.append('thisid', thisid);
// отправим на сервер и получим ответ
$.ajax({
url: 'templates/ваш шаблон/ajax.php',
data: fd,
contentType:false,
processData:false,
type:'POST',
success: function(response){
// выведем сообщение
$('.testbtn_result').text('Статус кнопки с ID "'+ thisid +'" обновлен, новый: '+thisstatus);
}
});
});
3 - в корневую папку шаблона кладете файл AJAX.php (в нижнем регистре, это форум меняет автоматом, регистр важен!) с кодом
<?php
// подключим фреймворк движка
define( '_JEXEC', 1 );
header('Content-Type: text/html; charset=utf-8');
if ( file_exists( __DIR__ . '/defines.php' ) ) {
include_once __DIR__ . '/defines.php';
}
if ( !defined( '_JDEFINES' ) ) {
define( 'JPATH_BASE', __DIR__ . '/../../' );
require_once JPATH_BASE . '/includes/defines.php';
}
require_once JPATH_BASE . '/includes/framework.php';
// получим данные
$id = JRequest::getVar( 'thisid', '', 'post' );
$status = JRequest::getVar( 'newstatus', '', 'post' );
// обновим в базе
$db = JFactory::getDBO();
$query = '
update #__testbtn
set status = "'.$status.'"
where id = '.$id.'
';
$db->setQuery( $query );
$db->query();
?>
4 - (необязательно) немного стилей для оформления
/* test btn */
.testbtn {
display: inline-block; margin: 0 20px 0 0;
padding: 10px 15px; text-align: center;
background: #002b41; color: #fff;
}
.testbtn:hover {
background: #002b41; color: #fff;
}
.testbtn.active {
background: #fe2a00; color: #000;
}
.testbtn_result {
margin: 30px 0 0 0;
}
5 - в базе данных создаете таблицу с данными кнопок (в режиме sql запроса просто выполнить код)
CREATE TABLE `jt_testbtn` (
`id` int(11) NOT NULL,
`title` varchar(255) NOT NULL,
`status` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--
-- Дамп данных таблицы `jt_testbtn`
--
INSERT INTO `jt_testbtn` (`id`, `title`, `status`) VALUES
(1, 'Тестовая кнопка 1', 0),
(2, 'Тестовая кнопка 2', 0);
6 - создаете в админке модуль типа произвольный HTML, публикуете в нужной позиции, в настройках модуля в вкладке "дополнительные параметры" указываете шаблон testbtn
Все, теперь в указанной позиции будут выводиться кнопки исходя из количества записей в нашей таблице БД. Если статус 0 - значит типа неактивна, будет черная по умолчанию. Гости ничего менять не могут. Любой зарегистрированный юзер при клике сразу меняет отображение стиля кнопки и отправляет запрос в БД на изменение статуса.
0 - неактивно
1 - активно
Под кнопками есть пустой блок для текста возращаемого результата, как пример работы.