Литмир - Электронная Библиотека
Содержание  
A
A

Записи выводятся в таблице, для которой задан CSS-класс adminlist. Все заголовки таблицы, кроме первого, - это обычный текст. Первый заголовок является чекбоксом и используется для одновременного выделения всех отображенных записей.

Затем начинается цикл для вывода самих записей. Значение переменной $k меняется с 0 на 1 и обратно для того, чтобы переключаться между различными классами CSS для четных и нечетных строк, имеющими немного различающиеся свойства фона. С помощью вызова функции JHTML::_('grid.id') мы получаем HTML-код для чекбокса, который будет обрабатываться с помощью JavaScript.

Для каждого вопроса и ответа выводятся первые 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.

Разрботка расширений для CMS Joomla - _15.jpg

(есть увеличенное изображение)

Рис. 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 класс?

В чем заключается связывание?

Каким образом осуществляется управления часто используемыми полями?

Упражнения

Адаптируйте код из раздела " Практика" для своего варианта (см. список вариантов в дополнительных материалах).

Генерация элементов HTML (класс JHTML)

Лекция посвящена классу JHTML и поддерживающим классам. Рассмотрены методы для вывода элементов XHTML.

Цель лекции:Изучить готовые методы Joomla для генерации и отображения элементов XHTML и поведений JavaScript.

Основной метод класса JHTML

Joomla содержит методы для генерации и отображения элементов XHTML и поведений JavaScript. Эти методы вызываются с помощью

mixed _(string $type)

Несмотря на то, что в прототипе метода JHTML::_() указан всего один параметр, на практике их, как правило, бывает больше. Они интерпретируются так: по первому параметру метод _() определяет, какой метод необходимо вызвать, а остальные параметры передаются в этот метод.

Параметр $type может быть трех видов:

Название метода самого класса JHTML. Например, $type = 'image' приведет к вызову JHTML::image().

<имя файла>.<имя метода>. Будет вызван метод поддерживающего класса JHTML<Имя файла>.<имя метода>(). В имени поддерживающего класса первая буква <имени файла> станет заглавной. Например, если $type='select.genericlist', то будет вызван метод JHTMLSelect::genericlist().

11
{"b":"145279","o":1}