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

Не выполняется код в обработчике.

00 голосов
6
Здравствуйте! Мне необходимо в DETAIL_PICTURE помещать картинку из свойства элемента PHOTO_MINI.
Код следующий:
Код
<?
// файл /bitrix/php_interface/init.php
// регистрируем обработчик
AddEventHandler("iblock", "OnBeforeIBlockElementUpdate", Array("MyClass", "OnBeforeIBlockElementUpdateHandler"));
class MyClass
{   
    // создаем обработчик события "OnBeforeIBlockElementUpdate" 
    function OnBeforeIBlockElementUpdateHandler(&$arFields)
    {   
       CModule::IncludeModule("iblock");
       $res = CIBlockElement::GetByID($arFields['ID']) ;
        if($arFields2 = $res->GetNext())  
       {     
         if($arFields2["PROPERTIES"]["photo_mini"]["VALUE"]!="" && $arFields2["IBLOCK_ID"]=="17" &&  
$arFields2["DETAIL_PICTURE"]=="")
        {
           $arFields2["DETAIL_PICTURE"]=$arFields2["PROPERTIES"]["photo_mini"]["VALUE"];
        }
      } 
   }
}
?>

Но при редактировании элемента инфоблока ничего не происходит.
Пробывал и с After, результат тотже.
Подскажите, плиз, в чем может быть дело.
Заранее спасибо.
спросил 09 Март, 13 от Dobriy (400 баллов)

6 Ответы

00 голосов
Вот новый код
Код
<?
// файл /bitrix/php_interface/init.php
// регистрируем обработчик
AddEventHandler("iblock", "OnBeforeIBlockElementUpdate", Array("MyClass", "OnBeforeIBlockElementUpdateHandler"));
class MyClass
{   
    // создаем обработчик события "OnBeforeIBlockElementUpdate"  Before  After
    function OnBeforeIBlockElementUpdateHandler(&$arFields)
    {   
        
        CModule::IncludeModule("iblock"); 
       $res = CIBlockElement::GetProperty("17", $arFields["ID"], "sort", "asc", Array("CODE"=>"PHOTO_MINI")); 
        if($arFields2 = $res->GetNext())   
        {     
       
           if($arFields2["VALUE"]!="" && $arFields2["IBLOCK_ID"]=="17" &&   
$arFields["DETAIL_PICTURE"]["old_file"]=="") 
        { 
          $arFields["DETAIL_PICTURE"]["old_file"]=$arFields2["VALUE"]; 
        } 
      }
       /*?><pre><? print_r($arFields); ?></pre><?exit();*/
   }
}
?>

Проверял print'ом - значение он присваивает, но если открыть элемент, то DETAIL_PICTURE снова пуст.
Что ещё можно сделать не знаю.

P.S. пробывал такой код
Код
<?
// файл /bitrix/php_interface/init.php
// регистрируем обработчик
AddEventHandler("iblock", "OnBeforeIBlockElementUpdate", Array("MyClass", "OnBeforeIBlockElementUpdateHandler"));
class MyClass
{   
    // создаем обработчик события "OnBeforeIBlockElementUpdate"  Before  After
    function OnBeforeIBlockElementUpdateHandler(&$arFields)
    {   
        
        CModule::IncludeModule("iblock"); 
       $res = CIBlockElement::GetProperty("17", $arFields["ID"], "sort", "asc", Array("CODE"=>"PHOTO_MINI")); 
        if($arFields2 = $res->GetNext())   
        {     
       
           if($arFields2["VALUE"]!="" && $arFields2["IBLOCK_ID"]=="17" &&   
$arFields["DETAIL_PICTURE"]["old_file"]=="") 
        { 
          $res2 = CIBlockElement::GetByID($arFields["ID"]);
           if($ar_res = $res2->GetNext())
              $ar_res["DETAIL_PICTURE"]=$arFields2["VALUE"]; 
        } 
      }
       /*?><pre><? print_r($ar_res); ?></pre><?exit();*/
   }
}
?>

но тоже самое.
ответил 09 Март, 13 от Dobriy (400 баллов)
00 голосов
Заработало!!!
Код
<?
// файл /bitrix/php_interface/init.php
// регистрируем обработчик
AddEventHandler("iblock", "OnBeforeIBlockElementUpdate", Array("MyClass", "OnBeforeIBlockElementUpdateHandler"));
class MyClass
{   
    // создаем обработчик события "OnBeforeIBlockElementUpdate"  Before  After
    function OnBeforeIBlockElementUpdateHandler(&$arFields)
    {   
        
        CModule::IncludeModule("iblock"); 
       $res = CIBlockElement::GetProperty("17", $arFields["ID"], "sort", "asc", Array("CODE"=>"PHOTO_MINI")); 
        if($arFields2 = $res->GetNext())   
        {     
      
           if($arFields2["VALUE"]!="" && $arFields2["IBLOCK_ID"]=="17" &&   
$arFields["DETAIL_PICTURE"]=="") 
        { 
            $arFields["DETAIL_PICTURE"]=$arFields2["VALUE"];
        } 
      }
    }
}
?>

Всем спасибо за помощь ))
ответил 17 Март, 13 от Dobriy (400 баллов)
00 голосов
Люди! Помогите, пожалуйста! В настройках стоит, чтоб картинка анонса делалась из детальной, но этого не происходит. Что делать? :cry:
ответил 21 Апр, 13 от Dobriy (400 баллов)
00 голосов
Уже сам разобрался
ответил 14 Авг, 13 от Dobriy (400 баллов)
00 голосов
Пиши как разобрался)
ответил 14 Ноя, 13 от Tetis (500 баллов)
00 голосов
Вот финальный рабочий код. Уже не помню какой из них (а может оба) :).
Код
<?
// файл /bitrix/php_interface/init.php
// регистрируем обработчик
AddEventHandler("iblock", "OnBeforeIBlockElementUpdate", Array("MyClass", "OnBeforeIBlockElementUpdateHandler"));
class MyClass
{   
    // создаем обработчик события "OnBeforeIBlockElementUpdate"  Before  After
    function OnBeforeIBlockElementUpdateHandler(&$arFields)
    {   
        
        CModule::IncludeModule("iblock"); 
       $res = CIBlockElement::GetProperty("17", $arFields["ID"], "sort", "asc", Array("CODE"=>"PHOTO_MINI")); 
        if($arFields2 = $res->GetNext())   
        {     
      
           if($arFields2["VALUE"]!="" && $arFields2["IBLOCK_ID"]=="17" &&   
$arFields["PREVIEW_PICTURE"]["old_file"]=="") 
        { 
      
              $arIBlock = CIBlock::GetArrayByID("17");     
                 $im = $arFields2['VALUE'];
        $imcopy =  CFile::CopyFile($im);  
                    $imcopy =  CFile::MakeFileArray($imcopy); 
                      $arFields["PREVIEW_PICTURE"] = CIBlock::ResizePicture( $imcopy, $arIBlock["FIELDS"]["PREVIEW_PICTURE"]["DEFAULT_VALUE"]);
                 
        } 
      }
    }
}


AddEventHandler("iblock", "OnAfterIBlockElementAdd", Array("MyClass1", "OnAfterIBlockElementAddHandler"));
class MyClass1
{   
    // создаем обработчик события "OnAfterIBlockElementAdd"  Before  After
    function OnAfterIBlockElementAddHandler(&$arFields)
    {   
        
        CModule::IncludeModule("iblock"); 
       $res = CIBlockElement::GetProperty("17", $arFields["ID"], "sort", "asc", Array("CODE"=>"PHOTO_MINI")); 
        if($arFields2 = $res->GetNext())   
        {     
      
           if($arFields2["VALUE"]!="" && $arFields2["IBLOCK_ID"]=="17" &&   
$arFields["PREVIEW_PICTURE"]["old_file"]=="") 
        { 
      
              $arIBlock = CIBlock::GetArrayByID("17");     
                 $im = $arFields2['VALUE'];
        $imcopy =  CFile::CopyFile($im);  
                    $imcopy =  CFile::MakeFileArray($imcopy); 
                      $arFields["PREVIEW_PICTURE"] = CIBlock::ResizePicture( $imcopy, $arIBlock["FIELDS"]["PREVIEW_PICTURE"]["DEFAULT_VALUE"]);
                 
        } 
      }
    }
}
?>
ответил 23 Фев, 14 от Dobriy (400 баллов)

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

0 голосов
7 ответов
спросил 22 Июль, 13 от Aribor (560 баллов)
0 голосов
4 ответов
0 голосов
3 ответов
0 голосов
10 ответов