51  /  330

Архитектура модуля

Просмотров: 6117 (Статистика ведётся с 06.02.2017)

В отличие от модуля Информационные блоки в модуле Highload-блоки предусматривается хранение каждой сущности в своей таблице, то есть формально не принадлежат какому-либо модулю. Поля сущностей - это пользовательские свойства ядра. Сущности конструируются в административном интерфейсе, т.е. без дополнительного программирования.

Поскольку модуль работает на новом ядре, то доступ к данным будет предоставляться на основе ORM.

Разнесение данных может быть не только по таблицам одной базы данных, но в принципе оно может быть и по разным базам данных. Таким образом, становится возможным горизонтальное масштабирование проекта, когда одни объекты живут на одном сервере, а другие - на другом.

В модуле Highload-блоки добавлена поддержка концепции NoSQL на основе базы данных MySQL. Соединение с базой данных предусмотрено как с помощью расширения handlersocket для MySQL, так и без него. Если используется handlersocket, то необходимо произвести дополнительные настройки.

Highloadblock и handlersocket

Допустим, что в проекте сконфигурирована поддержка NoSQL, стоят все необходимые драйверы к MySQL и в конфигурации ядра указано соединение через эти драйверы. В результате модуль Highload-блоки позволяет создавать сущности и строить проект так, чтобы очень быстро осуществлялась выборка из базы через драйвер по первичному ключу.

Чтобы воспользоваться ORM-сущностью для Highload-блоков, необходимо выполнить следующие действия:

  • Инициализировать сущность в системе:
    //сначала выбрать информацию о ней из базы данных
    $hldata = Bitrix\Highloadblock\HighloadBlockTable::getById($ID)->fetch();
    
    //затем инициализировать класс сущности
    $hlentity = Bitrix\Highloadblock\HighloadBlockTable::compileEntity($hldata);
    
  • Дальше можно создавать запросы с данной сущностью:
    $query = new Entity\Query($hlentity);
    
    или использовать ее через интерфейс DataManager:
    $hlDataClass = $hldata['NAME'].'Table';
    $hlDataClass::getList();
    

Вся дальнейшая работа с Highload-блоками подчиняется законам ORM, поскольку созданная в модуле Highload-блоки сущность является ORM-сущностью.

Модуль включает в себя два компонента: список записей сущностей (highloadblock.list) и детальный просмотр сущности (highloadblock.view).

Привязка справочника

Привязка справочника к Highload-блоку осуществляется через свойства USER_TYPE_SETTINGS. В них указывается имя таблицы.

Привязка значений свойств идет по UF_XML_ID (поле должно быть обязательно заполнено), иначе значения свойства "справочник" не сохраняются у элемента.

Несколько примеров работы с Highload-блоками

<?
//Подготовка:
if (CModule::IncludeModule('highloadblock')) {
   $arHLBlock = Bitrix\Highloadblock\HighloadBlockTable::getById(1)->fetch();
   $obEntity = Bitrix\Highloadblock\HighloadBlockTable::compileEntity($arHLBlock);
   $strEntityDataClass = $obEntity->getDataClass();
}

//Добавление:
if (CModule::IncludeModule('highloadblock')) {
   $arElementFields = array(
      'UF_NAME' => $arPost['name'],
      'UF_MESSAGE' => $arPost['message'],
      'UF_DATETIME' => new \Bitrix\Main\Type\DateTime
   );
   $obResult = $strEntityDataClass::add($arElementFields);
   $ID = $obResult->getID();
   $bSuccess = $obResult->isSuccess();
}

//Получение списка:
if (CModule::IncludeModule('highloadblock')) {
   $rsData = $strEntityDataClass::getList(array(
      'select' => array('ID','UF_NAME','UF_MESSAGE','UF_DATETIME'),
      'order' => array('ID' => 'ASC'),
      'limit' => '50',
   ));
   while ($arItem = $rsData->Fetch()) {
      $arItems[] = $arItem;
   }
}
?>

Выбор случайного значения:

$q = new Entity\Query($entity);
       $q->setSelect(array('*'));
       $q->setFilter($arFilter);
       $q->setLimit(1);
       $q->registerRuntimeField(
           'RAND', array('data_type' => 'float', 'expression' => array('RAND()'))
       );
       $q->addOrder("RAND", "ASC");
       $result = $q->exec();

43
Курсы разработаны в компании «1С-Битрикс»

Если вы нашли неточность в тексте, непонятное объяснение, пожалуйста, сообщите нам об этом в комментариях.
Развернуть комментарии