Вот этот модуль и вышел в бета-релиз. Пощупаем его в бою.
Для этого в качестве учебного примера добавим HL инфоблок «статьи», заполним его при помощи программного кода из другого обычного инфоблока, а также сделаем публичный вывод ленты плюс детальной страницы.
(!) Моменты, которые вызывали у меня огромное желание писать в wishlist,
я отметил восклицательным знаком.
[spoiler]
1/ Интерфейс
Вот и они:
Используем в нашей компании префикс “we_” в именах «посторонних» для битрикса таблиц.
(!) Первое, на что сразу обратил внимание: почему бы не сделать еще одно поле «имя сущности на-языках интерфейса (по-русски)» (я бы его Статьи сделал) и выводил бы его в левом меню для простого смертного (т.е. редактора сайта):
Уже было
Я добавляю два поля: заголовок обязательным, а также детальное описание. У обоих полей ставлю тип «строка».
(!) Чего еще очевидно не хватает из коробки – это пользовательского свойства с типом «HTML/ Text», чтобы визуальный редактор использовать. Кстати, этого и для разделов инфоблоков частенько не хватает, когда требуется в разделе какое-нибудь SEO-поле завести.
Форма редактирования настраивается, замечательно. Закладку обозвал «Статья», все добавляется:
2/ Заглянем «под капот», перенесем контент из обычного инфоблока «новости» во вновь созданный HL - Articles .
Сразу скажу, что ориентировался по коду доступных к данному модулю двум компонентам: highloadblock.list и highloadblock.view, а также на файл модуля highloadblock_row_edit.php
Код переносчика у меня получился такой:
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php"); // подключаем модули CModule::IncludeModule('iblock'); CModule::IncludeModule('highloadblock'); // необходимые классы use Bitrix\Highloadblock as HL; use Bitrix\Main\Entity; // hlblock у нас первый ), $hlblock - это массив $hlblock = HL\HighloadBlockTable::getById( 1 )->fetch(); // получаем сущность для работы с новым HL-блоком статей // (тип $entity - Bitrix\Main\Entity\Base) // меня сперва накрыло, см. ниже, но потом разъяснилось: // в этом месте еще одно важное действие происходит: // если класс датаМенеджер для работы с HL-инфоблоком не создан, то он в этом месте // создается автоматически через eval(), т.е. тут у меня создается класс // $entity_data_class.'Table' равный 'ArticlesTable' $entity = HL\HighloadBlockTable::compileEntity( $hlblock ); // затем получаем объект DataManager для работы с данными // $entity_data_class - это строка (!!!!) ArticlesTable // // (ОООООО!) вот тут меня накрыло: //--------- а как методы то вызываются, автозагрузчик все делает //--------- и создает класс ArticlesTable? // // ответ нашел - можно самому сделать класс ArticlesTable с нужными мне методами, // либо он будет создан, в методе HighloadBlockTable::compileEntity() $entity_data_class = $entity->getDataClass(); // такой вот комментарий для eclipse, чтобы подсказки работали /* @var $entity_data_class Bitrix\Main\Entity\DataManager */ $rs = CIBlockElement::GetList( array('ID' => 'ASC'), array('IBLOCK_ID' => 5), false, false, array('NAME', 'DETAIL_TEXT') ); while ($ar = $rs->Fetch()) { // у результата добавления тип Bitrix\Main\Entity\AddResult $result = $entity_data_class::add(array( 'UF_TITLE' => $ar['NAME'], 'UF_DETAIL_TEXT' => $ar['DETAIL_TEXT'] )); if ($result->isSuccess()) { echo 'ADDED ' . $result->getId() . "<br />"; } else { echo 'ERROR ADDED ' . implode(', ', $result->getErrors()) . "<br />"; } } require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_after.php"); |
После выполнения этого кода, все мои строки таблицы статей были созданы (30 штук):
(!) Опять же на скриншоте видно, что интерфейс ленты записей пока не приспособлен для работы с html-статьями и длинным текстом. Очень надеюсь, что это вопрос времени Очень надеюсь, что и тип пользовательского свойства HTML/ Text с визуальным редактором появится, и ленты будут удобными к использованию
(!) В обычных инфоблоках не нашел свойство привязку к HL-инфоблокам. Надеюсь это будет из коробки, но на крайний случай можно сделать свой тип свойства инфоблока «привязка к HightLoad-инфоблоку», хранить как число – а визуально показывать как список в админке простых инфоблоков.
2/ Заглянем «под капот», выведем статьи в публичную часть. Опробуем компоненты highloadblock.list и highloadblock.view
По-быстрому кидаю две страницы /hl/index.php и /hl/detail.php
Приятно, что про ссылки на детальные страницы не забыли, и такой параметр есть в ленте)
Заменяемые подстановки в урле на детальную страницу две - #ID# и #BLOCK_ID#
(!) Почему нет автокеширования в этих двух highloadblock.* компонентах?
(!) Это все важно, но не существенно: Постаничка в ленте есть, просто визуального параметра нет, он называется ROWS_PER_PAGE. Еще есть NAV_TEMPLATE, думаю понятно зачем. А вот для сортировки нет параметра, все из $_GET берется, не айс. Сео-Title бы еще в детальную…
Шаблоны компонентов highloadblock.* пока просто служебные: выводят таблицы сущностей как таблицы. Круто, что лента сортируется) Опять же весь детальный текст мне вывалился одним скопом.
Я кастомизировал шаблоны, получил такой вариант:
Думал не приводить здесь шаблоны, т.к. они элементарные, но решил показать, т.к. постраничка у меня не заработала, см. скриншот.
/hl/index.php
<?$APPLICATION->IncludeComponent( "bitrix:highloadblock.list", "articles", Array( "BLOCK_ID" => "1", "DETAIL_URL" => "/hl/detail.php?ID=#ID#", "ROWS_PER_PAGE" => 5, 'NAV_TEMPLATE' => '.default' ) );?> |
local\templates\.default\components\bitrix\highloadblock.list\articles.php
<? if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die(); foreach ($arResult['rows'] as $row) { $url = str_replace( array('#ID#', '#BLOCK_ID#'), array($row['ID'], intval($arParams['BLOCK_ID'])), $arParams['DETAIL_URL'] ); ?> <p><a href="<?=htmlspecialcharsbx($url)?>"><?=$row['UF_TITLE']?></a></p> <? } echo $arResult["NAV_STRING"]; ?> |
Чисто интуитивно думаю, что дело тут в не достаточно полной совместимости преобразования в компоненте bitrix\components\bitrix\highloadblock.list\component.php:
$main_query = new Entity\Query($entity); // … $result = $main_query->exec(); $result = new CDBResult($result); |
// select data $rsData = $entity_data_class::getList(array( "select" => $lAdmin->GetVisibleHeaderColumns(), "order" => array($by => strtoupper($order)) )); $rsData = new CAdminResult($rsData, $sTableID); $rsData->NavStart(); |
(!) Не работает постраничка в highloadblock.list. Хотел раскопать причину – но это выходит за рамки беглого взгляда на функционал, тем более проблема может быть локальной у меня.
3/ Заглянем «под капот», а что же в БД?
В БД мы имеем целиком такую таблицу с именем we_articles, с которым я ее создал на шаге добавления HL-инфоблока.
Я так полагаю, что необходимые индексы мы сами можем и должны спрогнозировать и добавить в эту таблицу.
Добавил к своим статьям еще одно поле «сортировка» с числовым типом, здорово, что это учли и тип поля в БД стал соответствующим:
(!) Однако при заполнении этого поля в админке вылетела ошибка:
Fatal error: Class 'Bitrix\Main\Entity\UpdateResult' not found in *\www\bitrix\modules\main\lib\entity\datamanager.php on line 404
Что поделаешь – бета версия (((
А вот сами HL-инфоблоки идут в таблице b_hlblock_entity (по-идее имена для интерфейса и админы можно сделать через таблицу b_hlblock_entity_lang):
Ну а поля и их настройки идут в пользовательских свойствах, т.е. в таблице b_user_field:
4/ Итог
Сперва хочу сказать «спасибо» сотрудникам компании Битрикс за труд - изменений в D7 с точки зрения разработчика много. Спасибо вам за то, что вы взяли на себя эту трудную ношу по созданию нового ядра
Я ждал, действительно ждал, этого релиза. Не могу сказать, что разочарован – скорее рад, что наконец дождался
Модуль highloadblock выглядит достаточно привлекательно – для функционала партнерам часто приходится прибегать к созданию сторонних таблиц в БД. Замечательно, что это все будет стандартизировано и возможно «из коробки».
Думаю, после проработки множества реальных сценариев использования, highloadblock станет замечательным модулем. А в данной статье я попытался дать обратную связь именно по необходимым мне самому сценариям
Очень надеюсь, что так и будет,
Спасибо за внимание