Печать

Создание MVC компонента Joomla 1.5 - Интерфейс администратора

Создание основной структуры

Основная среда панели администратора очень похожа на front-end. Точкой входа в администраторскую часть компонента является admin.hello.php. Этот файл идентичен файлу hello.php, который используется на сайте, кроме того, что имя загружаемого контроллера, изменено на HellosController. Контроллер по умолчанию также называется controller.php, и является идентичным контроллеру по умолчанию в части сайта, с тем отличием, что контроллер называется HellosController вместо HelloController. Эта разница означает, что контроллер JController по умолчанию будет загружать список наших приветствий.

Код для файла admin.hello.php:

<?php
/**
 * @package    Joomla.Tutorials
 * @subpackage Components
 * @link http://dev.joomla.org/
 * @license    GNU/GPL
*/
// прямой доступ отсутствует
defined( '_JEXEC' ) or die( 'Restricted access' );
// Добавляем основной контроллер
require_once( JPATH_COMPONENT.DS.'controller.php' );
// При необходимости добавляем специальный контроллер
if($controller = JRequest::getVar( 'controller' )) {
    require_once( JPATH_COMPONENT.DS.'controllers'.DS.$controller.'.php' );
}
// Создаем контроллер
$classname    = 'HellosController'.$controller;
$controller   = new $classname( );
// Выполняем задачу из Request
$controller->execute( JRequest::getVar( 'task' ) );
// Переадресация, если указано в контроллере
$controller->redirect();
?> 

Представлением и моделью, с которых мы начнем, будут, соответственно, hellosView и hellosModel.

Класс Hellos Model

Модель Hellos будет очень простой. Единственным действием, нужным нам сейчас, является возможность получения списка приветствий из базы данных. Это действие будет выполняться в методе getData().

Класс JModel имеет встроенный защищенный метод _getList(). Этот метод может использоваться для упрощения задачи получения списка записей из базы данных. Мы должны просто выполнить запрос, и он возвратит список записей.

Позже может возникнуть необходимость использовать запрос в другом методе. Таким образом, создадим приватный метод _buildQuery(), который возвратит запрос, передаваемый методу _getList(). Это облегчает изменение запроса, поскольку он вызывается из одного и того же места.

Таким образом, в нашем классе нужны 2 метода: getData() и _buildQuery().

_buildQuery() просто возвращает запрос. Это выглядит примерно так:

function _buildQuery()
{
    $query = ' SELECT * '
           . ' FROM #__hello ';
    return $query;
}

getData() получает запрос и извлекает записи из базы данных. Может случиться, что нам потребуется дважды получить этот список при одной загрузке страницы. Будет расточительством получать этот список дважды. Таким образом, метод должен сохранять полученные данные в защищенном свойстве, чтобы на последующий запрос он мог просто возвращать полученные ранее данные. Это свойство будет называться _data.

Ниже представлен метод getData():

/**
 * Получение данных
 * @return array Массив объектов, содержащий данные из базы
 */
function getData()
{
    // Загрузка данных, если они еще не были загружены
    if (empty( $this->_data ))
    {
        $query = $this->_buildQuery();
        $this->_data = $this->_getList( $query );
    }
    return $this->_data;
}

Полностью модель выглядит так:

<?php
/**
 * Модель Hellos для компонента Hello World
 * 
 * @package    Joomla.Tutorials
 * @subpackage Components
 * @link http://dev.joomla.org/
 * @license        GNU/GPL
 */
// Проверьте, включен ли этот файл в Joomla!
defined('_JEXEC') or die();
jimport( 'joomla.application.component.model' );
/**
 * Hello Model
 *
 * @package    Joomla.Tutorials
 * @subpackage Components
 */
class HellosModelHellos extends JModel
{
    /**
     * Hellos data array
     *
     * @var array
     */
    var $_data;
    /**
     * Возвращает запрос
     * @return string запрос, используемый для извлечения строк из базы данных
     */
    function _buildQuery()
    {
        $query = ' SELECT * '
            . ' FROM #__hello '
        ;
        return $query;
    }
    /**
     * Получение данных 
     * @return array Массив объектов, содержащий данные из базы
     */
    function getData()
    {
        // Загружаем данные, если они еще не загружены
        if (empty( $this->_data ))
        {
            $query = $this->_buildQuery();
            $this->_data = $this->_getList( $query );
        }
        return $this->_data;
    }
}

Файл сохранен как models/hellos.php.

Представление Hellos

Теперь, когда у нас есть модель для получения данных, нужно отобразить полученные данные. Это представление будет похожим на отображение с раздела сайта.

Поскольку наша модель была автоматически описана в сайте, она принадлежит администратору. Методы, использующие get в модели, доступны с помощью метода get() класса JView. Итак, наше представление имеет три уровня: один получает данные из модели, другой вставляет данные в шаблон, и третий отображает метод display для отображения вывода. Вот что у нас получилось:

/**
 * Hellos View for Hello World Component
 * 
 * @package    Joomla.Tutorials
 * @subpackage Components
 * @link http://dev.joomla.org/
 * @license        GNU/GPL
 */
// Проверьте, включен ли этот файл в Joomla!
defined('_JEXEC') or die();
jimport( 'joomla.application.component.view' );
/**
 * Hellos View
 *
 * @package    Joomla.Tutorials
 * @subpackage Components
 */
class HellosViewHellos extends JView
{
    /**
     * Hellos view display method
     * @return void
     **/
    function display($tpl = null)
    {
        JToolBarHelper::title(   JText::_( 'Hello Manager' ), 'generic.png' );
        JToolBarHelper::deleteList();
        JToolBarHelper::editListX();
        JToolBarHelper::addNewX();
        // Get data from the model
        $items = $this->get( 'Data');
        $this->assignRef('items', $items);
        parent::display($tpl);
    }
} 

Этот файл сохранен как views/hellos/view.html.php.

Шаблон Hellos

Шаблон будет получать данные из представления и формировать вывод. Отобразим этот вывод в простой таблице. Поскольку таблица очень проста, в администраторе нам понадобится минимальное количество дополнительной логики для выполнения циклов с данными.

Вот наш шаблон:

<?php defined('_JEXEC') or die('Restricted access'); ?>
<form action="index.php" method="post" name="adminForm">
<div id="editcell">
    <table class="adminlist">
    <thead>
        <tr>
            <th width="5">
                <?php echo JText::_( 'ID' ); ?>
            </th>
            <th>
                <?php echo JText::_( 'Greeting' ); ?>
            </th>
        </tr>            
    </thead>
    <?php
    $k = 0;
    for ($i=0, $n=count( $this->items ); $i < $n; $i++)
    {
        $row = $this->items[$i];
        ?>
        <tr class="<?php echo "row$k"; ?>">
            <td>
                <?php echo $row->id; ?>
            </td>
            <td>
                <?php echo $row->greeting; ?>
            </td>
        </tr>
        <?php
        $k = 1 - $k;
    }
    ?>
    </table>
</div>
<input type="hidden" name="option" value="com_hello" />
<input type="hidden" name="task" value="" />
<input type="hidden" name="boxchecked" value="0" />
<input type="hidden" name="controller" value="hello" />
</form> 

Этот шаблон сохранен как views/hellos/tmpl/default.php.

Обратите внимание: вывод заключен в форму. Сейчас это не является необходимым, но скоро понадобится.

Мы завершили основную часть первого представления, добавив пять файлов в администраторский раздел нашего компонента.:

  • admin.hello.php
  • controller.php
  • models/hellos.php
  • views/hellos/view.html.php
  • views/hellos/tmpl/default.php

Вы можете добавить эти файлы в XML-файл инсталляции и посмотреть, что получится!

Интересная статья? Поделись ей с другими: