Выборки

Для того, чтобы осуществлять поиск по объектам и страницам, в систему введены "Выборки" (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().

Была ли данная статья полезна?