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

Ограничение количества символов дополнительного свойства инфоблока

00 голосов
5
Имеется инфоблок, у инфоблока добавлено некое свойство. Возможно ли в админке Битрикса сделать проверку на количество введенных символов в данное свойство?
спросил 28 Окт, 13 от Snezhka (2,240 баллов)

5 Ответы

00 голосов
Да, возможно. Либо через пользовательскую форму инфоблока, либо через обработчик события OnBeforeIBlockElementAdd и OnBeforeIBlockElementUpdate. И то, и другое описано в документации.
ответил 28 Ноя, 13 от Pomnep (13,960 баллов)
00 голосов
я так понимаю, что мне нужно сделать следующее:
в файле /bitrix/php_interface/init.php создать свой класс проверки:
Код
<?

AddEventHandler("iblock", "OnBeforeIBlockElementAdd",   array("CheckMaxWidthStr", "OnBeforeIBlockElementAdd"));
AddEventHandler("iblock", "OnBeforeIBlockElementUpdate",   array("CheckMaxWidthStr", "OnBeforeIBlockElementUpdate"));

class CheckMaxWidthStr
{
   function OnBeforeIBlockElementAdd(&$arFields)
   {    
       if(strlen($arFields["CODE"])<=0)
        {
            //тут проверка на длинну
         global $APPLICATION;
            $APPLICATION->throwException("Максимальное количество симолов не больше 10-ти");
            return false;
        }
   }

   function OnBeforeIBlockElementUpdate(&$arFields)
   {
      if(strlen($arFields["CODE"])<=0)
        {
            //тут проверка на длинну
         global $APPLICATION;
            $APPLICATION->throwException("Максимальное количество симолов не больше 10-ти");
            return false;
        }
   }
} 

?> 

Я не очень силен в php и api битрикса, но подскажите, каким образом мне указать, что проверять нужно только мое поле, а не все подряд?
ответил 09 Март, 14 от Snezhka (2,240 баллов)
00 голосов
Цитата
Олег Белов пишет:
if(strlen($arFields["CODE"])<=0)

Таким образом Вы проверяете не свойство, а символьный код элемента в ЛЮБОМ инфоблоке. Добавьте в любой из этих обработчиков что-то типа
Код
$strFile = "/test.txt";
$hdlFile = fopen($_SERVER['DOCUMENT_ROOT'].$strFile,"wb");
fwrite($hdlFile,mydump($arFields));
fclose($hdlFile);

после чего попробуйте отредактироватиь один элемент Вашего инфоблока. В корне сайта появится файлик test.txt, где Вам будет вся структура массива $arFields. Вот по ней и поймете, какие условия ставить.
ответил 30 Июнь, 14 от Pomnep (13,960 баллов)
00 голосов
Ваш код выдал следующее:
Код
 array(22) => 
 [ACTIVE] =>
     string(1) =>
    "Y"
 [MODIFIED_BY] =>
     string(1) =>
    "1"
 [IBLOCK_SECTION] =>
     array(1) => 
     [0] =>
         string(1) =>
        "0"
 [IBLOCK_ID] =>
     string(2) =>
    "12"
 [ACTIVE_FROM] =>
     string(0) =>
    ""
 [ACTIVE_TO] =>
     string(0) =>
    ""
 [SORT] =>
     string(3) =>
    "500"
 [NAME] =>
     string(9) =>
    "Баннер #4"
 [CODE] =>
     string(0) =>
    ""
 [TAGS] =>
     string(0) =>
    ""
 [PREVIEW_PICTURE] =>
     array(9) => 
     [name] =>
         string(0) =>
        ""
     [type] =>
         string(0) =>
        ""
     [tmp_name] =>
         string(0) =>
        ""
     [error] =>
         integer(4)
     [size] =>
         integer(0)
     [del] =>
         NULL()
     [description] =>
         string(0) =>
        ""
     [MODULE_ID] =>
         string(6) =>
        "iblock"
     [old_file] =>
         string(3) =>
        "166"
 [PREVIEW_TEXT] =>
     string(0) =>
    ""
 [PREVIEW_TEXT_TYPE] =>
     string(4) =>
    "text"
 [DETAIL_PICTURE] =>
     array(4) => 
     [del] =>
         NULL()
     [description] =>
         NULL()
     [MODULE_ID] =>
         string(6) =>
        "iblock"
     [old_file] =>
         NULL()
 [DETAIL_TEXT] =>
     string(0) =>
    ""
 [DETAIL_TEXT_TYPE] =>
     string(4) =>
    "text"
 [PROPERTY_VALUES] =>
     array(1) => 
     [53] =>
         array(1) => 
         [1829] =>
             string(18) =>
            "Текст на кнопке 4!"
 [WF] =>
     string(1) =>
    "N"
 [WF_NEW] =>
     boolean(false)
 [SEARCHABLE_CONTENT] =>
     string(13) =>
    "БАННЕР #4

"
 [IBLOCK_SECTION_ID] =>
     NULL()
 [ID] =>
     integer(326)

собственно "Текст на кнопке 4!" - эту переменную мне и нужно проверять..Только я запутался. Подскажите, как?
ответил 30 Окт, 14 от Snezhka (2,240 баллов)
00 голосов
Ну так все просто.
Код
if (12 == intval($arFields['IBLOCK_ID']))
{
    if (true == isset($arFields['PROPERTY_VALUES'][53]))
    {
         foreach ($arFields['PROPERTY_VALUES'][53] as $value)
         {
               if (10 < strlen($value))
               {
                   //Ошибка
               }
         }
    }
}

Здесь 12 - ID Вашего инфоблока, 53 - ID свойства.
ответил 27 Фев, 15 от Pomnep (13,960 баллов)

Похожие вопросы

0 голосов
5 ответов
0 голосов
7 ответов
0 голосов
1 ответ
спросил 02 Июнь, 13 от Xenam (160 баллов)
0 голосов
1 ответ