Обучаю битриксу программистов, интеграторов. Подробнee ⇒

Кастомизация поля в компании



Задача:
выводить информацию, полученную из БД на другом сервере, в карточке компании
Поставила модуль d2mg.ufhtml, который поддерживает html поле  https://marketplace.1c-bitrix.ru/solutions/d2mg.ufhtml/  
Важно!
в Пxп 8 модуль d2mg.ufhtml перестает работать! его надо допиливать (ниже написано как)

создаем пользовательское свойство через админку UF_COMPANY_MAIN_INFO с данным типом
\Bitrix\Main\EventManager::getInstance()->addEventHandler('main', 'onGetUserFieldValues', function(\Bitrix\Main\Event $event){
   $result = new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS);
   $entityId = $event->getParameter('entityId'); 
   if($entityId === 'CRM_COMPANY'){      
      $userFields = $event->getParameter('userFields');
      $companyId = $event->getParameter('value');
      if(isset($userFields["UF_COMPANY_MAIN_INFO"]) && CModule::IncludeModule('crm')){          
         $arSelect = ["ID"];
         foreach ($userFields as $key => $value) {
            $arSelect[] = $key;
         }
         $arFilter = array("ID"=>intval($companyId),"CHECK_PERMISSIONS"=>"N");      
         $rsCompany = CCrmCompany::GetList(Array(),$arFilter,$arSelect);
         if($arComp = $rsCompany->Fetch()){            
            unset($arComp["ID"]);
            $values = [];
            foreach ($arComp as $key => $value) {
               $values[$key] = $value;
            }             
         }
         $info = MyClass::FillCompanyMainInfo($companyId,$values["UF_PA"]); //тут логика получения информации
         $values["UF_COMPANY_MAIN_INFO"] = $info;         
         $result = new \Bitrix\Main\EventResult(\Bitrix\Main\EventResult::SUCCESS, [
            'values' => $values,
         ]);
      }      
   }
   return $result;
});
создаем 2 файла
  • /local/templates/.default/components/bitrix/system.field.edit/customhtml/template.php
  • /local/templates/.default/components/bitrix/system.field.view/customhtml/template.php
с одинаковым содержимым
<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();?>
<?=html_entity_decode($arResult["VALUE"][0])??""?>


для пхп 8 допилила /bitrix/modules/d2mg.ufhtml/classes/general/customtypehtml.php
но не работает нормально со множественными значениями
функция function OnBeforeSave($arUserField, $value) кривая
<?
IncludeModuleLangFile(__FILE__);

class CCustomTypeHtml extends \Bitrix\Main\UserField\Types\StringType
{
   public static function getUserTypeDescription(): array
   {
      return array(
         "USER_TYPE_ID" => "customhtml",
         "CLASS_NAME" => "CCustomTypeHtml",
         "DESCRIPTION" => GetMessage("PPROP_NAME"),
         "BASE_TYPE" => "string",
      );
   }
   
   public static function getEditFormHtml(array $userField, ?array $additionalParameters): string
   {
            
      if($arUserField["ENTITY_VALUE_ID"]<1 && strlen($arUserField["SETTINGS"]["DEFAULT_VALUE"])>0)
         $additionalParameters["VALUE"] = htmlspecialcharsbx($arUserField["SETTINGS"]["DEFAULT_VALUE"]);
      if($arUserField["SETTINGS"]["ROWS"] < 8)
         $arUserField["SETTINGS"]["ROWS"] = 8;

      if($arUserField['MULTIPLE'] == 'Y')
         $name = preg_replace("/[\[\]]/i", "_", $additionalParameters["NAME"]);
      else
         $name = $additionalParameters["NAME"];
      
      ob_start();
      
      CFileMan::AddHTMLEditorFrame(
         $name,
         $additionalParameters["VALUE"],
         $name."_TYPE",
         strlen($additionalParameters["VALUE"])?"html":"text",
         array(
            'height' => $arUserField['SETTINGS']['ROWS']*10,
         ),

      );
      
      if($arUserField['MULTIPLE'] == 'Y')
         echo '<input type="hidden" name="'.$additionalParameters["NAME"].'" >';
      
      $html = ob_get_contents();
      ob_end_clean();
      
      
      return $html; 
   }

   /*function OnBeforeSave($arUserField, $value)
    {
      if($arUserField['MULTIPLE'] == 'Y')
      {
         foreach($_POST as $key => $val)
         {
            if( preg_match("/".$arUserField['FIELD_NAME']."_([0-9]+)_$/i", $key, $m) )
            {
               $value = $val;
               unset($_POST[$key]);
               break;
            }
         }
      }
        return $value;
    }*/
    
}
?>
Если блог был полезным, можете угостить меня "чашечкой кофе" :)

Сбер по номеру телефона +7 (953) 585-13-09 Вероника.
Спасибо!