Использование JoiAdmin


JoiAdmin представляет собой библиотеку построения административных интерфейсов. Проще говоря - позволяет быстро создать админку для компонента. При этом админка будет уметь:

выводить список записей
создавать новую запись
редактировать существующую запись
удалять запись

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

Делать будем панель управления для небольшого компонента видео.
Начать стоит с создания структуры таблицы в базе данных и описания модели работы с этой базой.
Каждое видео у нас будет иметь:
- Название
- Описание
- Код плеера, это тот который предлагает скопировать YouTube, небольшой набор HTML тэгов
- Категория видео, категорий у нас будет немного: Личное, Общее и Разное.

Все эти сущности представляют собой набор полей в базе данных, в каждом из которых будут находиться своё значений. Давайте перенесём это в более понятный предмет для нашей базы данных:
- Название, поле не очень длинное, 250 символов хватит через край. Выберем для поля тип varchar длиной в 250 символов
- Описание может быть как небольшим, так и просто громадным. Перестрахуемся и выберем тип поля - text.
- Код плеера тоже поле не совсем однозначное, тип text.
- Категорию видео лучше записывать числом, это позволить в дальнейшем добавлять и менять названия категорий, в общем прозапас.
Помимо обозначенных полей добавим еще одно поле - ID, это поле с уникальным числом по которому можно будет однозначно идентифицировать наше видео. Тип поля для ID - integer длина - 11 символов. Названия полей сделаем более-менее понятными, у меня получилось так:

CREATE TABLE IF NOT EXISTS `jos_video` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(250) NOT NULL,
`description` text NOT NULL,
`html_code` text NOT NULL,
`catid` int(11) unsigned NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Теперь опишем это же, но уже в понятиях Joostina. для этого сначала создадим необходимую файловую структуру проекта ( смотреть  1ю серию руководства по по разработке компонентов ). Теперь в файле модели сделаем описание нашего класса видео:

class Video extends mosDBTable {
public $id;
public $title;
public $description;
public $html_code;
public $catid;

function  __construct() {
$this->mosDBTable('jos_video','id');
}
}

Video - это название нашего класса, без лишнего пафоса - просто Видео.
extends mosDBTable - обозначает что класс будет иметь все возможности по работе с базой данных mosDBTable. mosDBTable вообще представляет собой некую прослойку для представления записей в базе данных в виде объектов php, и все манипуляции с данными осуществляются через манипуляции с созданным объектом. В Joostina вообще вся работа с базой данных построена на таких объектах, большие люди иногда называют такой подход - ORM ( википедия расскажет подробнее что это такое ).
public $id; $title; $description; $html_code; $catid; - это те самые поля которые мы создали в нашей табличке видео, и в которых будут храниться данные по нашим видеофайлам. Такие элементы называются свойствами класса. Сколько в таблице полей - столько должно быть и свойств у созданного класса.

Табличку создали, модель данных в табличке описали, теперь надо создать функции для управления всем этим богатством. Перейдём в файл admin.video.php. Нам как минимум нужны будут функции:
- вывода списка видео
- создание нового видео
- редактирование существующего видео
- удаление видео

В этом процессе создание и редактирование - это по своей сути одинаковое действие, но в первом случае форма будет пустой, а во втором - форма будет уже заполнена данными из редактируемой записи. Поэтому функция будет для этих действий единая.

Создадим функции для выполнения всех обозначенных задач.

// для вывода списка видео
function index(){

}

// для редактирования и создания видео
function editVideo(){

}

// для сохранения созданного или отредактированного видео
function saveVideo(){

}

// для удаления видео
function deleteVideo(){

}

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

Всё сделали, радуемся.

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

Теперь собственно в дело вступается joiadmin, которым если ему толком рассказать - сделает всё в высшем свете и полных красках.
joiadmin собирает интерфейс на основе полей нашей таблицы, т.е. на свойствах объекта базы данных отвечающих за конкретную таблицу. Но библиотеке надо рассказать в каком виде и какой последовательности выводить элементы.
joiadmin хороший, и не беспокоит модель без надобности, и данные о интерфейсе будет искать только в функции get_fieldinfo(), которая должна находиться как раз в нашем класса-объекте Video. Т.е. как-то так:

public function get_fieldinfo() {
return array(
'id' => array(
'name' => 'ID',
'editable' => false,
'sortable' => false,
'in_admintable' => true,
'width' => '20px',
),
'title' => array(
'name' => 'Название видео',
'editable' => true,
'sortable' => true,
'in_admintable' => true,
'html_edit_element' => 'edit',
'html_table_element' => 'editlink',
),
'description' => array(
'name' => 'Описание видео',
'editable' => true,
'sortable' => true,
'in_admintable' => true,
'editlink' => true,
'html_edit_element' => 'text_area_wysiwyg',
'html_edit_element_param' => array(
'height' => 10,
)
),
'html_code' => array(
'name' => 'Код плеера',
'editable' => true,
'html_edit_element' => 'text_area',
),
'catid' => array(
'name' => 'Категория видео',
'editable' => true,
'sortable' => true,
'in_admintable' => true,
'html_edit_element' => 'option',
'html_edit_element_param' => array(
'options' => array(
0 => 'Личное',
1 => 'Общее',
2 => 'Разное',
)
),
),
);
}

Что значит этот громадный страшный массив - пока не спрашивайте, сам боюсь, но описание что и за что отвечает обязательно сделаю в ближайших сериях, пока просто доверьтесь.

Так же наша модель Video должна иметь функцию get_tableinfo, которая будет подсказывать библиотеке joiadmin какие названия давать страницам списка и редактирования видео. Опять же под мою ответственность:
public function get_tableinfo() {
return array(
'header_list' => 'Видео',
'header_new' => 'Создание видео',
'header_edit' => 'Редактирование видео'
);
}

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

Для работы всего указанного безобразия потребуется использование всех расширенных бибилиотек , а так же Joostina 1.3.1 SVN не ниже r606.