Добро пожаловать на сайт Bitrix Q&A, где вы можете задавать вопросы о программировании и разработке на Битрикс и получать быстрые и квалифицированные ответы от профессионалов!


Росгосстрах Авто [CPS] RU

Пользовательское свойство: список

00 голосов
1
Всем доброго времени суток.
Возникла необходимость создания пользовательского свойства типа "список", отличающегося от обычного только наличием дополнительной настройки - текстового поля, куда вводится описание свойства.
При интеграции его в 10-й битрикс все шикарно работало без каких-либо нареканий, в 11-м появилась проблема: при редактировании свойства в Информ. блоках для задания ему значений списка эти значения не сохраняются, в то время как в 10-м, повторюсь, это происходило. Информация в новом текстовом поле сохраняется.
Вопросы следующие:
  • из-за чего это происходит
  • что нужно сделать, чтобы значения списка сохранялись
Код приведен ниже, он дописывается в bitrix/php_interface/init.php


Код
if (CModule::IncludeModule("iblock"))
{
   class filterEnumClass extends CIBlockPropertyElementList //класс, описывающий пользовательское свойство
   {
      function GetUserTypeDescription()
      {
         return array(
            'PROPERTY_TYPE'   => 'L',
            'USER_TYPE'       => 'Filter_enum',
            'DESCRIPTION'         => 'Фильтр_список',
            'PrepareSettings' => array('filterEnumClass','PrepareSettings'),
            'GetPropertyFieldHtml'  => array('filterEnumClass','GetPropertyFieldHtml'),
            'GetSettingsHTML' => array('filterEnumClass','GetSettingsHTML'),
            'CheckFields' => array('filterEnumClass','CheckFields'),
         );
      }

      
      function PrepareSettings($arUserField) 
      {
         return array(      
            "DESCRIPTION" => $arUserField["USER_TYPE_SETTINGS"]["DESCRIPTION"],
            );
      }
         
      function GetSettingsHTML($arUserField, $arHtmlControl, $bVarsFromForm)
      {
         $result = '';
         $value = $arUserField["USER_TYPE_SETTINGS"]["DESCRIPTION"];
         $result .= '
         <tr valign="top">
            <td>Описание свойства:</td>
            <td>
               <textarea name="'.$arHtmlControl["NAME"].'[DESCRIPTION]" rows="10" cols="40">'.$value.'</textarea>
            </td>
         </tr>
         ';
         return $result;
      }
         
      function CheckFields($arUserField, $value) 
      {
         $aMsg = array();
         return $aMsg;
      }
   
      function GetPropertyFieldHtml($arProperty, $value, $strHTMLControlName)
      {
         //функция отвечает за отображение в редактировании карточки товара - не думаю, что есть смысл ее тут приводить
      }
   }
}
AddEventHandler("iblock",'OnIBlockPropertyBuildList',array('filterEnumClass','GetUserTypeDescription'));
 
спросил 22 Май, 13 от B1ad3 (120 баллов)

1 Ответ

+11 голос
Приветствую!

Может кто нарвётся на такую же проблему. Решение в том, чтобы объявить методы статическими. Проблема не в версии битрикс, а в версии PHP. С версии PHP7 все методы в классе самописного типа свойства должны быть статическими. Это описано в оффициальной документации битрикс.
ответил 05 Авг от аноним