Выборки

Для того, чтобы осуществлять поиск по объектам и страницам, в систему введены "Выборки" (umiSelection). Выборка это определенным образом сформированное правило для поиска по базе, которое потом передается в класс umiSelectionsParser для получения результата.

Замечание

Для поиска по базе используйте только API системы, так как мы можем в любой момент изменить структуру таблиц (сохраняя совместимость API). Более того, используя API, вы не всегда работаете с MySQL. Использование только функций API делает ваши модули переносимыми.

Самый простой вариант выборки это поиск всех объектов определенного типа. Найдем всех пользователей в системе и посчитаем их количество.

<?php
 header("Content-type: text/html; charset=utf-8");
 include "standalone.php";
 
 /*
  Документация: работа с выборками. Поиск всех объектов по типу.
 */
 
 //Получаем id типа данных
 $objectTypes = umiObjectTypesCollection::getInstance();
 $objectTypeId = $objectTypes->getBaseType("users", "user");
 
 //Создаем выборку
 $sel = new umiSelection;
 $sel->addObjectType($objectTypeId); //Устанавливаем фильтр по типу данных
 
 //Получаем результаты
 $result = umiSelectionsParser::runSelection($sel); //Массив id объектов
 $total = umiSelectionsParser::runSelectionCounts($sel); //Количество записей
 
 //Выводим список пользователей на экран
 $objects = umiObjectsCollection::getInstance();
 foreach($result as $userId) {
  $object = $objects->getObject($userId);
  echo "Найден пользователь с логином \"", $object->getValue("login"), "\"<br />\n";
 }
 echo "<hr />Всего найдено ", $total, " пользователей";
?>

В свежеустановленной системе результат обычно такой.

Найден пользователь с логином "lyxsus"
Найден пользователь с логином "Гость"
Всего найдено 2 пользователей

Усложним предыдущую задачу и добавим условие: выберем только пользователей с логином "lyxsus".

<?php
 header("Content-type: text/html; charset=utf-8");
 include "standalone.php";
 
 /*
  Документация: работа с выборками. Поиск объектов по значению свойства.
 */
 
 //Получаем id типа данных
 $objectTypes = umiObjectTypesCollection::getInstance();
 $objectTypeId = $objectTypes->getBaseType("users", "user");
 $objectType = $objectTypes->getType($objectTypeId);
 
 //Создаем и подготавливаем выборку
 $sel = new umiSelection;
 $sel->addObjectType($objectTypeId); //Устанавливаем фильтр по типу данных
 
 //Добавляем поиск по точному совпадению свойства
 $sel->addPropertyFilterEqual($objectType->getFieldId('login'), 'lyxsus');
 
 //Получаем результаты
 $result = umiSelectionsParser::runSelection($sel); //Массив id объектов
 $total = umiSelectionsParser::runSelectionCounts($sel); //Количество записей
 
 //Выводим список пользователей на экран
 $objects = umiObjectsCollection::getInstance();
 foreach($result as $userId) {
  $object = $objects->getObject($userId);
  echo "Найден пользователь с логином \"", $object->getValue("login"), "\"<br />\n";
 }
 echo "<hr />Всего найдено ", $total, " пользователей";
?>

В моем случае результат - 1 пользователь.

Найден пользователь с логином "lyxsus"
Всего найдено 1 пользователей

Теперь попробуем искать не объекты, а страницы. Выведем все новости из определенной ленты новостей.

<?php
 header("Content-type: text/html; charset=utf-8");
 include "standalone.php";
 
 /*
  Документация: работа с выборками. Поиск страниц.
 */
 
 //Получаем id иерархического типа
 $hierarchyTypes = umiHierarchyTypesCollection::getInstance();
 $hierarchyType = $hierarchyTypes->getTypeByName("news", "item");
 $hierarchyTypeId = $hierarchyType->getId();
 
 //Получаем id раздела, в котором будем искать
 $hierarchy = umiHierarchy::getInstance();
 $parentElementId = $hierarchy->getIdByPath('/vse_novosti/novosti_ekonomiki/');
 
 //Создаем и подготавливаем выборку
 $sel = new umiSelection;
 $sel->addElementType($hierarchyTypeId); //Добавляет поиск по иерархическому типу
 $sel->addHierarchyFilter($parentElementId); //Устанавливаем поиск по разделу
 $sel->addPermissions(); //Говорим, что обязательно нужно учитывать права доступа
 
 //Получаем результаты
 $result = umiSelectionsParser::runSelection($sel); //Массив id объектов
 $total = umiSelectionsParser::runSelectionCounts($sel); //Количество записей
 
 //Выводим список новостей в разделе /vse_novosti/novosti_ekonomiki/' на экран
 foreach($result as $userId) {
  $element = $hierarchy->getElement($userId);
  echo "Найдена новость \"", $element->getValue("h1"), "\"<br />\n";
 }
 echo "<hr />Всего найдено ", $total, " новостей";
?>
Найдена новость "Ограничения во взаимной торговле стимулируют потребительский спрос"
Найдена новость "Экономисты отмечают явные признаки стабилизации рынка"
Найдена новость "Главный санитарный врач предлагает пугать курильщиков до смерти"
Всего найдено 3 новостей

А теперь изменим предыдущий пример, добавив сортировку по полю "publish_time".

<?php
 header("Content-type: text/html; charset=utf-8");
 include "../standalone.php";
 
 /*
  Документация: работа с выборками. Поиск страниц с сортировкой по свойству.
 */
 
 //Получаем id иерархического типа
 $hierarchyTypes = umiHierarchyTypesCollection::getInstance();
 $hierarchyType = $hierarchyTypes->getTypeByName("news", "item");
 $hierarchyTypeId = $hierarchyType->getId();
 
 //Получаем базовый тип данных для новостей
 $objectTypes = umiObjectTypesCollection::getInstance();
 $objectTypeId = $objectTypes->getTypeByHierarchyTypeId($hierarchyTypeId);
 $objectType = $objectTypes->getType($objectTypeId);
 
 //Получаем id раздела, в котором будем искать
 $hierarchy = umiHierarchy::getInstance();
 $parentElementId = $hierarchy->getIdByPath('/vse_novosti/novosti_ekonomiki/');
 
 //Создаем и подготавливаем выборку
 $sel = new umiSelection;
 $sel->addElementType($hierarchyTypeId); //Добавляет поиск по иерархическому типу
 $sel->addHierarchyFilter($parentElementId); //Устанавливаем поиск по разделу
 $sel->setOrderByProperty($objectType->getFieldId('publish_time'), false); //Сортируем по свойству
 $sel->addPermissions(); //Говорим, что обязательно нужно учитывать права доступа
 
 //Получаем результаты
 $result = umiSelectionsParser::runSelection($sel); //Массив id объектов
 $total = umiSelectionsParser::runSelectionCounts($sel); //Количество записей
 
 //Выводим список новостей в разделе /vse_novosti/novosti_ekonomiki/' на экран
 foreach($result as $userId) {
  $element = $hierarchy->getElement($userId);
  echo "Найдена новость \"", $element->getValue("h1"), "\"<br />\n";
 }
 echo "<hr />Всего найдено ", $total, " новостей";
?>

Порядок страниц в результате будет отличаться.

Найдена новость "Онищенко предлагает пугать курильщиков до смерти"
Найдена новость "Белоруссия отменит квоты на сигареты из России"
Найдена новость "Россия и Белоруссия отказались от ограничений во взаимной торговле"
Всего найдено 3 новостей

Замечание

Обратите внимание, что метод runSelection() может вернуть как массив из id объектов, так и массив из id страниц, в зависимости от переданных в выборку параметров. Это влияет на то, какую коллекцию мы используем umiObjectsCollection или umiHierarchy (id у объектов и страниц разные).

Замечание

Несмотря на то, что системы обычно правильно определяет, ищем мы объекты или страницы, можно принудительно задать тип результата. Для этого нужно выполнить на выборке метод forceHierarchyTable().