Опубликован: 02.10.2012 | Доступ: свободный | Студентов: 1916 / 85 | Длительность: 11:48:00
Теги: joomla, mvc, php, xhtml, xml
Лекция 3:

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

< Лекция 2 || Лекция 3: 123 || Лекция 4 >
JHTMLGrid

Методы данного класса используются для вывода в таблице в панели управления таких элементов, как чекбокс, пиктограмма для переключения состояния "опубликовано"/"не опубликовано", для отображения заголовка столбца как ссылки для сортировки по этому столбцу и др.

Таблица должна располагаться внутри формы под названием adminForm, обязательно включающей два скрытых поля: boxchecked со значением по умолчанию 0 и task.

Для создания чекбокса используется метод

mixed id(int $rowNum, int $recId, bool $checkedOut=false, string $name='cid')
            

где

$rowNum - номер строки в таблице;
$recId - id записи;
$checkedOut - заблокирован ли элемент;
$name - имя элемента формы.

Метод возвращает html-код чекбокса, если элемент не заблокирован, и пустую строку в противном случае.

Для создания пиктограммы, по щелчку на которой можно изменять значение поля published с 0 на 1 и обратно, используется

string published(mixed $value, int $i, string $img1 = 'tick.png', string $img0 = 'publish_x.png', string $prefix='')
            

где

$value - объект или только значение поля published;
$i - номер строки в таблице;
$img1 - изображение при published = 1;
$img0 - изображение при published = 0;
$prefix - префикс, который будет добавлен к названиям по умолчанию задач publish/unpublish.

Для примера выведем элементы массива $rows как строки таблицы, добавив для каждой записи ячейки с чекбоксом и значком "опубликовано"/"не опубликовано":

$k = 0;
for ($i = 0, $n = count($rows); $i < $n;  $i ++)       
{
  $row = &$rows[$i];
  ?>
  <tr class="<?="row$k"?>">
    <td><?=JHTML::_('grid.id', $i, $row->id)?></td>
    <td><?=$row->name?></td>
    <td align="center"><?=JHTML::_('grid.published', $row, $i)?></td> 
  </tr>
  <?php
  $k = 1 - $k;
}
            

Пример результата приведен на рис. 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 - вернуть весь тег <img> с его содержимым или только путь.

Пример:

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, который будет выведен внутри тега <select>;
$directory - директория, в которой хранятся изображения. Например: components/com_mycomponent/images. Если значение не задано, будет использоваться директория images;
$extensions - список допустимых расширений

Например, вывод на экран JHTML::_('list.images','imglist') приведет к отображению такого списка ( рис. 3.5).

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

Рис. 3.5. Список для выбора изображения
Список незаблокированных пользователей
string users(string $name, string $active, int $nouser = 0, string $javascript = NULL, string $order = 'name', string $reg = 1)
                

где

$name - название элемента <select>;
$active - выбранный по умолчанию пользователь;
$nouser - добавлять ли пункт, означающий отсутствие пользователя;
$javascript - дополнительный код Javascript, который будет выведен внутри тега <select>;
$order - имя поля для сортировки списка;
$reg - исключить пользователей из группы "Зарегистрированные".

Например, вывод на экран JHTML::_('list.users','usrlist','42', 1, NULL, 'id', $reg = 1) приведет к отображению такого списка ( рис. 3.6).

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

Рис. 3.6. Список для выбора пользователя
Список категорий
string category(string $name, string $extension, string $selected = NULL, string $javascript = NULL, 
string $order = null, int $size = 1, bool $sel_cat = 1)
                

где

$name - название элемента <select>;
$extension - расширение, к которому относятся категории;
$selected - выбранное по умолчанию значение;
$javascript - дополнительный код Javascript, который будет выведен внутри тега <select>;
$size - высота списка (значение атрибута size тега <select>);
$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 - дополнительные атрибуты тега <select>. Могут быть заданы как массив атрибутов или массив опций с ключами list.attr, id, list.select и др.;
$optKey - из какого поля объекта, представляющего собой элемент массива $data, брать значение элементов <option>. При $optkey = null будут использованы ключи массива;
$optText - из какого поля объекта, представляющего собой элемент массива $data, брать текст элементов <option>. Тег <option> формируется так: <option value="$optkey">$optText</option>;
$selected - значение выбранного по умолчанию элемента;
$idtag - id тега <select>;
$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. Список для выбора материала
Объект, представляющий элемент <option> выпадающего списка
object option(string $value, string $text = '', mixed $optKey = 'value', string $optText = 'text', bool $disable = false)
                

где

$value - значение элемента <option>;
$text - текст элемента;
$optKey - если это строка, то имя того поля возвращаемого объекта, в котором будет храниться значение элемента <option>. Если массив, то это параметры. Возможные ключи массива: attr, disable, label, option.attr, option.disable, option.key, option.label, option.text;
$optText - имя того поля возвращаемого объекта, в котором будет храниться текст элемента <option>;
$disable - добавлять ли к тегу атрибут disable.

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

$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() создается объект, представляющий элемент <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 - дополнительные атрибуты тега <input> (могут быть заданы сразу в виде строки);
$optKey - из какого поля объекта, представляющего собой элемент массива $data, брать значения элементов <input>;
$optText - из какого поля объекта, представляющего собой элемент массива $data, брать текст элементов <input>;
$selected - значение выбранного по умолчанию элемента;
$idtag - префикс id сгенерированных тегов. Для каждого тега <input> id станет равным $idtag<key>, где <key> - значение поля под названием $optKey в соответствующем объекте из массива $data. Если $idtag не задан, то вместо него будет использовано значение $name. В Joomla 1.7 в этой функции имеется ошибка: если объекты массива $data содержат поле с названием id, то к каждому элементу <input> добавляется второй 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. Группа переключателей
< Лекция 2 || Лекция 3: 123 || Лекция 4 >
Кирилл Гусаров
Кирилл Гусаров

В разделе "Первые папки и файлы. Добавление пунктов меню"

предлагается создать две файла:

- myquestions.php;

- admin.myquestions.php

с соответствуюшими адресами:

/components/com_myquestions/myquestions.php;

- /administrator/components/com_myquestions/admin.myquestions.php;

Так вот, при создании файла "admin.myquestions.php" В админке выдает ошибку - "Компонент не найден", а при переименовании его на  "myquestions.php" в последующем шаге, в админке не выводятся кнопки редактирования. 
Проверил кодировку, проверил правильность пути к файлам, пересохранил указанный код. Скажите что я делаю не так или в чем может быть причина?