Главная Случайная страница


Категории:

ДомЗдоровьеЗоологияИнформатикаИскусствоИскусствоКомпьютерыКулинарияМаркетингМатематикаМедицинаМенеджментОбразованиеПедагогикаПитомцыПрограммированиеПроизводствоПромышленностьПсихологияРазноеРелигияСоциологияСпортСтатистикаТранспортФизикаФилософияФинансыХимияХоббиЭкологияЭкономикаЭлектроника






Разработка компонента с административной частью

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

 

Краткие теоретические сведения:

 

Добавим к компоненту “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();

?>

 

Представлением и моделью будут hellos view и the hellos model. Начнем с модели.

Модель Hellos

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

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

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

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

_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;

}

 

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

<?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() для отображения.

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

<?php

/**

* Hellos View for Hello World Component

*

* @package Joomla.Tutorials

* @subpackage Components

* @link http://dev.joomla.org/

* @license GNU/GPL

*/

 

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-файл инсталляции и посмотреть, что получится.

 

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

Пока наш административный раздел не очень полезен. Он не делает ничего, кроме отображений содержимого базы данных.

Для добавления полезных функций необходимо добавить несколько кнопок и ссылок.

 

Панель инструментов

В административной части отображается панель инструментов. Нашему компоненту она также необходима. Joomla облегчает ее создание. Добавим кнопки «Удалить записи», «Изменить записи», и «Создать новые записи». Также добавим заголовок, который будет отображаться на нашей панели инструментов.

Это можно сделать, добавив немного кода в представление. Чтобы добавить кнопки, используем статические методы из класса 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(<?php echo count( $this->items ); ?>);" />

</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 $link; ?>"><?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( <?php echo count($this->items); ?> );" />

</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 );

$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 $link; ?>"><?php echo $row->greeting; ?></a>

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

 

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

 

Расширение возможностей административной части

После того как представление Hellos завершено, необходимо изменить представление и модель Hello. Настоящая работа выполняется именно здесь.

 

Контроллер 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 должен выполнять несколько простых операций:

- получить данные из модели;

- создать панель инструментов;

- поместить данные в шаблон;

- вызвать метод 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, на которое указывает наша модель, означает, что points указывает на неправильные данные. Следовательно, устанавливая значение 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="<?php echo $this->hello->greeting;?>" />

</td>

</tr>

</table>

</fieldset>

</div>

 

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

 

<input type="hidden" name="option" value="com_hello" />

<input type="hidden" name="id" value="<?php echo $this->hello->id; ?>" />

<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

{

var $id = null;

 

var $greeting = null;

 

/**

* Constructor

*

* @param object Database connector object

*/

function TableHello(> $db) {

parent::__construct('#__hello', 'id', $db);

}

}

?>

 

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

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

 

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

Теперь можно добавить метод в модель для сохранения записи. Назовем этот метод store. Метод 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 для создание панелей кнопок в компоненте для предоставления стандартного вида для различных компонентов.

 


На рисунках 13.1, 13.2 показана установка созданного расширения.

 

Рисунок 13.1 – Установка модуля

Рисунок 13.2 – Сообщение об успешной установке

На рисунках 13.3 - 13.7 показано работа с компонентом в административной части.

 

Рисунок 13.3 – Ссылка на расширение в списке компонентов

Рисунок 13.4 – Просмотр записей в административной части

Рисунок 13.5 – Просмотр первой записи

Рисунок 13.6 – Просмотр второй записи

Рисунок 13.7 – Просмотр третьей записи

На рисунке 13.8 показано добавление ссылки на расширение в главное меню сайта.

Рисунок 13.8 – Добавление ссылки на компонент в главное меню сайта

На рисунке 13.9 показана работа созданного компонента на главной странице сайта.

Рисунок 13.9 – Отображение компонента на главной странице

Задание к работе:

Ознакомиться с теоретическим материалом.

Внести изменения в шаблон компонента CMS Joomla - файл com_hello4.zip.

Подключить компонент через панель управления.

Изучить работу компонента на главной странице сайта.

Оформить отчет согласно требованиям.

Отчет должен содержать:

Название и цель работы.

Ход работы с детальным описанием выполненных действий с рисунками.

Экранные формы браузера с загруженными страницами.

Выводы о проделанной работе.

 

Вопросы для подготовки к защите работы:

Каким образом создаются и используются несколько Контроллеров?

Какая структура компонента при использовании нескольких Контроллеров?

В каких случаях необходимо использовать несколько Контроллеров?

Каким образом автоматизируется обработка данных из базы?

Каким образом компонент получает доступ к панели инструментов?


Лабораторная работа №11

 

Разработка приложения с помощью технологии ASP.NET

 

Цель работы: изучение среды разработки Web-приложений Visual Studio 2005 и элементов диалога. Cоздание динамических страниц. Рассмотрение структуры проекта.

 

Теоретические сведения

Microsoft .NET Framework — это платформа для создания, развертывания и запуска web-сервисов и приложений. Она предоставляет высокопроизводительную, основанную на стандартах многоязыковую среду, которая позволяет интегрировать существующие приложения с приложениями и сервисами следующего поколения, а также решать задачи развертывания и использования интернет-приложений. .NET Framework состоит из трех основных частей — общеязыковой среды выполнения (common language runtime), иерархического множества унифицированных библиотек классов и компонентной версии ASP, называемой ASP .NET.

ASP .NET — это часть технологии .NET, используемая для написания мощных клиент-серверных интернет-приложений. Она позволяет создавать динамические страницы HTML. ASP .NET возникла в результате объединения более старой технологии ASP (активные серверные страницы) и .NET Framework. Она содержит множество готовых элементов управления, применяя которые, можно быстро создавать интерактивные web-сайты. Вы также можете использовать сервисы, предоставляемые другими сайтами, прозрачно для пользователей вашего сайта. В общем, возможности ASP .NET ограничены только вашим воображением

В 2000 году на конференции разработчиков в качестве части новой технологии .NET Microsoft представила ASP+. С выходом .NET Framework 1.0 она стала называться ASP .NET.

ASP .NET — это не продолжение ASP. Это концептуально новая технология Microsoft, созданная в рамках идеологии .NET. В ASP .NET заложено все для того, чтобы сделать весь цикл разработки web-приложения более быстрым, а поддержку — более простой. ASP .NET основана на объектно-ориентированной технологии, но сохранила модель разработки asp: вы создаете программу и помещаете ее в директорию, выделенную сервером, и она будет работать. В ASP .NET появилось много новых функций, а существовавшие ранее в asp значительно усовершенствованы.

В ASP .NET используются компилируемые языки. Во время компиляции проверяется синтаксическая корректность исходного текста. Скомпилированный в промежуточный язык код выполняется быстрее, и он будет таким же независимо от языка, который мы используем. Компилируемые языки поддерживают строгую типизацию.

Компиляция происходит на сервере в момент первого обращения пользователя к странице. Если программист изменил текст страницы, программа перекомпилируется автоматически. При написании кода можно использовать набор компонентов, поставляемых с .NET.

Платформа .NET Framework предоставляет приложениям среду выполнения, сама непосредственно взаимодействуя с операционной системой. Выше лежит интерфейс ASP .NET-приложений, на котором в свою очередь базируются web-формы (ASP .NET-страницы) и web-сервисы. Интерфейс .NET Framework позволяет стандартизировать обращение к системным вызовам и предоставляет среду для более быстрой и удобной разработки. CLR обеспечивает единый набор сервисов для всех языков.

ASP .NET использует технологию доступа к данным ADO .NET, которая обеспечивает единый интерфейс для доступа к базам данных SQL Server и файлам XML. Кроме того, усиленная модель безопасности позволяет обеспечивать защиту клиента и сервера от несанкционированного доступа.

В 2004 году появилась версия ASP .NET 2.0 (бета-версия, окончательный выход - конец 2005 — начало 2006 гг.). Как утверждается, эта версия позволяет сократить объем кодирования на 70%. Новые возможности версии 2.0 - использование шаблонов дизайна страниц (Master Page), упрощенная локализация web-приложений, более 50 новых серверных элементов управления. Цели, которые преследовали разработчики новой версии, — повысить скорость разработки сайтов, масштабируемость, легкость поддержки и администрирования сайтов, скорость работы сервера. Появилась панель оснастки MMC (консоль управления Microsoft), предоставляющая графический интерфейс для управления настройками ASP .NET. Изменять настройки проекта теперь можно и через web-интерфейс. ASP .NET 2.0 поддерживает работу на 64-битных процессорах. Сервис персонализации (personalization) предоставляет готовое решение для хранения персональных данных, непосредственно характеризующих пользователя сайта, — так называемого профиля пользователя (Profile).

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

Предыдущие версии Visual Studio для проектов ASP .NET требовали наличия на машине разработчика сервера IIS. Теперь сервер встроен в среду разработки.

ASP .NET 2.0 и Visual Studio 2005 предоставляют инструменты для легкого построения локализируемых сайтов, которые определяют предпочитаемый язык пользователя и посылают ему страницы на его языке.

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

В ASP .NET 2.0 встроена технология автоматического обновления кэширования баз данных. Данные, полученные из базы, хранятся на сервере, и он не обращается к базе для обработки повторного запроса. При изменении базы данных кэш обновляет свое содержимое.

ASP .NET - это технология, а не язык, и позволяет программировать на разных языках - С#, Visual Basic, J#. "В платформе .NET все языки равны, но некоторые - равнее" (Дж. Оруэлл). Вот таким языком и является С#, потому что он был специально создан для этой платформы. Программирование C# позволяет в полной мере использовать концепции, методы и паттерны объектно-ориентированной разработки. Язык Visual Basic 8.0 наделен почти теми же возможностями. Чтобы научиться ASP .NET, вам нужно знать основы HTML, а знание asp не обязательно. Оно может даже помешать, так как придется менять образ мышления. Также для понимания желательно знать CSS и JavaScript.

Первый проект

В начале решите, в какой директории будете создавать страницы. Все файлы, находящиеся в одной директории, считаются единым проектом. Запустите выбранную вами среду разработки. Выберите пункт меню File-New-Website. Появится диалоговое окно. Назначьте в нем имя проекта и выберите язык программирования С#.

По умолчанию проект создается в файловой системе. По желанию его можно создать на HTTP или FTP-сервере. Из файловой системы проект всегда можно скопировать на сервер нажатием одной кнопки в заголовке Solution Explorer.

В проекте будет создана страница default.aspx. Выберите ее, и появится окно редактирования с закладками Design и Source. Не меняя ничего, щелкните на кнопке со стрелкой, чтобы просмотреть страницу в браузере. Появится окно, в котором спрашивается, нужно ли добавить в файл web.config возможность отладки. Нажмите "OK". На панели задач должен появиться значок web-сервера. Откроется браузер, показывающий страницу по адресу http://localhost:номер_порта/Website1/default.aspx. "Localhost" обозначает сервер, работающий на в

Последнее изменение этой страницы: 2016-07-23

lectmania.ru. Все права принадлежат авторам данных материалов. В случае нарушения авторского права напишите нам сюда...