====== Операции по загрузке объектов ====== ==== Основы загрузки в системе Limb ==== Итак, Вы познакомились с основами Limb. Идея активных объектов сайта, помещенных в объектное дерево, занимает центральное место в Limb. Вполне обоснованным является вопрос: "Как можно запросить все эти объекты?". Этот маленький раздел документации предоставит некоторые ответы. ==== Загрузчик (Fetcher) ==== В Limb все запросы к объектам сайта выполняются через специальный механизм //загрузчика//. Обычно выделяют 2 типа операций загрузки: * запрос на единичный объект * запрос на множество объектов Есть несколько способов оьратиться к дереву объектов: * через путь в дереве * через идентификатор объекта (node_id) * через набор элементов (set of nodes) * через URI текущего запроса Загрузчик не только получает объекты сайта, но также применяет [[.access_policy| Систему прав]] и возвращает **ТОЛЬКО** доступные для текущего пользователя объекты сайта. //Для Вашего удобства все методы выборки (загрузки) могут быть вызваны через уникально именованные глобальные функции.// ==== Подробности ==== Перед описанием доступных методов загрузки необходимо кратко описать сам механизм загрузки в Limb. То, что выполняет загрузчик, может быть представлено последовательностью следующих шагов: * Найти объект сайта в объектном дереве на основе какого-либо критерия. * Применить правила политики доступа с целью определения доступности запрошенного объекта. * Вызвать указанный для объекта сайта метод **fetch()** для обеспечения корректной загрузки специфичных для объкта данных. Только в редких случаях Вам потребуется переопределять базовое поведение объекта сайта. Это относится только ко сложным объектам сайта (content objects). Поэтому мы выделили только несколько таких вариантов. Один из них - загрузка объекта изображения, когда Вам необходимо загрузить дополнительную информацию о вариантах изображения. * Вызвать указанный для объекта метод **count()**, чтобы позволить объекту сайта подсчитать общее количество загруженных объектов. Limb никогда не получает полный результирующий набор: это может быть смертельно для PHP. Все операции выборки ограничены на уровне базы данных. Это очень важно, так как позволяет использовать очень эффективные, ограничненные по количеству, запросы. В общем, архитектура системы не подразумевает, что Вам потребуется переопределить базовое поведение. ==== Жажда скорости ==== Медлительность объектов в PHP хорошо известна, объекты значительно увеличивают нагрузку. Именно по этой причине все операции загрузки возвращают массивы, а не объекты. Такое поведение оказалость особенно полезным для шаблонов WACT. Массивы объектов попадают в компоненты шаблона и Вы можете естественным способом обращаться к атрибутам объекта. Вы также можете легко превратить эти массивы в полноценные объекты, вызвав специальную функцию: wrap_with_site_object($fetched_data) //В документации мы ссылаемся на **загруженные объекты**, а не на **загруженные массивы** - мы надеемся это ни кого сильно не запутает// ==== Запрос к единичному объекту ==== В классе загрузчика (fetcher class) есть три метода, позволяющие загрузить единичный объект сайта: === загрузка объекта по идентификатору узла (node id) === fetch_one_by_node_id($node_id) возвращает загруженный объект, связанный с указанным в $node_id значением идентификатора узла === загрузка объекта по пути === fetch_one_by_path($path) возвращает загруженный объект, связанный с заданным путем (например, объект сайта, связанный с путем '/root/article/1' может быть загружен вызовом fetch_one_by_path('/root/article/1')) === Загрузка запрошенного объекта === fetch_mapped_by_url() возвращает объект связанный с URL запроса. Также можно получить объект через обычный URL к объекту http://domain.com/root?node_id=$id. ==== Загрузка множества объектов (набора) ==== Загрузка множества объектов отличается от загрузки единичного. С целью увеличения скорости, так как возвращаются однородные объекты и вызывать методы загрузки и подсчета для каждого слишком накладно, методы //выборки// и //подсчета// вызываются только для одного //загрузчика// - объект сайта. Что это значит? На практике редко нужны все уникальные атрибуты всех объектов в загружаемом наборе (например, различные варианты изображений объекта изображения) Технически это возможно, однако... попробуйте представить, что произойдет, если загрузить все дерево объектов! Есть 4 метода для одновременной загрузки группы объектов сайта: === Загрузка объектов одного класса === fetch($loader_class_name, &$counter, $params = array(), $fetch_method = 'fetch') возвращает набор выбранных объектов, загруженных объектом $loader_class_name (обычно 'объект сайта'!) через вызов его метода загрузки ($fetch_method). В переменную $counter записывается общее число загруженных элементов. Переменная $params позволяет Вам определить предел, смещение и т.д. Пример: $params = array('limit' => 10, 'offset' => 1); $counter = 0; $users =& fetch('user_object', $counter, $params); === Загрузка ветви дерева === fetch_sub_branch($path, $loader_class_name, &$counter, $params = array(), $fetch_method = 'fetch_by_ids') возвращает набор выбранных объектов, загруженных объектом класса $loader_class_name(обычно 'объект сайта') из дерева объектов начиная с размещения в $path, через его метод $fetch_method. В переменную $counter записывается общее число выбранных элементов. Переменная $params позволяет Вам определить предел, смещение и т.д. Пример: $params = array('limit' => 10, 'offset' => 1, 'depth' => 1); $counter = 0; $user_groups =& fetch_sub_branch('/root/user_groups', 'user_group', $counter, $params); === Загрузка по идентификаторам узлов (node_ids) === fetch_by_node_ids($node_ids, $loader_class_name, &$counter, $params = array(), $fetch_method = 'fetch_by_ids') возвращает набор выбранных объектов, загруженных объектом класса $loader_class_name(обычно 'объект сайта'), указанных через массив идентификаторов узлов $node_ids через вызов метода $fetch_method. В переменную $counter записывается общее число выбранных элементов. Переменная $params позволяет Вам определить предел, смещение и т.д. Пример: $counter = 0; $user_groups =& fetch_by_node_ids(array(10,11), 'user_group', $counter); === Загрузка по идентификаторам объектов === fetch_by_ids($object_ids, $loader_class_name, &$counter, $params = array(), $fetch_method = 'fetch_by_ids') возвращает набор выбранных объектов, загруженных объектом класса $loader_class_name(обычно 'объект сайта') указанных через массив идентификаторов объектов $object_ids через вызов метода $fetch_method. В переменную $counter записывается общее число выбранных элементов. Переменная $params позволяет определить предел, смещение и т.д. Пример: $counter = 0; $user_groups =& fetch_by_ids(array(100,81), 'user_group', $counter);