Разрботка расширений для CMS Joomla
Шрифт:
Записи выводятся в таблице, для которой задан CSS-класс adminlist. Все заголовки таблицы, кроме первого, - это обычный текст. Первый заголовок является чекбоксом и используется для одновременного выделения всех отображенных записей.
Затем начинается цикл для вывода самих записей. Значение переменной $k меняется с 0 на 1 и обратно для того, чтобы переключаться между различными классами CSS для четных и нечетных строк, имеющими немного различающиеся свойства фона. С помощью вызова функции JHTML::_('grid.id') мы получаем HTML-код для чекбокса, который будет обрабатываться с
Для каждого вопроса и ответа выводятся первые maxlen символов вместо его текста целиком. При этом с помощью функции strip_tags отбрасываются теги, чтобы предотвратить ситуацию, когда граница обрезки текста может оказаться внутри тега.
Для перехода к форме ответа на вопрос для каждой записи выводится гиперссылка, которая пропускается через функцию JFilterOutput::ampReplace, заменяющую амперсанды "&" на коды "&" в соответствии со спецификацией XHTML. Для подключения класса JFilterOutput в код вставлена строка jimport('joomla.filter.output').
Перед закрывающим тегом </form> расположены три скрытых элемента. Option и task были рассмотрены при анализе формы для ответа на вопрос. Значение boxchecked заключается в следующем. Когда пользователь ставит флажок в каком-либо из чекбоксов, значение boxchecked меняется на 1. Значение boxchecked, равное 0, возвращается, когда ни один из чекбоксов не отмечен. С помощью этого значения JavaScript обрабатывает список.
Для обработки случая, когда не выбрано никакой задачи, измените код переключателя switch в файле admin.myquestions.phpследующим образом:
switch($task) { case 'reply': replyToQuestion($option); break; case 'save': case 'apply': saveQuestion($option, $task); break; default: showQuestions($option); break; }
Добавьте в файл /administrator/language/ru-RU/ru-RU.com_myquestions.iniстроку:
COM_MYQUESTIONS_DATE_NOT_DEFINED="Дата не задана"
Теперь при загрузке ссылка: http://localhost/joomla/administrator/index.php?option=com_myquestionsдолжна появиться страница, как на рис. 2.4.
(есть увеличенное изображение)
Рис. 2.4. Список вопросов
Удаление записей
Добавьте следующий оператор case в переключатель switch в файле admin.myquestions.php:
case 'remove': removeQuestions($option); break;
Также добавьте функцию removeQuestions:
function removeQuestions($option) { global $app; $cid = JRequest::getVar('cid', array, '', 'array'); $db =& JFactory::getDbo; if(count($cid)) { $cids = implode(',', $cid); $query = "DELETE FROM #__myquestions WHERE id IN ($cids)"; $db->setQuery($query); if (!$db->query) { echo "<script> alert('".$db->getErrorMsg."'); window.history.go(-1); </script>\n"; } } $app->redirect('index.php?option=' . $option, JText::_('COM_MYQUESTIONS_QUESTION_DELETED')); }
Если в массиве cid есть элементы, то составляется строка из идентификаторов, разделенных запятыми, которая затем используется для построения запроса удаления соответствующих записей. В данном случае нельзя использовать метод JTable::delete,
Добавьте в файл /administrator/language/ru-RU/ru-RU.com_myquestions.iniстроку:
COM_MYQUESTIONS_QUESTION_DELETED="Вопрос(ы) успешно удален(ы)"
Ключевые термины
JDatabase - абстрактный класс, предоставляющий доступ к соединению с базой данных, создающемуся при инициализации приложения Joomla. JDatabaseQuery - класс, методы которого совпадают с ключевыми словами языка SQL и позволяют упростить создание сложных SQL-запросов. JTable - класс, реализующий паттерн Active Record и использующийся для управления таблицами базы данных. Префикс таблиц базы данных - строка, которая присоединяется к названию каждой таблицы Joomla в базе данных. Реальный префикс - то конкретное сочетание символов, которое используется в названиях таблиц базы данных. Связывание - процесс присвоения каждому полю производного от JTable класса значения элемента массива переменных запроса, так что ключ элемента совпадает с названием поля. Символический префикс - сочетание "#__" (решетка и два знака подчеркивания), которое используется в запросах вместо реального префикса.
Краткие итоги
При работе с базой данных различают реальный и символический префиксы. Реальный префикс используется в названиях таблиц базы данных, а символический префикс ("#__") используется в запросах вместо реального префикса. При обработке запроса вместо символического префикса будет автоматически подставлен реальный.
Чтобы выполнить запрос к базе данных Joomla, необходимо осуществить пять операций: получение ссылки на объект JDatabase (абстрактный класс, предоставляющий доступ к соединению с базой данных), формирование запроса, задание запроса, выполнение запроса, загрузка результата.
Запрос может быть сформулирован в виде строки либо разбит на составляющие и построен с помощью методов класса JDatabaseQuery.
Запрос задается для последующего выполнения методом setQuery, а выполняется либо методом query, либо, если нам необходимо получить результат, одним из методов для получения форматированного результата: loadResult, loadRow и т.д.
Для каждой таблицы, использующейся расширением, необходимо создать класс, производный от JTable. Для каждого поля таблицы необходимо создать одноименное поле этого класса. Производный от JTable класс наследует в числе прочих методы bind, store, load и delete, позволяющие управлять записями таблицы без единой строки SQL-кода. Когда компонент получает массив переменных запроса, он осуществляет связывание, то есть присваивает каждому полю этого класса значение элемента массива, ключ которого совпадает с названием данного поля.
Существуют методы класса JTable для управления часто используемыми полями ordering, checked_out/checked_out_time, published и hits.
Вопросы
Что такое реальный и символический префиксы?
Какие операции необходимо осуществить для выполнения запроса к базе данных Joomla?
Каким образом может быть сформулирован SQL-запрос?
Какие методы задают и выполняют запрос?
Для чего создается производный от JTable класс?
В чем заключается связывание?