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

При использовании инфоблока с одним элементом, для вывода такой страницы можно использовать компонент "bitrix:news.detail". Для этого создайте инфоблок с нужными свойствами и тот самый единственный элемент. В общем, можно сказать, все готово и никакой дополнительный код и не нужен, но здесь возникают некоторые проблемы с юзабилити административной части:

  • чтобы добраться до редактируемого элемента, нужно сначала перейти в список элементов инфоблока, а потом перейти к редактированию элемента
  • клиент может удалить этот единственный элемент, а т.к. компонент "bitrix:news.detail" привязывается к ID элемента, то восстановить его он уже не сможет
  • будет непонятно назначение кнопок "Добавить", "Элементы" и прочих

Все эти проблемы решаются при помощи кода, приведенного ниже:

<?php
   
namespace CustomElement;

define("CUSTOMELEMENT_IBLOCK_TYPE","we_CONTENT"); // тип инфоблока
define("CUSTOMELEMENT_IBLOCK_ID",24); // ID инфоблока
define("CUSTOMELEMENT_ELEMENT_ID",53051); // ID элемента инфоблока

AddEventHandler("main", "OnBuildGlobalMenu", '\CustomElement\onBuildGlobalMenu');
// убираем вложенные пункты в меню "Контент" у инфоблока и устанавливаем у него ссылку на единственный элемент
function onBuildGlobalMenu(&$aGlobalMenu, &$aModuleMenu)
{
   global $USER;
   foreach ($aModuleMenu as &$arMenu) 
   {
      if($arMenu["items_id"]=="menu_iblock_/".CUSTOMELEMENT_IBLOCK_TYPE)
      {
         foreach ($arMenu["items"] as &$arMenu2)
         {
            if($arMenu2["items_id"]=="menu_iblock_/".CUSTOMELEMENT_IBLOCK_TYPE."/".CUSTOMELEMENT_IBLOCK_ID) 
            {
               $arMenu2["url"] = "/bitrix/admin/iblock_element_edit.php?IBLOCK_ID=".CUSTOMELEMENT_IBLOCK_ID."&type=".CUSTOMELEMENT_IBLOCK_TYPE."&ID=".CUSTOMELEMENT_ELEMENT_ID."&lang=ru&find_section_section=-1&WF=Y";
               $arMenu2["items"] = array();
               $arMenu2["dynamic"] = false;
               break;
            }
         }
         unset($arMenu2);
         break;
      }
   }
   unset($arMenu);
}

AddEventHandler("iblock", "OnBeforeIBlockElementDelete", '\CustomElement\OnBeforeIBlockElementDelete');
// запрещаем удаление элемента
function onBeforeIBlockElementDelete($ID)
{
   if($ID==CUSTOMELEMENT_ELEMENT_ID) 
   {
       $GLOBALS["APPLICATION"]->throwException("Этот элемент нельзя удалить");
        return false;          
    }
}


AddEventHandler("iblock", "OnBeforeIBlockElementAdd", '\CustomElement\onBeforeIBlockElementAdd');
// запрещаем добавление других элементов в этот инфоблок
function onBeforeIBlockElementAdd(&$arFields)
{
   if($arFields["IBLOCK_ID"]==CUSTOMELEMENT_IBLOCK_ID) 
   {
       $GLOBALS["APPLICATION"]->throwException("Добавление элементов в этот инфоблок запрещено");
        return false;          
    }
}

AddEventHandler("main", "OnAdminContextMenuShow", '\CustomElement\onAdminContextMenuShow');
// убираем для этого инфоблока контекстные кнопки
function onAdminContextMenuShow(&$items)
{
   if(
      in_array($GLOBALS["APPLICATION"]->GetCurPage(),array(
         "/bitrix/admin/iblock_element_admin.php",
         "/bitrix/admin/iblock_element_edit.php",
      ))
      && 
      $_REQUEST["IBLOCK_ID"]==CUSTOMELEMENT_IBLOCK_ID
   )
      $items = array();
}

AddEventHandler("main", "OnBeforeLocalRedirect", '\CustomElement\onBeforeLocalRedirect');
// отменяем редирект на список элементов после сохранения элемента
function onBeforeLocalRedirect(&$url, $skip_security_check, $bExternal)
{
   if(
      in_array($GLOBALS["APPLICATION"]->GetCurPage(),array(
         "/bitrix/admin/iblock_element_edit.php",
      ))
      && 
      $_REQUEST["IBLOCK_ID"]==CUSTOMELEMENT_IBLOCK_ID
   )
      $url = $GLOBALS["APPLICATION"]->GetCurPageParam()."&ID=".CUSTOMELEMENT_ELEMENT_ID;
}

Чтобы оставить сообщение, авторизуйтесь, или войдите с помощью:
Главная   ·   Модули для 1С-Битрикс   ·   Типовые услуги   ·   Форум   ·   Блог   ·   Контакты
Рейтинг@Mail.ru