Печать
Категория: Программирование joomla
Просмотров: 22482

 

В предыдущем уроке мы научились работать с базой данных и получать информацию из базы данных и выводить ее. Но наш компонент все еще не умеет изменять или добавлять новые записи в таблицу базы данных.

В этом уроке добавим к компоненту "Hello" в раздел Администратора интерфейс, с помощью которого можно будет работать  с записями в таблице базы данных.

В предыдущем уроке мы научились работать с базой данных и получать информацию из базы данных и выводить ее. Но наш компонент все еще не умеет изменять или добавлять новые записи в таблицу базы данных.

В этом уроке добавим к компоненту “Hello” в раздел Администратора интерфейс, с помощью которого можно будет работать  с записями в таблице базы данных.


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

Основная среда панели администратора очень похожа на часть сайта. Основной точкой входа в администраторскую часть компонента есть файл 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();

?>

Представлением и моделью, соответственно, views/hellos/view.html.php и models/hellos.php. Начнем с модели.

Hellos Model

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

Класс JModel имеет встроенный защищенный метод _getList(). С помощью этого метода мы можем получить список записей из базы данных.

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

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

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

Метод _buildQuery() просто возвращает запрос. Код этого метода таков:

/**
 * Возвращает запрос
 * @return string Строка запроса, используемая для получения строки из базы данных
 */
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;
}

Полностью файл models/hellos.php будет иметь вид:

/**
<?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;
    }
}


Создание представления Hellos

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

Наше представление имеет три уровня: первый получает данные из модели, второй вставляет данные в шаблон, и третий отображает метод display для отображения вывода (файл views/hellos/view.html.php):

<?php
/**
 * 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);
    }
}

Создание шаблона Hellos

Шаблон должен получать данные из представления и формировать вывод. Шаблон будет иметь вид простой таблицы, которая создается с помощью тегов html (файл views/hellos/tmpl/default.php):

<?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>

В коде шаблона мы создали форму, в которой содержится таблица с количеством рядков, которое будет зависеть от переменной items .

Теперь мы закончили создание каркаса представления. Административный раздел нашего компонента должен содержать пять файлов:
admin.hello.php
controller.php
models/hellos.php
views/hellos/view.html.php
views/hellos/tmpl/default.php

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

Рис. 5.1. Внешний вид компонента в админ-панели.

Рис. 5.1. Внешний вид компонента в админ-панели.

Добавление функциональности к интерфейсу администратора

Мы создали только что администраторский раздел компонента, который только отображает содержимое базы данных.

Теперь добавим кнопки «Удалить записи», «Изменить записи» и «Создать новые записи» в админ-панель. Также добавим заголовок для панели инструментов.

Это можно сделать в представлении. Для добавления кнопок будем использовать статические методы из класса JToolBarHelper.

Код для представления выглядит так:

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

В этом коде метод deleteList() может принимать три параметра: первый параметр является строкой, спрашивающей пользователя о подтверждении удаления. Второй параметр есть задача, которая отправляется вместе с запросом (по умолчанию "remove"), а третий - текст, отображаемый под кнопкой.

Методы editListX() и addNewX() могут получать два дополнительных параметра. Первый - задача (по умолчанию - соответственно, edit и add), второй параметр - текст, отображаемый под кнопкой.

В первой строке для отображения заголовка используется метод JText::_. Метод JText::_ ищет текстовую строку в языковом файле компонента и возвращает переведенную строку. Если перевод не найден, функция возвращает строку, переданную ей. Поэтому, если компонент нужно перевести на другой язык, то нужно создать языковый файл, включающий строки и их перевод на требуемый язык.

Создаем флажки и ссылки

Созданные выше две кнопки будут управлять существующими записями. Чтобы задать, какими записями в базе данных нам нужно управлять, необходимо добавить флажки в таблицу, чтобы пользователь мог выбрать необходимые записи. Это будет реализовано в нашем шаблоне.

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

<th width="20">
    <input type="checkbox" name="toggle" value="" onclick="checkAll();" />
</th>


В этом коде Javascript-функция checkAll встроена в основной пакет Joomla и предоставляет нужную нам функциональность.

Добавить флажки в каждую строку будем с помощью класса JHTML, в котором есть метод JHTML::_(), который создаст для нас флажки. Добавим следующие строки в наш цикл:

$checked    = JHTML::_('grid.id',   $i, $row->id );

после строчки

$row = >$this->items[$i];

Затем добавим ячейку между двумя имеющимися:

<td>
    <?php echo $checked; ?>
</td>

Теперь добавим ссылку, позволяющую перейти непосредственно к форме редактирования. Следующие строки добавим после вызова метода JHTML::_() для создания ссылки HTML:

$link = JRoute::_( 'index.php?option=com_hello>controller=hello>task=edit>cid[]='. $row->id );

Добавляем ссылку в ячейку, отображая текст:

<td>
    <a href="/"><?php echo $row->greeting; ?></a>
</td>

Эта ссылка указывает на контроллер hello, который обработает данные наших приветствий.

В нашем шаблоне, который мы создали выше, есть четыре скрытых поля внизу формы. Первое поле имеет имя option. Второе - task. Оно получает данные в случае нажатия одной из кнопок на панели инструментов. В случае удаления этого поля будет получена ошибка Javascript и кнопки не будут работать. Третье поле - boxchecked. Оно хранит количество отмеченных флажков. Кнопки редактирования и удаления проверяют условие превышения этой величиной нуля, в противном случае не позволяя отправление данных формы. Четвертое поле - это поле контроллера, используемое для определения того, что данные, отправленные из этой формы, будут обработаны контроллером hello.

Теперь полный код файла default.php будет такой:

<?php 
/**
 * Default admin hello view for Hello World Component
 * 
 * @package    Joomla.Tutorials
 * @subpackage Components
 * @link http://dev.joomla.org/component/option,com_jd-wiki/Itemid,31/id,tutorials:modules/
 * @license        GNU/GPL
 */

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 width="20">   <!-- checkbox to check all items -->
                <input type="checkbox" name="toggle" value="" onclick="checkAll(  );" /> 
            </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];
        $checked = JHTML::_('grid.id', $i, $row->id );     //get checkbox HTML        
        // get link HTML to edit task for this greeting
        $link = JRoute::_( 'index.php?option=com_hello>controller=hello>task=edit>cid[]='. $row->id );        
    ?>
        <tr class="<?php echo "row$k"; ?>">
            <td>
                <?php echo $row->id; ?>
            </td>
            <td>
                <?php echo $checked; ?>
            </td>
            <td>
                <a href="/"><?php echo $row->greeting; ?></a>
            </td>
        </tr>
    <?php
        $k = 1 - $k;   //switch row class
    }
    ?>
    </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>

Теперь мы закончили роботу с представлением hellos. Можно запустить компонент, чтобы увидеть результаты.

Рис. 5.2. Компонент в админ-панели с дополнительным столбцом для флажков.

Рис. 5.2. Компонент в админ-панели с дополнительным столбцом для флажков.

Добавление функций к контроллеру Hello

В нашем компоненте контроллер сейчас отображает только представление. Но мы должны иметь возможность выполнять задачи, запускаемые из представления Hellos: «добавить», «изменить» и «удалить».

Фактически, функции для «добавить» и «изменить» являются одним и тем же заданием: они обе отображают пользователю форму, которая позволяет редактировать приветствие. Они лишь отличаются тем, что для «добавить» отображается пустая форма, а для «изменить» - форма с данными. Выполнение задачу «добавить» будет делаться с помощью обработчика задачи «изменить». Это указывается в нашем конструкторе:

 /**
 * constructor (registers additional tasks to methods)
 * @return void
 */
function __construct()
{
    parent::__construct();

    // Регистрация дополнительных задач 
    $this->registerTask( 'add'  ,     'edit' );
}

Первый параметр JController::registerTask является задачей, второй - метод ее выполнения.

Сначала рассмотрим задачу «изменить». В этом случае контроллер указывает представление и макет для загрузки (в нашем случае представление hello и макет формы). Чтобы предотвратить оставление открытых несохраненных записей мы также укажем Joomla отключить главное меню во время изменения приветствия.

Наш обработчик задачи «изменить» таков:

/**
 * display the edit form
 * @return void
 */
function edit()
{
    JRequest::setVar( 'view', 'hello' );
    JRequest::setVar( 'layout', 'form'  );
    JRequest::setVar('hidemainmenu', 1);

    parent::display();
}

Создание представления Hello

Представление Hello должно отображать форму, позволяющую пользователю редактировать приветствие. Метод display должен выполнять несколько простых операций:

  1. получить данные из модели;
  2. создать панель инструментов;
  3. поместить данные в шаблон;
  4. вызвать метод display() для обрисовки шаблона.

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

Чтобы определить, создается ли новая запись, или редактируется существующая, мы для записи введем поле id, которое будет изменяться, если задачей является редактирование. Если это новая задача, значит, его значение не будет установлено.

На панель инструментов также добавим две кнопки: «save» и «cancel». Функциональность кнопок будет практически одинаковой, но в зависимости от текущей задачи отображаться будут разные кнопки. Для новой записи будет отображаться кнопка cancel, а в случае изменения существующей - кнопка close.

Итак, метод display будет выглядеть так:

/**
 * display method of Hello view
 * @return void
 **/
function display($tpl = null)
{
    //получаем приветствие
    $hello        => $this->get('Data');
    $isNew        = ($hello->id < 1);

    $text = $isNew ? JText::_( 'New' ) : JText::_( 'Edit' );
    JToolBarHelper::title(   JText::_( 'Hello' ).': <small><small>[ ' . $text.' ]</small></small>' );
    JToolBarHelper::save();
    if ($isNew)  {
        JToolBarHelper::cancel();
    } else {
        // для существующих записей кнопка переименовывается на `close`
        JToolBarHelper::cancel( 'cancel', 'Close' );
    }

    $this->assignRef('hello',        $hello);
    parent::display($tpl);
}

Создание модели Hello

Для представления в нашем компоненте необходимы данные. Поэтому нужно создать соответствующую модель.

У нашей модели будут два свойства: _id и _data. _id будет хранить идентификатор приветствия, _data - данные.

Создадим конструктор, который получает _id из запроса:

/**
 * Constructor that retrieves the ID from the request
 *
 * @access    public
 * @return    void
 */
function __construct()
{
    parent::__construct();

    $array = JRequest::getVar('cid',  0, '', 'array');
    $this->setId((int)$array[0]);
}

Для получения данных из запроса используется метод JRequest::getVar(). Первым параметром является имя переменной формы. Второй параметр - значение по умолчанию для присвоения в случае, если значение не найдено. Третий параметр - это имя хэша для получения значения из get, post, и т.д., и последнее значение - тип данных, который следует установить для значения.

Конструктор получит первое значение из массива cid и присвоит его _id.

Метод setId() может использоваться для установки _id. Изменение _id, на которое указывает наша модель, означает, что указывает на неправильные данные.

Следовательно, устанавливая значение _id, мы очищаем свойство _data:

/**
 * Method to set the hello identifier
 *
 * @access    public
 * @param    int Hello identifier
 * @return    void
 */
function setId($id)
{
    // Устанавливаем id и удаляем данные
    $this->_id        = $id;
    $this->_data    = null;
}

Наконец, нам нужен метод для получения _data: getData().

Метод getData проверит, установлено ли значение свойства _data. Если да, он просто возвратит его. В ином случае будут получены данные из базы данных.

/**
 * Method to get a hello
 * @return object with data
 */

function &getData()
{
    // Загружаем данные
    if (empty( $this->_data )) {
        $query = ' SELECT * FROM #__hello '.
                '  WHERE id = '.$this->_id;
        $this->_db->setQuery( $query );
        $this->_data = $this->_db->loadObject();
    }
    if (!$this->_data) {
        $this->_data = new stdClass();
        $this->_data->id = 0;
        $this->_data->greeting = null;
    }
    return $this->_data;
}


Создание формы

Теперь нам осталось создать форму для ввода и редактирования данных. Поскольку мы определили макет как форму, то форма будет размещена в файле каталога tmpl представления hello под именем form.php:

<?php defined('_JEXEC') or die('Доступ ограничен!'); ?>

<form action="index.php" method="post" name="adminForm" id="adminForm">
<div class="col100">
    <fieldset class="adminform">
        <legend><?php echo JText::_( 'Details' ); ?></legend>
        <table class="admintable">
        <tr>
            <td width="100" align="right" class="key">
                <label for="greeting">
                    <?php echo JText::_( 'Greeting' ); ?>:
                </label>
            </td>
            <td>
                <input class="text_area" type="text" name="greeting" id="greeting" size="32" maxlength="250" value="" />
            </td>
        </tr>
    </table>
    </fieldset>
</div>

<div class="clr"></div>

<input type="hidden" name="option" value="com_hello" />
<input type="hidden" name="id" value="" />
<input type="hidden" name="task" value="" />
<input type="hidden" name="controller" value="hello" />
</form>


В этой форме в дополнение к полю ввода присутствует скрытое поле для id. Мы просто помещаем его в форму, так как пользователь не должен изменять id.

Реализация функций

Сейчас наш контроллер выполняет только две задачи: «создание» и «изменение». Также компонент имеет кнопки также для сохранения, удаления записей, и отмены. Теперь нужно написать соответствующий код для задач, которые будут выполняться при нажимании на эти кнопки.

Сохранение записи

Для реализации сохранения записи необходимо использовать выбор для обработки различных ситуаций, например, различия между созданием новой записи (запрос INSERT), и обновлением существующей записи (запрос UPDATE).

Фреймворк Joomla! облегчает выполнение многих задач. Класс JTable упрощает управление записями в базе данных без необходимости заботится о написании SQL-кода, лежащего в основе этих операций. Он также облегчает перенос данных из HTML-форм в базу данных.

Создание класса Table

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

Вот как выглядит наш класс JTable:

<?php
/**
 * Hello World table class
 * 
 * @package    Joomla.Tutorials
 * @subpackage Components
 * @link http://dev.joomla.org/
 * @license        GNU/GPL
 */

// Прямой доступ отсутствует
defined('_JEXEC') or die('Доступ ограничен!');

/**
 * Hello Table class
 *
 * @package    Joomla.Tutorials
 * @subpackage Components
 */
class TableHello extends JTable
{
    /**
     * Primary Key
     *
     * @var int
     */
    var $id = null;

    /**
     * @var string
     */
    var $greeting = null;

    /**
     * Constructor
     *
     * @param object Database connector object
     */
    function TableHello(> $db) {
        parent::__construct('#__hello', 'id', $db);
    }
}
?>


В этом коде мы определили два поля: идентификатор и приветствие. Затем был определен конструктор, вызывающий конструктор родительского класса и передающий ему имя таблицы (#__hello), имя поля, являющегося первичным ключом (id), и объект конектора базы данных.

Этот файл нужно назвать hello.php и поместить в каталог tables в администраторском разделе нашего компонента.

Реализация функций в нашей модели

Теперь мы можем добавить метод в модель для сохранения записи. Назовем этот метод store(). Этот метод будет выполнять три вещи: помещать данные из формы в объект TableHello, проверять корректность сформированной записи и сохранять запись в базе данных.

Код метода будет выглядеть так:

/**
 * Method to store a record
 *
 * @access    public
 * @return    boolean    True on success
 */
function store()
{
    $row => $this->getTable();

    $data = JRequest::get( 'post' );
    // Переносим данные из полей формы в таблицу hello
    if (!$row->bind($data)) {
        $this->setError($this->_db->getErrorMsg());
        return false;
    }

    // Проверяем, корректна ли запись
    if (!$row->check()) {
        $this->setError($this->_db->getErrorMsg());
        return false;
    }

    // Сохраняем таблицу в базу данных
    if (!$row->store()) {
        $this->setError($this->_db->getErrorMsg());
        return false;
    }

    return true;
}


Этот метод добавляется в модель hello.

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

Первая строка получает ссылку на объект JTable. Если таблица названа правильно, мы можем не указыватья имя - класс JModel знает, где его искать. Как вы помните, мы назвали наш класс таблицы TableHello и поместили его в файл hello.php в каталоге tables. Если вы следовали этим рекомендациям, класс JModel создаст объект автоматически.

Вторая строка получает данные из формы. Класс JRequest делает эту операцию очень легкой. В данном случае мы получаем все переменные, переданные с помощью метода POST. Они возвращаются в виде ассоциативного массива.

Остальное просто - мы получаем, проверяем и сохраняем. Метод bind() копирует значения из массива в соответствующие свойства объекта таблицы. В данном случае он копирует значения идентификатора и приветствия в объект TableHello.

Метод check() выполняет проверку данных. В классе JTable() этот метод просто возвращает true. Пока он не представляет какого-либо значения, но в будущем он позволит проверять данные с помощью класса TableHello. Этот метод может быть переназначен в классе TableHello методом, выполняющим необходимые проверки.

Метод store() будет помещать данные из объекта в базу данных. Если id равно нулю, будет создана новая запись (INSERT), в противном случае он обновит существующую запись (UPDATE). Добавление задачи в контроллер

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

/**
 * save a record (and redirect to main page)
 * @return void
 */
function save()
{
    $model = $this->getModel('hello');

    if ($model->store()) {
        $msg = JText::_( 'Приветствие сохранено!' );
    } else {
        $msg = JText::_( 'Ошибка сохранения приветствия' );
    }

    // Проверяем, возможно ли изменение таблицы....
    $link = 'index.php?option=com_hello';
    $this->setRedirect($link, $msg);
}


Здесь нам нужно вызвать метод store() модели. Затем следует использовать метод setRedirect() для перенаправления к списку приветствий. Также мы задаем сообщение, которое будет отображено вверху страницы.

Удаление записи и реализация функции в модели

В модели получаем список ID для удаления и вызываем класс JTable для их удаления:

/**
 * Method to delete record(s)
 *
 * @access    public
 * @return    boolean    True on success
 */
function delete()
{
    $cids = JRequest::getVar( 'cid', array(0), 'post', 'array' );
    $row => $this->getTable();

    foreach($cids as $cid) {
        if (!$row->delete( $cid )) {
            $this->setError( $row->getErrorMsg() );
            return false;
        }
    }                        

    return true;
}

Для получения данных из запроса мы вызываем метод JRequest::getVar(), затем вызываем метод delete() для удаления каждой строки. Сохраняя ошибки в модели, мы обеспечиваем возможность получить их позже, если потребуется.

Выполнение задачи удаления в контроллере

Удаление похоже на метод save(), выполняющий сохранение:

/**
 * remove record(s)
 * @return void
 */
function remove()
{
    $model = $this->getModel('hello');
    if(!$model->delete()) {
        $msg = JText::_( 'Error: One or More Greetings Could not be Deleted' );
    } else {
        $msg = JText::_( 'Приветствие удалено' );
    }

    $this->setRedirect( 'index.php?option=com_hello', $msg );
}

Отмена операции редактирования

Все, что нужно для прерывания операции редактирования - перенаправление на главное представление:

/**
 * cancel editing a record
 * @return void
 */
function cancel()
{
    $msg = JText::_( 'Операция прервана' );
    $this->setRedirect( 'index.php?option=com_hello', $msg );
}

Заключение

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

 



Предыдущие уроки по Основах программирования для Joomla 1.5:

Введение

Урок 1. Основы функционирования Joomla 1.5

Урок 2. Создание простейшего компонента для Joomla 1.5

Урок 3. Добавление Модели

Урок 4. Использование Базы Данных