355 500 произведений, 25 200 авторов.

Электронная библиотека книг » Яна Седова » Разрботка расширений для CMS Joomla » Текст книги (страница 4)
Разрботка расширений для CMS Joomla
  • Текст добавлен: 4 октября 2016, 21:48

Текст книги "Разрботка расширений для CMS Joomla"


Автор книги: Яна Седова



сообщить о нарушении

Текущая страница: 4 (всего у книги 10 страниц)

Пример результата приведен на рис. 3.3.

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

Рис. 3.3.  Чекбокс и пиктограмма «опубликовано/не опубликовано»

Обратите внимание, что методы класса JHTMLGrid лишь отображают какой-либо элемент, но не добавляют код для его обработки. В приведенном выше примере кнопки «опубликовано»/"не опубликовано"отображаются, но не работают. Чтобы это исправить, необходимо зарегистрировать задачи publish и unpublish (если вы не изменили их названия, задав какой-либо префикс) и написать функцию для их обработки, которая будет вызывать метод JTable::publish().

JHTMLImage

Содержит два метода для поиска изображения в фронтенде и бэкенде соответственно. Каждый из них ищет либо изображение из директории images текущего шаблона сайта/панели управления, либо, если файла с заданным именем там нет, изображение из заданной директории.

string site(string $file, string $folder = '/images/system/', int $altFile = null, string $altFolder = '/images/system/', string $alt = null, array $attribs = null, bool $asTag = true) string administrator(string $file, string $folder = '/images/', int $altFile = null, string $altFolder = '/images/', string $alt = null, array $attribs = null, bool $asTag = true)

где

$file – имя файла; $folder – путь к файлу. Будет использован, если в директории images текущего шаблона не нашлось файла с заданным именем; $altFile – если не задано, то используются значения $file и $folder, при $altFile = -1 метод возвращает пустую строку, при других значениях используются $altFile и $altFolder; $altFolder – другой путь к файлу; $alt – будущее значение атрибута alt; $attribs – ассоциативный массив атрибутов; $asTag – вернуть весь тег с его содержимым или только путь.

Пример:

echo JHTML::_('image.site', 'notice-info.png', '/media/system/images/');

JHTMLList

Методы класса JHTMLList используются для создания списков некоторых значений.

Список для выбора одного из существующих в Joomla уровней доступа

string accesslevel(object &$row)

где $row – объект, имеющий поле access.

Пример:

$query = 'SELECT id,access FROM #__content WHERE id = 1'; $db =& JFactory::getDBO(); $db->setQuery($query); $article = $db->loadObject(); echo JHTML::_('list.accesslevel', $article);

Результат показан на рис. 3.4.

Рис. 3.4.  Список для выбора уровня доступа

Список для выбора изображения

array images(string $name, string $active = NULL, string $javascript = NULL, string $directory = NULL, string $extensions = "bmp|gif|jpg|png")

где

$name – имя поля; $active – выбранный по умолчанию элемент; $javascript – дополнительный код Javascript, который будет выведен внутри тега ; $active – выбранный по умолчанию пользователь; $nouser – добавлять ли пункт, означающий отсутствие пользователя; $javascript – дополнительный код Javascript, который будет выведен внутри тега ; $extension – расширение, к которому относятся категории; $selected – выбранное по умолчанию значение; $javascript – дополнительный код Javascript, который будет выведен внутри тега ); $sel_cat – при null строки " Выберите категорию" в списке не будет.

Пример:

echo JHTML::_('list.category', 'catlist', 'com_content', 2, 'onclick="someFunc()"', 'id', 1, 1);

Данный код выведет на экран список, представленный на рис. 3.7.

Рис. 3.7.  Список для выбора категории

JHTMLMenu

Класс используется для отображения элементов меню и не представляет интереса для использования в расширениях.

JHTMLSelect

Класс JHTMLSelect используется для генерации кода списков.

Выпадающий список

string genericlist(array $data, string $name, mixed $attribs = null, string $optKey = 'value', string $optText = 'text', mixed $selected = null, mixed $idtag = false, bool $translate = false)

где

$data – массив данных для отображения. Каждый элемент может быть сгенерирован с помощью метода JHTMLSelect.option() или другим образом; $name – имя элемента HTML; $attribs – дополнительные атрибуты тега ; $translate – пропускать ли текст через функцию JText::_().

Пример:

$query = 'SELECT id,title FROM #__content'; $db =& JFactory::getDBO(); $db->setQuery($query); $content = $db->loadObjectList(); echo JHTML::_('select.genericlist', $content, 'genlist', 'size='.count($content), 'id', 'title', 2);

Так как мы передали в функцию genericlist() $selected=2, то в сгенерированном списке по умолчанию выделен элемент с id, равным 2 (рис. 3.8).

Рис. 3.8.  Список для выбора материала

Объект, представляющий элемент

object option(string $value, string $text = '', mixed $optKey = 'value', string $optText = 'text', bool $disable = false)

где

$value – значение элемента

Рассмотрим пример:

$query = 'SELECT id,title FROM #__content'; $db =& JFactory::getDBO(); $db->setQuery($query); $content = $db->loadObjectList(); foreach ($content as $c) $data[] = JHTML::_('select.option', $c->id, $c->title, 'my_value', 'my_text'); echo JHTML::_('select.genericlist', $data, 'genlist', 'size='.count($data), 'my_value', 'my_text', 2);

В данном примере для каждого материала сайта с помощью метода JHTMLSelect.option() создается объект, представляющий элемент

JObject Object ([_errors:protected]=>Array () [my_value]=>1 [my_text]=>Материал #1 [disable]=>)

Таким образом, значения $optKey и $optText, переданные в функцию option(), стали названиями полей получившегося объекта, а значения $c->id и $c->title – значениями этих полей. Теперь в функцию JHTMLSelect.genericlist() необходимо передать те же названия полей, что и в option(). Если не передать их, то функция genericlist() будет по умолчанию искать в объектах массива $data поля $value и $text, которых там нет.

Результат работы данного примера будет выглядеть так же, как и результат предыдущего.

Список целых чисел

string integerlist(int $start, int $end, int $inc, string $name, mixed $attribs = null, mixed $selected = null, string $format = '')

где

$start – первое число последовательности; $end – последнее число последовательности; $inc – шаг; $name – имя тега; $attribs – массив атрибутов тега; $selected – значение выбранного по умолчанию элемента; $format – формат вывода числа для функции printf().

Пример:

echo JHTML::_('select.integerlist', 1, 10, 1, 'intlist', 'size=10', 3, '%02d');

Этот код выведет список, представленный на рис. 3.9.

Рис. 3.9.  Список для выбора числа

Группа переключателей

string radiolist(array $data, string $name, mixed $attribs = null, mixed $optKey = 'value', string $optText = 'text', string $selected = null, bool $idtag = false, bool $translate = false)

где

$data – массив объектов; $name – имя, общее для всех переключателей; $attribs – дополнительные атрибуты тега (могут быть заданы сразу в виде строки); $optKey – из какого поля объекта, представляющего собой элемент массива $data, брать значения элементов ; $optText – из какого поля объекта, представляющего собой элемент массива $data, брать текст элементов ; $selected – значение выбранного по умолчанию элемента; $idtag – префикс id сгенерированных тегов. Для каждого тега id станет равным $idtag, где  – значение поля под названием $optKey в соответствующем объекте из массива $data. Если $idtag не задан, то вместо него будет использовано значение $name. В Joomla 1.7 в этой функции имеется ошибка: если объекты массива $data содержат поле с названием id, то к каждому элементу добавляется второй id со значением, взятым из этого поля; $translate – пропускать ли текст через функцию JText::_().

Пример:

$query = 'SELECT id,title FROM #__content'; $db =& JFactory::getDBO(); $db->setQuery($query); $content = $db->loadObjectList(); echo JHTML::_('select.radiolist', $content, 'radlist', 'class="inputbox"', 'id', 'title', 2, 'radlist', false);

Результат показан на рис. 3.10.

Рис. 3.10.  Группа переключателей

Практика

Обработка категорий

В единственном вопросе, который хранится в нашей базе, в поле id_cat стоит значение 1. Оно должно означать id категории. Добавим таблицу и код для работы с категориями.

Создание таблицы для категорий

Выполните следующий SQL-запрос, чтобы создать таблицу для хранения категорий:

CREATE TABLE `jos_myquestions_categories` ( `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY, `name` VARCHAR(255) NOT NULL, `desc` TEXT NOT NULL DEFAULT '' )

Добавьте записи в эту таблицу:

INSERT INTO `jos_myquestions_categories` VALUES (NULL,'Без категории',''), (NULL,'Риторические вопросы','Вопросы, не требующие ответа')

Зайдите в phpMyAdminи убедитесь, что таблица jos_myquestions_categoriesсодержит две записи (рис. 3.11).

Рис. 3.11.  Таблица базы данных, хранящая данные о категориях

Таким образом, сейчас все вопросы, для которых в поле id_catстоит значение 1, относятся к категории " Без категории".

Создание класса таблицы

Создайте файл /administrator/components/com_myquestions/tables/category.php:

Вывод списка категорий

Добавьте в файл admin.myquestions.phpфункцию showCategories():

function showCategories($option) { $db =& JFactory::getDbo(); $query = "SELECT * FROM #__myquestions_categories"; $db->setQuery($query); $rows = $db->loadObjectList(); if ($db->getErrorNum()) { echo $db->stderr(); return false; } HTML_questions::showCategories($option, $rows); }

Эта функция аналогична функции showQuestions(), рассмотренной ранее.

В файл admin.myquestions.html.phpв класс HTML_questions добавьте еще одну функцию:

function showCategories($option, &$rows) { ?>

id); $link = JFilterOutput::ampReplace('index.php?option=' .$option . '&task=editcat&cid[]='. $row->id); ?> ">
name.''?> desc?>

Данная функция также аналогична одноименной функции для отображения списка вопросов.

Добавьте в переключатель switch в файле admin.myquestions.phpобработку новой задачи:

case 'showcat': showCategories($option); break;

Добавьте в файл /administrator/language/ru-RU/ru-RU.com_myquestions.iniкод:

COM_MYQUESTIONS_CATEGORY_NAME="Название категории" COM_MYQUESTIONS_CATEGORY_DESC="Описание категории"

Перейдя по ссылке ссылка: http://localhost/joomla/administrator/index.php?option=com_myquestions&task=showcat, вы уже можете увидеть список категорий.

Однако пока над списком будет отображаться старая панель инструментов, которую мы создали для списка вопросов. Поэтому необходимо также создать новые панели инструментов для работы с категориями. Откройте файл toolbar.myquestions.phpи добавьте в переключатель switch следующий код:

case 'showcat': TOOLBAR_myquestions_categories::_DEFAULT(); break;

Как видите, мы добавили обработку задачи showcat – отображение списка категорий. Соответственно, вызывается функция _DEFAULT() класса TOOLBAR_myquestions_categories. Напишем код этого класса. Добавьте в файл toolbar.myquestions.html.phpкод:

class TOOLBAR_myquestions_categories { function _DEFAULT() { JToolBarHelper::title(JText::_('COM_MYQUESTIONS_TOOLBAR_TITLE_CATEGORIES'), 'generic.png'); JToolBarHelper::addNew('addcat'); JToolBarHelper::editList('editcat'); JToolBarHelper::deleteList (JText::_('COM_MYQUESTIONS_TOOLBAR_REMOVE_CATEGORIES_CONFIRMATION'), 'removecat'); } }

Таким образом, панель инструментов для списка категорий будет содержать три кнопки: " Создать", " Изменить" и " Удалить".

Добавьте в файл /administrator/language/ru-RU/ru-RU.com_myquestions.iniкод:

COM_MYQUESTIONS_TOOLBAR_TITLE_CATEGORIES="Управление категориями вопросов" COM_MYQUESTIONS_TOOLBAR_REMOVE_CATEGORIES_CONFIRMATION="Вы действительно хотите удалить эти категории?"

Теперь по ссылке ссылка: http://localhost/joomla/administrator/index.php?option=com_myquestions&task=showcatвидим список категорий (рис. 3.12).

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

Рис. 3.12.  Список категорий в бэкенде

Создание, редактирование и удаление категорий

При нажатии на кнопки " Создать" или " Изменить", расположенные над списком категорий, должна отображаться другая панель инструментов. Для этого добавьте в класс TOOLBAR_myquestions_categories функцию _NEW():

class TOOLBAR_myquestions_categories { function _NEW() { JToolBarHelper::title(JText::_('COM_MYQUESTIONS_TOOLBAR_TITLE_CATEGORIES'), 'generic.png'); JToolBarHelper::save('savecat'); JToolBarHelper::apply('applycat'); JToolBarHelper::cancel('showcat'); } function _DEFAULT() { JToolBarHelper::title(JText::_('COM_MYQUESTIONS_TOOLBAR_TITLE_CATEGORIES'), 'generic.png'); JToolBarHelper::addNew('addcat'); JToolBarHelper::editList('editcat'); JToolBarHelper::deleteList(JText::_('COM_MYQUESTIONS_TOOLBAR_REMOVE_CONFIRMATION'), 'removecat'); } }

Запишем в файле toolbar.myquestions.php, что при обработке задач addcat и editcat должна отображаться панель инструментов _NEW. Измените код этого файла так:

Теперь добавим обработку всех перечисленных в файле toolbar.myquestions.html.phpзадач. Откройте файл admin.myquestions.phpи добавьте в переключатель switch код:

case 'addcat': case 'editcat': editCategory($option); break; case 'savecat': case 'applycat': saveCategory($option, $task); break; case 'removecat': removeCategories($option); break;

Добавьте перечисленные функции в файл admin.myquestions.php:

function editCategory($option) { $row =& JTable::getInstance('Category','Table'); $cid = JRequest::getVar('cid', array(0), '', 'array'); $id = $cid[0]; $row->load($id); HTML_questions::editCategory($row, $option); } function saveCategory($option, $task) { $row =& JTable::getInstance('category', 'Table'); if (!$row->bind(JRequest::get('post'))) { echo "n"; exit(); } $row->desc = JRequest::getVar('desc', '', 'post', 'string', JREQUEST_ALLOWRAW); if (!$row->store()) { echo "n"; exit(); } global $app; if ($task == 'savecat') $app->redirect('index.php?option='.$option.'&task=showcat', JText::_('COM_MYQUESTIONS_CATEGORY_SAVED')); else if ($task == 'applycat') $app– >redirect('index.php?option='.$option.'&task=editcat&cid[]='.$row– >id, JText::_('COM_MYQUESTIONS_CATEGORY_SAVED')); } function removeCategories($option) { global $app; $cid = JRequest::getVar('cid', array(), '', 'array'); $db =& JFactory::getDbo(); if(count($cid)) { $cids = implode(',', $cid); $query = "DELETE FROM #__myquestions_categories WHERE id IN ($cids)"; $db->setQuery($query); if (!$db->query()) { echo "n"; } } $app->redirect('index.php?option=' . $option . '&task=showcat', JText::_('COM_MYQUESTIONS_CATEGORY_DELETED')); } Листинг .

Добавьте в файл admin.myquestions.html.phpв класс HTML_questions метод editCategory() для отображения формы редактирования категории:

function editCategory ($row, $option) { $editor =& JFactory::getEditor(); ?>

:
: display('desc', $row->desc,'100%', '250', '40', '10');?>

Наконец, добавьте в файл /administrator/language/ru-RU/ru-RU.com_myquestions.iniкод:

COM_MYQUESTIONS_CATEGORY_SAVED="Категория сохранена" COM_MYQUESTIONS_CATEGORY_DELETED="Категории успешно удалены"

Убедитесь, что все кнопки обеих панелей инструментов работают корректно.

Присвоение вопросу какой-либо категории

Добавим в форму ответа на вопрос выпадающий список для выбора категории.

Откройте файл admin.myquestions.phpи измените код функции replyToQuestion() следующим образом:

function replyToQuestion($option) { $row =& JTable::getInstance('Question','Table'); $cid = JRequest::getVar('cid', array(0), '', 'array'); $id = $cid[0]; $row->load($id); $db = &JFactory::getDBO(); $query = 'SELECT name AS text, id AS value FROM #__myquestions_categories'; $db->setQuery($query); $categories = $db->loadObjectList(); $list_cat = JHTML::_('select.genericlist', $categories, 'id_cat', ' class="inputbox" ', 'value', 'text', $row->id_cat); HTML_questions::replyToQuestion($row, $option, $list_cat); }

В файле admin.myquestions.html.phpизмените прототип функции HTML_questions::replyToQuestion() так:

function replyToQuestion ($row, $option, $list_cat)

Наконец, в коде этой функции измените фрагмент, в котором раньше выводилось текстовое поле с id категории, так:

:

Перейдите к странице ответа на вопрос и убедитесь, что отображается выпадающий список для выбора категории (рис. 3.13).

Рис. 3.13.  Выбор категории вопроса в бэкенде

Ключевые термины

JHTML – класс для вывода элементов XHTML. JHTMLBehavior – поддерживающий класс, который позволяет вывести календарь, дерево элементов, файловый загрузчик и некоторые другие элементы управления. JHTMLEmail – поддерживающий класс, содержащий метод для скрытия адреса электронной почты в целях его защиты от спам-ботов. JHTMLForm – поддерживающий класс, содержащий метод, который возвращает код скрытого поля формы для уменьшения риска CSRF-атак. JHTMLGrid – поддерживающий класс, позволяющий вывести в таблице в панели управления такие элементы, как чекбокс, пиктограмма для переключения состояния "опубликовано"/"не опубликовано", отобразить заголовок столбца как ссылки для сортировки по этому столбцу и др. JHTMLImage – поддерживающий класс, содержащий методы для поиска изображения в фронтенде и бэкенде. JHTMLList – поддерживающий класс для создания списков некоторых конкретных значений. JHTMLSelect – поддерживающий класс для генерации кода списков. Основной метод класса JHTML – метод JHTML::_(), который вызывает метод, определяющийся его первым параметром, и передает ему свои остальные параметры. Поддерживающие классы – классы для вывода элементов XHTML и поведений Javascript.

Краткие итоги

Joomla содержит методы для генерации и отображения элементов XHTML и поведений JavaScript. Эти методы вызываются с помощью метода JHTML::_(). По первому параметру данный метод определяет, какой метод необходимо вызвать, а остальные параметры передаются в этот метод. Таким образом могут быть вызваны как методы самого класса JHTML, так и методы поддерживающих классов.

Методы класса JHTML позволяют вывести следующие элементы: календарь, форматированную дату, элементы