четверг, 3 ноября 2011 г.

Создание расширения для CMS Joomla 1.7. Часть 2

В предыдущей статье мы с Вами создали простой компонент. Да, у него нет никакой функциональной нагрузки, да и вообще-то задача у нас стояла другая: нам необходимо было разобраться в структуре расширения, что мы благополучно и сделали. Если кто-то, по каким-то причинам пропустил предыдущие две статьи, я настоятельно рекомендую не полениться и прочитать их: “Создание расширения для CMS Joomla 1.7. Введение.” и “Создание расширения для CMS Joomla 1.7. Часть 1”. Особенно это следует сделать для тех, кто не создавал расширений для более ранних версий Joomla. Ну, что приступим...

Разделим наш компонент на три части:
  1. Модель - управляет данными.
  2. Контроллер - выполняет задачи, устанавливает и получает состояния модели и передает это состояние в отображение.
  3. Отображение - отображает содержимое в зависимости от типа (error, feed, HTML, JSON, RAW, XML)

CMS Joomla имеет класс для работы с состоянием контроллеров - JController. Для того, чтобы воспользоваться данным классом необходимо его подключить. Подключение класса осуществляется следующим образом: в файле site/helloworld.php добавить следующие строки
<?php
// Защита доступа
defined('_JEXEC') or die('Restricted access');

//импорт библиотеки контроллеров joomla
jimport('joomla.application.component.controller');

// Get an instance of the controller prefixed by HelloWorld

//Получаем экземпляр контроллера раснирения HelloWorld
$controller = JController::getInstance('HelloWorld');

// Выполняем запрос задачи
$controller->execute(JRequest::getCmd('task'));

// Перенаправляем, если установлен контроллер
$controller->redirect();


Статический метод getInstance класса JController создаст контроллер. В приведенном примере это будет экземпляр контроллера объекте класса с именем HelloWorldController. Сама CMS Joomla будет искать объявление этого класса в файле controller.php (это задано по умолчанию). Поэтому нам надо в папке site создать файл controller.php, следующего содержания:

<?php
// Защита доступа
defined('_JEXEC') or die('Restricted access');

// импорт библиотеки контроллеров joomla
jimport('joomla.application.component.controller');

/**
* Hello World Component Controller
*/
class HelloWorldController extends JController
{
}


В зависимости от состояния и типа наш класс JController будет искать как отобразить содержимое в components/com_<название компонента>/site/views/<название представления>/folder.  Так, например, в нашем случае инструкция по тому, что отобразить в зависимости от состояния будет находиться:
components/com_helloworld/site/views/helloworld/ Имя папки по умолчанию является имя самого компонента. А сам файл называется view.html.php.
Теперь вернемся к созданию нашего компонента и в папке “site” создадим папку “views”. В папке “views” создадим еще один каталог, который будет называться так же, как и наш компонент “HelloWorld” и уже в этой директории мы создадим файл инструкции представления view.html.php. Содержание данного файла будет следующим:
<?php
// Защита доступа
defined('_JEXEC') or die('Restricted access');

// импорт библиотеки контроллеров joomla
jimport('joomla.application.component.view');

/**
* HTML представление класса для компонента HelloWorld
*/
class HelloWorldViewHelloWorld extends JView
{
    // Замена JView метода отображения
    function display($tpl = null)
    {
        // Назначение данных для просмотра
        $this->msg = 'Hello World';

        //Показываем представление
        parent::display($tpl);
    }
}

Ну вот почти и все. Мы создали контроллер, записали инструкцию по тому что отобразить в зависимости от состояния нашего контроллера. Осталось только добавить шаблон представления. Метод отображения класса JView называется display. В нашем случае этот метод будет отображать содержимое при помощи файла /tmpl/default.php
Давайте создадим в site/views/helloworld папку “tmpl”, а в ней файл default.php следующего содержания:
<?php
// защита доступа
defined('_JEXEC') or die('Restricted access');
?>
<h1><?php echo $this->msg; ?></h1>

Этот шаблон будет включен в класс JView, поэтому $this относится к классу HelloWorldViewHelloWorld.

Изменим содержимое файла helloworld.xml следующим образом:
<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="1.7.0" method="upgrade">

    <name>Hello World!</name>
    <!-- Данные о разработчике -->
    <creationDate>2011</creationDate>
    <author>zloykolobok</author>
    <authorEmail></authorEmail>
    <authorUrl>http://zloykolobok.blogspot.com</authorUrl>

    <copyright>Copyright Info</copyright>
    <license>License Info</license>
    <!--  Версия продукта-->
    <version>0.0.2</version>
    <!-- Описание компонента-->
    <description>Продолжение статей по созданию расширений для CMS Joomla</description>

    <update> <!-- Будет исполнено при обновлении. Доступно с версии 1.6 -->
        <schemas>
            <schemapath type="mysql">sql/updates/mysql</schemapath>
        </schemas>
    </update>

    <!-- Копирование файлов в секцию site-->
    <files folder="site">
        <filename>index.html</filename>
        <filename>helloworld.php</filename>
        <filename>controller.php</filename>
        <folder>views</folder>
    </files>

    <administration>
        <!-- меню в административном разделе-->
        <menu>Hello World!</menu>
        <!-- Копирование сайтов в секцию Administration  -->
        <files folder="admin">
            <!-- Admin Main File Copy Section -->
            <filename>index.html</filename>
            <filename>helloworld.php</filename>
            <!-- SQL files section -->
            <folder>sql</folder>
        </files>
    </administration>

</extension>


На этом статью можно и заканчивать. А, да мы забыли проверить. Загоняем все это “безобразие” в zip-архив и устанавливаем на нашу CMS Joomla. Проверяем. Результат: по умолчанию, Вы должны увидеть сообщение, которое храниться в переменной $this->msg, которая находиться в view.html.php.
Ну вот, теперь все. Скачать компонент данного урока можно ТУТ (только измените название с com_helloworld_2.zip на com_helloworld.zip). Пишите комментарии. Да, и не забывайте подписываться на мой блог

Понравилась статья? Поблагодарить автора:

Введите e-mail адрес:



15 комментариев:

  1. Спасибо за статьи шикарные, но было бы очень удобно, если бы код был разноцветным(хотя бы как это делает notepad++)

    ОтветитьУдалить
  2. Постараюсь подобрать плагин для отображения кода, пока ничего стоящего не нашел для blogger.

    ОтветитьУдалить
  3. проверьте правописание, несколько раз уже встречал "...ться" не там, где нужно.
    в остальном все шикарно

    ОтветитьУдалить
  4. Уважаемый Анонимный, буду признателен, если Вы покажете мне какие "...ться" Вас смутили. Заранее благодарю.

    ОтветитьУдалить
  5. "components/com_helloworld/views/helloworld/" - это не опечатка случайно? если судить по архиву прикрепленному к данному посту каталог views должен располагаться в каталоге site.
    P.S.: Спасибо за отличные статьи!

    ОтветитьУдалить
  6. Ромчик, ты красава! По jооmla, на родном и могучем, даже не ожидал найти настолько ценной и актуальной информации... С англицким мануалом, я бы точно месяцок проковырялся. А тут, можно сказать за вечер освоил. Благодарствую.

    ОтветитьУдалить
  7. Не получается скачать файл с уроком.... :(

    ОтветитьУдалить
    Ответы
    1. Перезалил на другой файлообменник, качайте.

      Удалить
  8. Спасибо!
    Кстати upload.com.ua вообще перестал раздавать файлы.
    В следующих статья такая же беда..

    ОтветитьУдалить
    Ответы
    1. Да, я знаю. Даже свои файлы забрать нельзя и техподдержка их не отвечает. В ближайшее время я все перезалью. Извиняюсь за неудобства.

      Удалить
  9. Огромное спасибо за жизненноважные начинающему разработчику статьи! Такой вопрос - важен ли регистр в названиях? Ну папок, классов и т.п?

    ОтветитьУдалить
    Ответы
    1. Да, важен. Так же учтите, что есть буквы одинаково выглядящие в кирилице и латинице, но это разные буквы (например м, с и др.)

      Удалить