====== Основы Limb2 ======
===== Что такое объект сайта (site object)? =====
Основная единица архитектуры LIMB - это объект сайта (**site object**). Каждый элемент данных в LIMB является объектом сайта, будь то документ или сообщение в гостевой.
Все объекты сайта иерархически организованы в виде единого дерева.
Объект сайта характеризуется набором аттрибутов. Наиболее важны следующие:
* **node_id** - целочисленное, указывает на элемент в дереве, к которому объект сайта прикреплен.
* **id** - целочисленное, определяет уникальный идентификатор объекта
* **identifier** - строка, позволяет строить наглядные пути до объекта в дереве.
* **title** - строка, позволяет называть каждый объект понятным образом.
//Зачем нужны и 'node_id', и 'id'? Предполагалось, что объекты сайта будут иметь возможность крепиться к нескольким элементам дерева. Пока этой функциональности нет, и она вряд ли появится, однако рефакторинг был бы слишком большим. В основном используется 'node_id'.//
Есть 2 способа получить определенный объект сайта:
* по полному пути в дереве, который состоит из идентификаторов объектов, разделенных /, например /catalog/TDD/refactoring.
* по его node_id, например /?node_id=92
===== Что такое контентный объект (content object)? =====
В ядро Limb включены 2 типа объектов сайта:
* **простой объект сайта (site object)**
* **контентный объект (content object)**.
Основные отличия у них в том, что контентный объект находится под простым версионным контролем, плюс базовая реализация контентного объекта привязана к записи в дополнительной таблицы базы данных.
Пример объекта сайта //статья// (article):
1,
'can_be_parent' => 0,
);
}
}
?>
===== Что такое контроллер объекта сайта (site object controller)? =====
Каждый объект сайта соединен с каким-либо контроллером, который определяет, какие действия объект может выполнять.
Пример контроллера:
array(
'template_path' => '/article/display.html',
),
'admin_detail' => array(
'template_path' => '/admin/object_detail_info.html',
'popup' => true,
'JIP' => true,
'img_src' => '/shared/images/admin_detail.gif',
'action_name' => strings :: get('detail_info'),
),
'print_version' => array(
'template_path' => '/article/print_version.html',
'action_name' => strings :: get('print_version_action', 'document'),
'display_in_breadcrumbs' => false,
),
'edit' => array(
'popup' => true,
'JIP' => true,
'action_name' => strings :: get('edit_article', 'article'),
'action_path' => '/article/edit_article_action',
'template_path' => '/article/edit.html',
'img_src' => '/shared/images/edit.gif'
),
'publish' => array(
'popup' => true,
'JIP' => true,
'action_name' => strings :: get('publish'),
'action_path' => '/doc_flow_object/set_publish_status_action',
'img_src' => '/shared/images/publish.gif',
'can_have_access_template' => true,
),
'unpublish' => array(
'popup' => true,
'JIP' => true,
'action_name' => strings :: get('unpublish'),
'action_path' => '/doc_flow_object/set_publish_status_action',
'img_src' => '/shared/images/unpublish.gif',
'can_have_access_template' => true,
),
'delete' => array(
'JIP' => true,
'popup' => true,
'action_name' => strings :: get('delete_article', 'article'),
'action_path' => '/article/delete_article_action',
'template_path' => '/site_object/delete.html',
'img_src' => '/shared/images/rem.gif'
),
);
}
}
?>
===== Что такое действие (action)? =====
Действия отвечают за выполнение некоторой логики приложения. По сути, это класс, который инстанциируется контроллером для вызова метода perform(&$request, &$response). Как видно из сигнатуры, в метод perform приходят объекты запроса(request) и ответа(response), используя которые можно получить входные параметры HTTP запроса и повлиять на формирование определенного ответа приложения клиенту.
То, какое действие должно выполниться, определяется контроллером при помощи параметра 'action' из переменной $_REQUEST, поэтому следующий код:
http://somedomain.com/documents/article1?action=edit
приведет к тому, что найдется site_object по пути в дереве 'documents/article1', затем определится прикрепленный к нему контроллер и затем контроллер попытается исполнить действие edit
Рассмотрим внимательнее 'edit' раздел контроллера. Обратите внимание на параметр 'action_path', который определяет путь до класса-действия (в нашем случае это будет '/article/edit_article_action.class.php'). Для пути до класса-действия применяется специальная техника резолвинга путей.
Итак, содержимое '/article/edit_article_action.class.php':
'content',
'annotation' => 'annotation',
'author' => 'author',
'source' => 'source',
'uri' => 'uri',
)
);
}
function _init_validator()
{
parent :: _init_validator();
$this->validator->add_rule(new required_rule('title'));
$this->validator->add_rule(new required_rule('author'));
$this->validator->add_rule(new required_rule('article_content'));
}
}
?>
LIMB содержит определенное количество классов для базовых действий, поэтому обычно разработчику необходимо отнаследоваться от одного из таких действий, в данном случае таковым выступает form_edit_site_object_action, который специализируется на редактировании site_object'ов
===== Что такое шаблон для действия? =====
Также в разделе 'edit' контроллера у нас описан необязательный аттрибут 'template_path' как '/article/edit.html'. Контроллер в этом случае при выполнении действия, инициализирует WACT шаблон и передаст его в объект-действие.
Этот шаблон будет выглядеть приблизительно так:
На самом деле, каждое действие получает ссылку на объект View, однако он используется нечасто, так как LIMB использует концепцию активного шаблона (pull).
===== Передача объектов внутри системы =====
Объекты сайта передаются внутри LIMB в виде массивов, и обращаются в объекты только по необходимости. Это позволяет значительно экономить на времени выполнения и облегчает многие задачи, к примеру, таким образом объекты передаются в шаблон что позволяет обращаться к их аттрибутам непосредственно из шаблонной системы WACT.