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

Архитектура Joomla. Базовые сведения

Лекция 1: 123 || Лекция 2 >

Создание панелей инструментов

Вспомните приведенное выше описание функционала, доступного администратору нашей системы. Соответственно, на панели инструментов для управления списком вопросов необходимы следующие кнопки:

  • отправить уведомление о вопросе эксперту по электронной почте;
  • присвоить вопросу категорию;
  • отправить ответ автору вопроса по электронной почте;
  • редактировать вопрос (в том числе: задать дату снятия вопроса с публикации; скрыть от посетителей сайта отдельные поля вопроса; ответить на вопрос);
  • удалить вопрос.

Для начала создайте файл /administrator/components/com_myquestions/toolbar.myquestions.html.php:

<?php
defined('_JEXEC') or die('Restricted access');
class TOOLBAR_myquestions
{
  function _REPLY()
  {
    JToolBarHelper::title(JText::_('COM_MYQUESTIONS_TOOLBAR_TITLE'), 'generic.png');
    JToolBarHelper::custom('sendToExpert', 'send.png', '', 'COM_MYQUESTIONS_TOOLBAR_SEND_TO_EXPERT', false);
    JToolBarHelper::custom('sendAnswer', 'send.png', '', 'COM_MYQUESTIONS_TOOLBAR_SEND_ANSWER', false);
    JToolBarHelper::save();
    JToolBarHelper::apply();
    JToolBarHelper::cancel();
  }

  function _DEFAULT()
  {
    JToolBarHelper::title(JText::_('COM_MYQUESTIONS_TOOLBAR_TITLE'), 'generic.png');
    JToolBarHelper::editList('reply','COM_MYQUESTIONS_REPLY');
JToolBarHelper::deleteList(JText::_('COM_MYQUESTIONS_TOOLBAR_REMOVE_QUESTIONS_CONFIRMATION'));
  }
}
?>
        

Каждая функция класса TOOLBAR_myquestions соответствует отдельной панели инструментов. Как видите, мы задали две такие панели - первая из них будет отображаться над формой для ответа на вопрос, а вторая - над списком вопросов.

В коде, приведенном выше для ряда кнопок вместо стандартных подписей задаются собственные, которые необходимо перевести в языковом файле вместе с другими надписями. Поэтому создадим языковой файл /administrator/language/ru-RU/ru-RU.com_myquestions.ini:

COM_MYQUESTIONS_TOOLBAR_SEND_TO_EXPERT="Отправить эксперту"
COM_MYQUESTIONS_TOOLBAR_SEND_ANSWER="Отправить ответ"
COM_MYQUESTIONS_TOOLBAR_TITLE="Моя система &laquo;вопрос &ndash; ответ&raquo;"
COM_MYQUESTIONS_REPLY="Ответить / Редактировать"
COM_MYQUESTIONS_TOOLBAR_REMOVE_QUESTIONS_CONFIRMATION="Вы действительно хотите удалить эти вопросы?"
        

Добавим код, который будет выбирать, какую из определенных нами панелей инструментов отображать. Создайте файл /administrator/components/com_myquestions/toolbar.myquestions.php:

<?php
defined('_JEXEC') or die('Restricted access');
require_once(JApplicationHelper::getPath('toolbar_html'));
switch($task)
{
  case 'reply':
    TOOLBAR_myquestions::_REPLY();
    break;
  default:
    TOOLBAR_myquestions::_DEFAULT();
    break;
}
?>
        

Вызов функции getPath() класса JApplicationHelper позволяет обратиться к файлу toolbar.myquestions.html.php без указания имени компонента, что удобно, если впоследствии понадобится изменить это имя.

Выражение switch используется для выбора одной из панелей инструментов в зависимости от значений переменной $task.

Обратите внимание, что код распределен по двум файлам - toolbar.myquestions.php и toolbar.myquestions.html.php, чтобы отделить логику обработки от непосредственного вывода информации.

Обновите страницу в бэкенде и выберите в меню "Компоненты" пункт "Моя система "вопрос - ответ"". Результат должен быть таким же, как на рис. 1.9.

Первая панель инструментов

увеличить изображение
Рис. 1.9. Первая панель инструментов

Чтобы увидеть другую панель инструментов, добавьте строку &task=reply в конец URL: http://localhost/joomla/administrator/index.php?option=com_myquestions&task=reply ( рис. 1.10).

Вторая панель инструментов

увеличить изображение
Рис. 1.10. Вторая панель инструментов

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

Чтобы использовать для кнопки свою картинку, необходимо создать файл CSS, содержащий подобное выражение:

.icon-32-myiconname
{    background-image: url(icon-32-myiconfile.png); 
}
        

Класс JToolBarHelper будет искать для заданного значения iconname класс .icon-32- iconname. Название файла должно начинаться с "icon-32-".

В таком случае вызов функции JToolBarHelper::custom() будет выглядеть так:

JToolBarHelper::custom('someFunction', 'myiconname.png', '', 'Альтернативный текст', false, false);
        

Ваш файл CSS необходимо подключить в файле admin.myquestions.php следующим образом:

JHTML::stylesheet('delete.css', 'administrator/components/com_myquestions/');
        

Предполагается, что файлы delete.css и icon-32-myiconfile.png находятся в папке /administrator/components/com_myquestions/.

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

JAdministrator - приложение, управляющее функциями для администрирования Joomla.
JApplication - класс, позволяющий работать с очередью сообщений, осуществлять перенаправление браузера, получать параметры конфигурации сайта, определять тип запущенного приложения Joomla.
JFactory - класс Joomla, реализующий паттерн "фабрика" и позволяющий получить доступ к глобальным объектам фреймворка.
JInstallation - приложение, которое запускается при установке Joomla.
JRequest - класс Joomla, использующийся для работы с переменными HTTP-запроса.
JSite - приложение, отвечающее за компоновку и отображение фронтенда.
JToolBarHelper - класс Joomla, содержащий методы, которые генерируют HTML-код для построения кнопок панелей инструментов.
XML-RPC - приложение, позволяющее администрировать сайт Joomla удаленно.
Библиотека - файл, который требуется для работы фреймворка или сторонних расширений.
Бэкенд - система администрирования сайта.
Ключ - эквивалент текста, подлежащего переводу.
Компонент - основной тип расширений Joomla, вызов которого происходит при каждом обращении к Joomla.
Модуль - расширение Joomla, использующееся для отображения небольших фрагментов контента, обычно в левой или правой колонке или верхней или нижней областях страницы.
Очередь сообщений - массив строк, которые будут выведены на экран при следующей загрузке какой-либо страницы.
Перевод - строка, содержащая перевод текста, соответствующего заданному ключу, на какой-либо язык.
Плагин - расширение Joomla, позволяющее зарегистрировать функции и классы для обработки каких-либо событий, вызванных Joomla, например, поиск по сайту.
Приложение - глобальный объект, использующийся для обработки запросов.
Уровень приложения - часть архитектуры Joomla, которая состоит из приложений, расширяющих абстрактный класс JApplication.
Уровень расширений - часть архитектуры Joomla, которая состоит из расширений фреймворка Joomla и приложений.
Уровень фреймворка - часть архитектуры Joomla, которая обеспечивает ее базовую функциональность с помощью набора библиотек и плагинов и собственно ядра Joomla.
Фреймворк Joomla ("ядро") - набор классов, обеспечивающих базовую функциональность Joomla (JDatabase, JUser, JForm, JEditor и т.д.).
Фронтенд - часть сайта, доступная пользователю.
Шаблон - расширение Joomla, отвечающее за внешний вид сайта.
Языковый файл - расширение Joomla, позволяющее представить ее контент на нескольких языках.

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

Фреймворк Joomla состоит из трех уровней: уровень фреймворка, уровень приложения и уровень расширений.

Уровень фреймворка обеспечивает базовую функциональность Joomla с помощью набора библиотек и плагинов и собственно фреймворка Joomla.

Уровень приложения состоит из приложений, которые расширяют абстрактный класс JApplication.

Уровень расширений состоит из таких расширений фреймворка Joomla и приложений, как компоненты, модули, плагины и т.д.

Joomla делится на фронтенд - часть сайта, доступная пользователю, и бэкенд - систему администрирования сайта. Большинство компонентов для Joomla также делятся на фронтенд и бэкенд, и их код соответственно распределяется по двум папкам.

В Joomla определен ряд констант, хранящих значения путей, а также константа _JEXEC, позволяющая проверить, был ли скрипт вызван из Joomla, и DS - разделитель директорий.

Для создания мультиязыкового сайта используются языковые файлы, хранящие пары "ключ-значение", где ключ - это эквивалент какого-то текста, а значение - перевод этого текста на какой-либо язык.

Статический класс JFactory реализует паттерн "фабрика" и позволяет получить доступ к глобальным объектам фреймворка.

Вместо непосредственного использования глобальных массивов $_GET, $_POST, $_REQUEST и др. удобнее применять класс JRequest. Его методы пропускают данные, введенные пользователем, через фильтр во избежание инъекций.

В Joomla существует очередь сообщений - массив строк, которые будут выведены на экран при следующей загрузке какой-либо страницы. Добавляя сообщение в очередь, мы можем указывать его тип - сообщение, предупреждение или ошибка.

Глобальный объект JApplication позволяет работать с очередью сообщений, осуществлять перенаправление браузера, получать параметры конфигурации сайта, определять тип запущенного приложения Joomla.

Панели инструментов в бэкенде можно создавать с помощью класса JToolBarHelper, методы которого генерируют HTML-код для построения кнопок. Для отображения кнопок, которые часто используются в компонентах, существуют готовые методы этого класса. Можно также создать собственную кнопку.

Вопросы

  1. Опишите структуру фреймворка Joomla.
  2. Что такое фронтенд и бэкенд?
  3. Какие константы предопределены в Joomla?
  4. Каким образом реализована поддержка мультиязыковых сайтов?
  5. Для чего используется класс JFactory?
  6. В чем преимущество использования методов класса JRequest?
  7. Что такое очередь сообщений?
  8. Для чего используется глобальный объект JApplication?
  9. Каким образом создаются панели инструментов в бэкенде?

Упражнения

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

Лекция 1: 123 || Лекция 2 >
Кирилл Гусаров
Кирилл Гусаров

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

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

- myquestions.php;

- admin.myquestions.php

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

/components/com_myquestions/myquestions.php;

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

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