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