Модуль поиска + ORM + множественное наследование
Впервые для себя попробовал множественное наследование на php 7. Встала задача засунуть данные из ORM классов в модуль поиска. Множественное наследование пригодилось весьма кстати. Получилась, на мой взгляд, простая, удобная конструкция. ORM классы, которые нужно индексировать, имеют поля active, name, preview_text или description. По аналогии с инфоблоками, на основе этих полей мне нужно индексировать данные.
С начало нужен trait содержащий необходимые методы для удобного управления индексированием в модуле search
reIndex(int $id, array $arFields) - принимает два параметра id самой записи ORM-а и массив параметров для метода CSearch::Index модуля поиска
delIndex(int $id) - принимает id записи самого ORM-а (не id в модуле search)
reIndexAll() - (пере)индексирует все записи ORM класса
updateSearchIndex(Entity\Event $event) - метод используется в методах событий ORM - классов. После изменения/добавления и принимает $event этих событий
в качестве $MODULE_ID необходимый для метода CSearch::Index используется имя запускаемого ORM класса.
Если мне нужны какие то другие поля или логика индексирования , всегда можно переопределить нужные методы в классе самого ORM-а.
Теперь собственно пример ORM класса
Поиск
Какие еще варианты ? Критика приветствуется !
Впервые для себя попробовал множественное наследование на php 7. Встала задача засунуть данные из ORM классов в модуль поиска. Множественное наследование пригодилось весьма кстати. Получилась, на мой взгляд, простая, удобная конструкция. ORM классы, которые нужно индексировать, имеют поля active, name, preview_text или description. По аналогии с инфоблоками, на основе этих полей мне нужно индексировать данные.
С начало нужен trait содержащий необходимые методы для удобного управления индексированием в модуле search
<?php namespace Vendor\Module; use Bitrix\Main\Entity; use Bitrix\Main\Loader; trait Search { /** * (Пере)индексирует запись * @param int $id * @param array arFields массив $arFields необходимый для метода CSearch::Index * @return bool * @throws \Bitrix\Main\LoaderException */ public static function reIndex(int $id, array $arFields) { if (!Loader::includeModule('search')) return false; $arFields['SITE_ID'] = ['s1']; $arFields['DATE_CHANGE'] = date('d.m.Y H:i:s'); \CSearch::Index( __CLASS__, $id, $arFields ); return true; } /** * Удаляет запись из поискового индекса модуля search * @param int $id * @return bool * @throws \Bitrix\Main\LoaderException */ public static function delIndex(int $id) { if (!Loader::includeModule('search')) return false; \CSearch::DeleteIndex( __CLASS__, $id ); return true; } public static function reIndexAll() { if (!Loader::includeModule('search')) return false; \CSearch::DeleteIndex(__CLASS__, '%'); foreach (self::getList()->fetchAll() as $row) { if ($row['active'] == 'Y'){ self::reIndex($row['id'], [ "TITLE" => $row['name'], "BODY"=> $row['description'] ?: $row['preview_text'], "PARAM1" => $row['parent_id'] ]); } else { self::delIndex($row['id']); } } } /** * Обертка для вызова из функции событий ORM класса. * @param Entity\Event $event * @throws \Bitrix\Main\LoaderException */ protected static function updateSearchIndex(Entity\Event $event) { $fields = $event->getParameter("fields"); $id = $event->getParameter("primary")["id"]; if (isset($fields['active']) && isset($fields['name']) && (isset($fields['description']) || isset($fields['preview_text'])) ) { if ($fields['active'] == 'Y') { $arFields = [ "TITLE" => $fields['name'], "URL" => '#', "BODY"=> $fields['description'] ]; if (isset($fields['parent_id'])) { $arFields["PARAM1"] = $fields['parent_id']; } self::reIndex($id, $arFields); } else { self::delIndex($id); } } } } |
reIndex(int $id, array $arFields) - принимает два параметра id самой записи ORM-а и массив параметров для метода CSearch::Index модуля поиска
delIndex(int $id) - принимает id записи самого ORM-а (не id в модуле search)
reIndexAll() - (пере)индексирует все записи ORM класса
updateSearchIndex(Entity\Event $event) - метод используется в методах событий ORM - классов. После изменения/добавления и принимает $event этих событий
в качестве $MODULE_ID необходимый для метода CSearch::Index используется имя запускаемого ORM класса.
Если мне нужны какие то другие поля или логика индексирования , всегда можно переопределить нужные методы в классе самого ORM-а.
Теперь собственно пример ORM класса
<?php namespace Vendor\Module; use Bitrix\Main\Entity; use Bitrix\Main\Type; class TestTable extends Entity\DataManager { use Search; //наследуем trait .... public static function onAfterDelete(Event $event) { $primary = $event->getParameter("primary"); self::delIndex($primary['id']); parent::onAfterDelete($event); } public static function onAfterAdd(Entity\Event $event) { self::updateSearchIndex($event); parent::onAfterAdd($event); } public static function onAfterUpdate(Entity\Event $event) { self::updateSearchIndex($event); parent::onAfterUpdate($event); } } |
Поиск
$obSearch = new CSearch; $obSearch->Search(array( "QUERY" => 'Строка поиска', "SITE_ID" => 's1', "MODULE_ID" => "Vendor\Module\TestTable" )); while($ob = $obSearch->GetNext()) { print_r($ob); } |
Какие еще варианты ? Критика приветствуется !