IP автора;
id категории;
отображать ли вопрос на сайте;
дата снятия вопроса с публикации;
отправлен ли вопрос эксперту;
ответ на вопрос;
отправлен ли ответ автору вопроса.
Регистрация компонента в базе данных
Зарегистрируем наш компонент в базе данных, добавив запись в таблицу, содержащую данные о расширениях. Перейдите в phpMyAdmin(если вы работаете с Denwer, то для этого вам нужно ввести в адресной строке браузера ссылка: http://localhost/tools/phpmyadmin), зайдите в базу данных, в которую вы установили Joomla, и откройте вкладку " SQL" (рис. 1.3).
(есть увеличенное изображение)
Рис. 1.3. Выполнение SQL-запроса
Теперь введите следующий SQL-запрос. Предполагается, что префикс таблиц вашей базы данных - "jos_". Если вы указали при установке Joomla другой префикс, замените "jos_" на него.
INSERT INTO `jos_extensions`(`name`, `type`, `element`, `folder`, `client_id`, `manifest_cache`, `params`, `custom_data`, `system_data`) VALUES('myquestions', 'component', 'com_myquestions', '', 1, '{"legacy":false, "name":"Моя система «вопрос – ответ»", "type":"component", "creationDate":"2012", "author":"me", "copyright":"(с) me", "authorEmail":"mymail@example.ru", "authorUrl":"http:\\/\\/www.example.ru", "version":"1.0", "description":"Мой первый компонент для Joomla", "group":""}', '{}', '', '');
Как видите, мы задали название расширения - "myquestions", тип расширения - компонент и некоторую информацию о нем и его авторе.
Первые папки и файлы. Добавление пунктов меню
Создайте две папки под названием com_myquestions:
в папке /components;
в папке /administrator/components.
Создайте файл /components/com_myquestions/myquestions.phpследующего содержания:
<?php defined('_JEXEC') or die('Restricted access'); echo 'Моя система «вопрос – ответ»'; ?>
Как видите, пока наш компонент просто будет выводить надпись "Моя система "вопрос - ответ"".
Не забудьте, что Joomla работает в кодировке UTF-8 и, следовательно, ваши PHP-файлы должны быть в той же кодировке. Например, в популярном текстовом редакторе Notepad++ кодировка изменяется с помощью пункта меню " Кодировка", из подпунктов которого нужно выбрать " Преобразовать в UTF-8 без BOM".
Теперь сохраните файл и обновите страницу ссылка: http://localhost/joomla/index.php?option=com_myquestionsв браузере. Страница примет следующий вид (рис. 1.4).
(есть увеличенное изображение)
Рис. 1.4. Первый результат во фронтенде
Создайте файл /administrator/components/com_myquestions/admin.myquestions.php:
<?php defined('_JEXEC') or die('Restricted access'); echo 'Моя система «вопрос – ответ»'; ?>
Наберите в адресной строке браузера строку ссылка: http://localhost/joomla/administrator/index.php?option=com_myquestions. Результат должен выглядеть так, как на рис. 1.5.
(есть увеличенное изображение)
Рис. 1.5. Первый результат в бэкенде
Добавим эти ссылки в меню фронтенда и бэкенда. Для этого выясним, какой idбыл присвоен нашему компоненту в таблице jos_extensions. В phpMyAdminвойдите в эту таблицу и найдите расширение com_myquestions. Вероятно, оно находится в последней строке. Посмотрите, какое значение стоит в поле extension_id. Например, на рис. 1.6 видно, что в данном случае idравен 10006.
(есть увеличенное изображение)
Рис. 1.6. Определение id компонента
Теперь выполните SQL-запрос, не забыв заменить "10006" на найденный вами id:
INSERT INTO `jos_menu`(`menutype`, `title`, `alias`, `path`, `link`, `type`, `level`, `component_id`, `access`, `img`, `params`, `client_id`) VALUES('menu', 'com_myquestions_menu', 'My Questions', 'My Questions', 'index.php? option=com_myquestions', 'component', 1, 10006, 1, 'class:component', '', 1);
После выполнения данного запроса в меню " Компоненты" бэкенда появится новый подпункт со ссылкой на наш компонент. Однако он будет называться " myquestions", так как мы еще не задали перевод для строки com_myquestions_menu. Чтобы задать его, создайте языковой файл /administrator/language/ru-RU/ru-RU.com_myquestions.sys.iniследующего содержания:
COM_MYQUESTIONS_MENU="Моя система «вопрос – ответ»"
Зайдите в бэкенд. В меню " Компоненты" появился пункт " Моя система "вопрос - ответ"" (рис. 1.7).
Рис. 1.7. Пункт меню в бэкенде
Теперь создайте пункт меню фронтенда. Для этого зайдите в " Меню" - " Менеджер меню", нажмите на ссылку " Главное меню", а затем на кнопку " Создать". Выберите тип пункта меню " Внешний URL", в поле " Заголовок меню" введите " Моя система "вопрос - ответ"", а в поле " Ссылка" - ссылку на фронтенд нашего компонента: ссылка: http://localhost/joomla/index.php?option=com_myquestionsи нажмите " Сохранить". Обновите любую страницу фронтенда и убедитесь, что появился новый пункт меню (рис. 1.8).
(есть увеличенное изображение)
Рис. 1.8. Пункт меню во фронтенде
Создание панелей инструментов
Вспомните приведенное выше описание функционала, доступного администратору нашей системы. Соответственно, на панели инструментов для управления списком вопросов необходимы следующие кнопки:
отправить уведомление о вопросе эксперту по электронной почте;
присвоить вопросу категорию;
отправить ответ автору вопроса по электронной почте;
редактировать вопрос (в том числе: задать дату снятия вопроса с публикации; скрыть от посетителей сайта отдельные поля вопроса; ответить на вопрос);
удалить вопрос.
Для начала создайте файл /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 соответствует отдельной панели инструментов. Как видите, мы задали две такие панели - первая из них будет отображаться над формой для ответа на вопрос, а вторая - над списком вопросов.