|
Настраиваемые таблицы
Данный модуль позволяет создавать настраиваемые таблицы в элементах инфоблока и в пользовательских полях главного модуля.
Ознакомиться с продуктом подробнее вы можете, пройдя по ссылке.
Возможности таблиц позволяют добавлять тип свойства инфоблока:
|
- Строка;
- Текст;
- Список;
- Дата/Время;
- Привязка к файлу (на сервере);
- Привязка к пользователю;
- Привязка к элементам по XML_ID.
|
Для отображения таблиц необходимо:
- Создать тип "Таблица" в панели администрирования для элемента инфоблока или в пользовательском поле;
- Настроить необходимые колонки у таблицы;
- Заполнить таблицу в элементе инфоблока (главном модуле);
- В лицевой части сайта включить режим правки и навести курсор мыши на компонент вывода элемента;
- Настроить компонент для отображения таблицы;
API
CIBlockElement::SetPropertyValuesEx
<? require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php"); $APPLICATION->SetTitle("Настраиваемые таблицы - CIBlockElement::SetPropertyValuesEx"); ?><?
// ----- I Одиночное свойство "Таблица" ------- //
$ELEMENT_ID = 35114; // ID элемента $PROPERTY_CODE = "TBL"; // Код свойства "Таблица"
$PROPERTY_VALUE = array( "VALUE" => array( "snKzDhYeGt"=>"Значение 1", // snKzDhYeGt - Идентификатор колонки №1 в свойстве "Таблица" "sKHZzBZniY"=>"Значение 2" // sKHZzBZniY - Идентификатор колонки №2 в свойстве "Таблица" ) );
CIBlockElement::SetPropertyValuesEx($ELEMENT_ID, false, array($PROPERTY_CODE => $PROPERTY_VALUE));
// --- II Множественное свойство "Таблица" ---- //
$ELEMENT_ID = 35114; // ID элемента $PROPERTY_CODE = "TBLS"; // Код свойства "Таблица" $PROPERTY_ID = 461; // 461 - ID свойства "Таблица"
$PROPERTY_VALUE = array( 0 => array( "VALUE" => array( "GaHnsaraae"=>"1", // GaHnsaraae - Идентификатор колонки №1 в свойстве "Таблица" "GHiRQByDdE"=>"Значение 1", // GHiRQByDdE - Идентификатор колонки №2 в свойстве "Таблица" "asTRrSGKyi"=>"Значение 2", // asTRrSGKyi - Идентификатор колонки №3 в свойстве "Таблица" ) ), 1 => array( "VALUE" => array( "GaHnsaraae"=>"11", // GaHnsaraae - Идентификатор колонки №1 в свойстве "Таблица" "GHiRQByDdE"=>"Значение 11", // GHiRQByDdE - Идентификатор колонки №2 в свойстве "Таблица" "asTRrSGKyi"=>"Значение 22", // asTRrSGKyi - Идентификатор колонки №3 в свойстве "Таблица" ) ),
);
// Дополнительные передаваемые параметры [только для множественного свойства] $_REQUEST["ID"] = $ELEMENT_ID; //ID элемента $_REQUEST["PROP"][$PROPERTY_ID] = array(); $_REQUEST["PROP"][$PROPERTY_ID]["DTABLEREQ"] = "bitrix"; $_REQUEST["PROP"][$PROPERTY_ID] = array_merge($_REQUEST["PROP"][$PROPERTY_ID], $PROPERTY_VALUE);
CIBlockElement::SetPropertyValuesEx($ELEMENT_ID, false, array($PROPERTY_CODE => $PROPERTY_VALUE)); ?><?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>
OnBeforeIBlockElementUpdate
<? // Пример удаления строки таблицы через обработчик событий OnBeforeIBlockElementUpdate // файл /bitrix/php_interface/init.php
// регистрируем обработчик AddEventHandler("iblock", "OnBeforeIBlockElementUpdate", Array("MyClass", "OnBeforeIBlockElementUpdateHandler"));
class MyClass { // создаем обработчик события "OnBeforeIBlockElementUpdate" function OnBeforeIBlockElementUpdateHandler(&$arFields) {
switch($arFields["IBLOCK_ID"]){ case 2: //ID инфоблока "Каталог товаров"
$prop_id = 46; //ID свойства "Настраиваемые таблицы" $row_id = 2067; //ID удаляемой строки таблицы.
unset($arFields["PROPERTY_VALUES"][$prop_id][$row_id]); //Удаляем из входного массива unset($_REQUEST["PROP"][$prop_id][$row_id]); //Удаляем из глобального массива break; }
} } ?>
CIBlockElement::GetList
<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");?><?
if (CModule::IncludeModule("iblock")) { // IBLOCK_ID и ID обязательно должны быть указаны $PROPERTY_CODE = "TABLE_1"; $IBLOCK_ID = 2; $ELEMENT_ID = 31; $arSelect = Array("ID", "IBLOCK_ID", "NAME", "DATE_ACTIVE_FROM", "PROPERTY_".$PROPERTY_CODE); $arFilter = Array("IBLOCK_ID" => $IBLOCK_ID, "ACTIVE_DATE" => "Y", "ACTIVE" => "Y", "ID" => $ELEMENT_ID); $res = CIBlockElement::GetList(Array(), $arFilter, false, false, $arSelect); while($ob = $res->GetNextElement()){ // Получим поля и свойства элемента инфоблока $arFields = $ob->GetFields(); $arProps = $ob->GetProperties(); // Получим таблицу $arDisplayProp = CIBlockFormatProperties::GetDisplayValue($arFields, $arProps[$PROPERTY_CODE], false); $displayTable = is_array($arDisplayProp["DISPLAY_VALUE"]) ? end($arDisplayProp["DISPLAY_VALUE"]) : $arDisplayProp["DISPLAY_VALUE"]; // Уберем лишнее $displayTable = str_replace('{dtable}', '', $displayTable); // Выведем результат echo "<pre>"; print_r($arProps[$PROPERTY_CODE]["VALUE"]); echo "</pre>"; echo "<pre>"; print_r($arProps[$PROPERTY_CODE]["DESCRIPTION"]); echo "</pre>"; echo "<pre>"; print_r($displayTable); echo "</pre>"; } }
?><?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_after.php");?>
Результат
CIBlockSection::GetList
<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");?><?
if (CModule::IncludeModule("iblock")) { $IBLOCK_ID = 2; $SECTION_ID = 4; $arFilter = array("IBLOCK_ID" => $IBLOCK_ID, "ACTIVE" => "Y", "ID" => $SECTION_ID); // Свойства раздела - настраиваемая таблица $arSelect = array('UF_TABLE_1', 'UF_TABLE_2'); $rsSections = CIBlockSection::GetList(array("SORT" => "ASC"), $arFilter, false, $arSelect); while ($arSection = $rsSections->GetNext()) { // Преобразуем сериализованную таблицу в массив foreach($arSelect as $table) { if (isset($arSection[$table])) { // Множественная таблица if (is_array($arSection[$table])) { foreach($arSection[$table] as $tableValue) { $tableValue = htmlspecialchars_decode($tableValue); $unserialized = unserialize($tableValue); echo $tableValue; echo "<pre>"; print_r($unserialized); echo "</pre>"; } // Таблица в одну строку } else { $tableValue = htmlspecialchars_decode($arSection[$table]); $unserialized = unserialize($tableValue); echo $tableValue; echo "<pre>"; print_r($unserialized); echo "</pre>"; } } } } }
?><?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_after.php");?>
Результат
CIBlockSection::GetList (костыльный способ вывода таблицы из UF_ свойства)
<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");?><?
if (CModule::IncludeModule("iblock")) { $IBLOCK_ID = 2; $SECTION_ID = 4; $arTableCode = array('UF_TABLE_1', 'UF_TABLE_2');
// Получим параметры пользовательского поля $arTableParams = array(); $arTableHead = array(); foreach($arTableCode as $tableCode) { $res = CUserTypeEntity::GetList(array(), array('FIELD_NAME' => $tableCode)); if ($arF = $res->Fetch()) { if (is_array($arF['SETTINGS']['COLUMNS'])) {
// todo добавить выравнивание ячеек таблицы $arTableParams[$tableCode]['ALIGNMENT_THEAD'] = array(); $arTableParams[$tableCode]['ALIGNMENT'] = array();
// Названия колонк таблицы $arTableHead[$tableCode] = array_map(function($item) { return $item['NAME']; }, $arF['SETTINGS']['COLUMNS']); } } }
$arFilter = array("IBLOCK_ID" => $IBLOCK_ID, "ACTIVE" => "Y", "ID" => $SECTION_ID); $rsSections = CIBlockSection::GetList(array("SORT" => "ASC"), $arFilter, false, $arTableCode); while ($arSection = $rsSections->GetNext()) { // Преобразуем сериализованную таблицу в массив foreach($arTableCode as $tableCode) { if (isset($arSection[$tableCode]) && isset($arTableHead[$tableCode]) && isset($arTableParams[$tableCode])) { // Множественная таблица if (is_array($arSection[$tableCode])) { $arValue = array(); foreach($arSection[$tableCode] as $tableValue) { $tableValue = htmlspecialchars_decode($tableValue); $unserialized = unserialize($tableValue); $arValue[] = array_map(function($item) { return array("VALUE" => $item); }, $unserialized); echo $tableValue; echo "<pre>"; print_r($unserialized); echo "</pre>"; }
// Выводим таблицу $table = ''; ob_start(); $APPLICATION->IncludeComponent( "denwist.table:table.view", "multiple", Array( "arTable" => array( "THEAD" => $arTableHead[$tableCode], "TBODY" => $arValue, ), "arParams" => $arTableParams[$tableCode], ) ); $table = ob_get_contents(); ob_end_clean(); echo $table;
// Таблица в одну строку } else { $tableValue = htmlspecialchars_decode($arSection[$tableCode]); $unserialized = unserialize($tableValue); $arValue = array_map(function($item) { return array("VALUE" => $item); }, $unserialized); echo $tableValue; echo "<pre>"; print_r($unserialized); echo "</pre>";
// Выводим таблицу $table = ''; ob_start(); $APPLICATION->IncludeComponent( "denwist.table:table.view", "", Array( "arTable" => array( "THEAD" => $arTableHead[$tableCode], "TBODY" => $arValue, ), "arParams" => $arTableParams[$tableCode], ) ); $table = ob_get_contents(); ob_end_clean(); echo $table;
} } } } }
?><?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_after.php");?>
Результат
Повернуть таблицу
Для того, что бы заголовок таблицы был в начале каждой строки, необходимо поменять код шаблона /bitrix/components/denwist.table/table.view/templates/multiple/template.php
До изменений
<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();?>
<div id="<?=$arParams["UNIQUE_ID"]?>">
<?if($arParams["INC_CSS"] == "Y"):?><style type="text/css"><?include_once($_SERVER["DOCUMENT_ROOT"].$templateFolder."/style.css");?></style><?endif;?>
<div class="denwist_table_view_item">
<table class="denwist_table_view" cellpadding="0" cellspacing="0" border="1">
<thead>
<tr>
<?foreach($arResult["THEAD"] as $key => $thead):?>
<td<?=(!empty($arParams["ALIGNMENT_THEAD"][$key])?(" ".$arParams["ALIGNMENT_THEAD"][$key]):"")?>><?=$thead?></td>
<?endforeach;?>
</tr>
</thead>
<tbody>
<?foreach($arResult["TBODY"] as $row => $arRow):?>
<tr>
<?foreach($arRow as $col => $tbody):?>
<td<?=(!empty($arParams["ALIGNMENT"][$col])?(" ".$arParams["ALIGNMENT"][$col]):"")?>><?=$tbody["VALUE"]?></td>
<?endforeach;?>
</tr>
<?endforeach;?>
</tbody>
</table>
</div>
</div>
<?if(isset($arParams["UNIQUE_ID"]) && isset($arParams["REPLACE_LABEL_ESCAPE"])):?>
<script type="text/javascript">
// Remove symbols
BX.ready(function(){
var obj = document.getElementById('<?=$arParams["UNIQUE_ID"]?>');
if(obj){
//Step to up
for(var i=0;i<3;i++){
obj = obj.parentNode;
if(
obj
&& obj.innerHTML.indexOf('<?=$arParams["REPLACE_LABEL_ESCAPE"]?>') !== -1
){
obj.innerHTML = obj.innerHTML.replace(/<?=$arParams["REPLACE_LABEL_ESCAPE"]?>.*<?=$arParams["REPLACE_LABEL_ESCAPE"]?>/g,'').replace(/<?=$arParams["REPLACE_LABEL_ESCAPE"]?>/g,'');
break;
}
}
}
});
</script>
<?endif;?>
После изменений
<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();?>
<div id="<?=$arParams["UNIQUE_ID"]?>">
<?if($arParams["INC_CSS"] == "Y"):?><style type="text/css"><?include_once($_SERVER["DOCUMENT_ROOT"].$templateFolder."/style.css");?></style><?endif;?>
<div class="denwist_table_view_item">
<table class="denwist_table_view" cellpadding="0" cellspacing="0" border="1">
<tbody>
<?foreach($arResult["THEAD"] as $key => $thead):?>
<tr>
<td<?=(!empty($arParams["ALIGNMENT_THEAD"][$key])?(" ".$arParams["ALIGNMENT_THEAD"][$key]):"")?>><?=$thead?></td>
<?foreach($arResult["TBODY"] as $row => $arRow):?>
<td<?=(!empty($arParams["ALIGNMENT"][$key])?(" ".$arParams["ALIGNMENT"][$key]):"")?>><?=$arRow[$key]["VALUE"]?></td>
<?endforeach;?>
</tr>
<?endforeach;?>
</tbody>
</table>
</div>
</div>
<?if(isset($arParams["UNIQUE_ID"]) && isset($arParams["REPLACE_LABEL_ESCAPE"])):?>
<script type="text/javascript">
// Remove symbols
BX.ready(function(){
var obj = document.getElementById('<?=$arParams["UNIQUE_ID"]?>');
if(obj){
//Step to up
for(var i=0;i<3;i++){
obj = obj.parentNode;
if(
obj
&& obj.innerHTML.indexOf('<?=$arParams["REPLACE_LABEL_ESCAPE"]?>') !== -1
){
obj.innerHTML = obj.innerHTML.replace(/<?=$arParams["REPLACE_LABEL_ESCAPE"]?>.*<?=$arParams["REPLACE_LABEL_ESCAPE"]?>/g,'').replace(/<?=$arParams["REPLACE_LABEL_ESCAPE"]?>/g,'');
break;
}
}
}
});
</script>
<?endif;?>
В результате получиться так:
← назад
|