====== Основы 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 шаблон и передаст его в объект-действие. Этот шаблон будет выглядеть приблизительно так:

"{$title}"

 
На самом деле, каждое действие получает ссылку на объект View, однако он используется нечасто, так как LIMB использует концепцию активного шаблона (pull). ===== Передача объектов внутри системы ===== Объекты сайта передаются внутри LIMB в виде массивов, и обращаются в объекты только по необходимости. Это позволяет значительно экономить на времени выполнения и облегчает многие задачи, к примеру, таким образом объекты передаются в шаблон что позволяет обращаться к их аттрибутам непосредственно из шаблонной системы WACT.