RSS   Twitter   Copiny   Copiny
Нашел ошибку? 

Выдели фрагмент текста с ошибкой или неточностью и нажми Ctrl+Enter!

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

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

Основная среда панели администратора очень похожа на 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-файл инсталляции и посмотреть, что получится!

Смотрите также:
Комментарии (9) Добавить комментарий
  • Daniel
    Daniel
    06 Сентября 2011, 02:30
     ↑  0  ↓     ответ

    А где рабочий пример, может кто-то выложить?

  • Ivan
    Ivan
    04 Октября 2011, 14:46
     ↑  0  ↓     ответ

    Админы выложите пример, плиз!

  • Юрий
    Юрий
    26 Ноября 2011, 22:34
     ↑  0  ↓     ответ

    Нууу, так все хорошо шло в предыдущих уроках, а тут поленились! Где код контролера, где рабочий вариант, можно было бы описать назначение вот этих строк:

    JToolBarHelper::title( JText::_( 'Hello Manager' ), 'generic.png' );

    JToolBarHelper::deleteList();

    JToolBarHelper::editListX();

    JToolBarHelper::addNewX();

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

    • smet.denis
      smet.denis (админ)
      26 Ноября 2011, 23:13
       ↑  0  ↓     ответ

      JToolBarHelper статический класс, который отвечает за вывод элементов управления в шапке компонента:

      - выводит иконку компонента и его название

      - выводит кнопку удаления

      - выводит кнопку редактирования

      - добавить новый

      кнопки дополнительно отправляют список id выбранных элементов, например для удаления.

      P.S посмотрите шаг 5 и 6 ;)

  • Юрий
    Юрий
    26 Ноября 2011, 23:24
     ↑  +1  ↓     ответ

    кому надо работающий компонент от этого урока, вот ссылка:

    profsolution.net/com_hello_4.zip

  • Никита
    Никита
    01 Декабря 2011, 15:40
     ↑  0  ↓     ответ

    Зачем нужна функция _buildQuery() и зачем сохранять результат запроса, если обычно после получения данных их и без того сохраняют в массив?

  • Илья
    Илья
    14 Марта 2013, 02:09
     ↑  +1  ↓     ответ

    Что за хрень? Раз:

    <?php echo "row$k"; ?>

    и Два:

    $k = 1 - $k;

    $k это что?

  • Александр
    Александр
    22 Марта 2013, 13:44
     ↑  0  ↓     ответ

    Это чередования четных и нечетных классов для строчек. Короче говоря цвет строчек будет чередоваться, как зебра :)

  • Юрий
    Юрий
    12 Апреля 2014, 21:59
     ↑  0  ↓     ответ

    Администраторы, молодцы, отличные уроки!

    по возможности киньте ссылку на компонент к этому уроку , та которая выше не работает

Оставить комментарий




* обязательно для заполнения

1 введенный почтовый адрес используется только для обратной связи при ответах в комментариях и сервиса gravatar.com
.