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

не работает iblock_element_edit_before_save.php

00 голосов
7
Мне нужно чтоб превьюшка генерировалась автоматически, привожу полный код
Код
<?
function BXIBlockAfterSave($arFields)
{
        $dbr = CIBlockElement::GetByID($arFields['ID']);
        if(($ar = $dbr->Fetch()) && $ar['DETAIL_PICTURE']>0)
        {
            $img_path = $_SERVER['DOCUMENT_ROOT'].CFile::GetPath($ar['DETA­IL_PICTURE']);
            $width = 100;
            $height = 100;
            list($width_orig, $height_orig) = getimagesize($img_path);

            $image_p = imagecreatetruecolor($width, $height);
            $image = imagecreatefromjpeg($img_path);
            if ($width_orig>$height_orig)
            imagecopyresized($image_p, $image, 0, 0, round((max($width_orig,$height_orig)-min($width_or­ig,$height_orig))/2), 0, $width, $width, min($width_orig,$height_orig), min($width_orig,$height_orig));
            if ($width_orig<$height_orig)
           imagecopyresized($image_p, $image, 0, 0, 0, 0, $width, $width, min($width_orig,$height_orig), min($width_orig,$height_orig));
             if ($width_orig==$height_orig)
           imagecopyresized($image_p, $image, 0, 0, 0, 0, $width, $width, $width_orig, $width_orig);

            $new_img_path = tempnam("/tmp", "FOO").".jpg";
            imagejpeg($image_p, $new_img_path);
            $be = new CIBlockElement();
            $be->Update($arFields['ID'], Array('PREVIEW_PICTURE'=>CFile::MakeFileArray($new­_img_path)), false);
            @unlink($new_img_path);

        }
  

    if($arFields['WF_STATUS_ID']==1)
    {
        BXClearCache(true, "/ru/main_page/");
        BXClearCache(true, "/ru/detail/".$arFields['ID']."/");
    }
}
?>


помогите пожайлуста разобраться
спросил 31 Июль, 13 от AmoH (180 баллов)

7 Ответы

00 голосов
событие регистрируете?
ответил 31 Июль, 13 от Unakas (220 баллов)
00 голосов
Регистрирую так

AddEventHandler("iblock", "OnAfterIBlockElementAdd", "BXIBlockAfterSave","/bitrix/php_interface/include/iblock_element_edit_before_save.php");


в init.php
ответил 28 Сен, 13 от AmoH (180 баллов)
00 голосов
я прописал в свойствах инфоблока использовать данный скрипт после редактирования, работает замечательно.

совет делать не imagecopyresized а imagecopyresampled, качество лучше
плюс не только jpg могут загружать и с расширением отличным от нижнего регистра, там тонкостей много smile;)
ответил 29 Дек, 13 от Kania (5,180 баллов)
00 голосов
p0stal сенк, оказывается регистрировал неправильно
получилось так

Код
<?
function BXIBlockAfterSave($arFields)
{
        $dbr = CIBlockElement::GetByID($arFields['ID']);
        if(($ar = $dbr->Fetch()) && $ar['DETAIL_PICTURE']>0)
        {
            $img_path = $_SERVER['DOCUMENT_ROOT'].CFile::GetPath($ar['DETA­­IL_PICTURE']);
            $width = 100;
            $height = 100;
            list($width_orig, $height_orig) = getimagesize($img_path);

            $image_p = imagecreatetruecolor($width, $height);
            $image = imagecreatefromjpeg($img_path);
            if ($width_orig>$height_orig)
            imagecopyresized($image_p, $image, 0, 0, round((max($width_orig,$height_orig)-min($width_or­­ig,$height_orig))/2), 0, $width, $width, min($width_orig,$height_orig), min($width_orig,$height_orig));
            if ($width_orig<$height_orig)
           imagecopyresized($image_p, $image, 0, 0, 0, 0, $width, $width, min($width_orig,$height_orig), min($width_orig,$height_orig));
             if ($width_orig==$height_orig)
           imagecopyresized($image_p, $image, 0, 0, 0, 0, $width, $width, $width_orig, $width_orig);

            $new_img_path = tempnam("/tmp", "FOO").".jpg";
            imagejpeg($image_p, $new_img_path);
            $be = new CIBlockElement();
            $be->Update($arFields['ID'], Array('PREVIEW_PICTURE'=>CFile::MakeFileArray($new­­_img_path)), false);
            @unlink($new_img_path);

        }
  

    if($arFields['WF_STATUS_ID']==1)
    {
        BXClearCache(true, "/ru/main_page/");
        BXClearCache(true, "/ru/detail/".$arFields['ID']."/");
    }
}
?>


функция resizeimg
Код
// Функция изменения размера изображения
 function resizeimg($filename, $w, $h)
  {
    // определим коэффициент сжатия изображения, которое будем генерить
    $ratio = $w/$h;
    // получим размеры исходного изображения
    $size_img = getimagesize($filename);
    // Если размеры меньше, то масштабирования не нужно
    if (($size_img[0]<$w) && ($size_img[1]<$h)) return true;
    // получим коэффициент сжатия исходного изображения
    $src_ratio=$size_img[0]/$size_img[1];

    // Здесь вычисляем размеры уменьшенной копии, чтобы при масштабировании сохранились 
    // пропорции исходного изображения
    if ($ratio<$src_ratio)
    {
      $h = $w/$src_ratio;
    }
    else
    {
      $w = $h*$src_ratio;
    }
    // создадим пустое изображение по заданным размерам 
    $dest_img = imagecreatetruecolor($w, $h);  
    $white = imagecolorallocate($dest_img, 255, 255, 255);       
    if ($size_img[2]==2)  $src_img = imagecreatefromjpeg($filename);                      
    else if ($size_img[2]==1) $src_img = imagecreatefromgif($filename);                      
    else if ($size_img[2]==3) $src_img = imagecreatefrompng($filename); 

    // масштабируем изображение     функцией imagecopyresampled()
    // $dest_img - уменьшенная копия
    // $src_img - исходной изображение
    // $w - ширина уменьшенной копии
    // $h - высота уменьшенной копии        
    // $size_img[0] - ширина исходного изображения
    // $size_img[1] - высота исходного изображения
    imagecopyresampled($dest_img, $src_img, 0, 0, 0, 0, $w, $h, $size_img[0], $size_img[1]);                
    // сохраняем уменьшенную копию в файл 
    if ($size_img[2]==2){
       $smallimage = tempnam("/tmp", "FOO").".jpg";
       imagejpeg($dest_img, $smallimage);                      
    }
    else if ($size_img[2]==1){
       $smallimage = tempnam("/tmp", "FOO").".gif";
       imagegif($dest_img, $smallimage);                      
    }
    else if ($size_img[2]==3){
       $smallimage = tempnam("/tmp", "FOO").".png";
       imagepng($dest_img, $smallimage); 
    }
    // чистим память от созданных изображений
    imagedestroy($dest_img);
    imagedestroy($src_img);
    return $smallimage;         
  }
ответил 14 Апр, 14 от AmoH (180 баллов)
00 голосов
Георгий Агалаков, куда этот код вставлять?
ответил 08 Авг, 14 от lDeathl (100 баллов)
00 голосов
Странно, у меня при использовании
Код
<? 
function BXIBlockAfterSave($arFields) 
{ 
        $dbr = CIBlockElement::GetByID($arFields['ID']); 
        if(($ar = $dbr->Fetch()) && $ar['DETAIL_PICTURE']>0) 
        { 
            $img_path = $_SERVER['DOCUMENT_ROOT'].CFile::GetPath($ar['DETA­­IL_PICTURE']); 
            $width = 100; 
            $height = 100; 
            list($width_orig, $height_orig) = getimagesize($img_path); 

            $image_p = imagecreatetruecolor($width, $height); 
            $image = imagecreatefromjpeg($img_path); 
            if ($width_orig>$height_orig) 
            imagecopyresized($image_p, $image, 0, 0, round((max($width_orig,$height_orig)-min($width_or­­ig,$height_orig))/2), 0, $width, $width, min($width_orig,$height_orig), min($width_orig,$height_orig)); 
            if ($width_orig<$height_orig) 
           imagecopyresized($image_p, $image, 0, 0, 0, 0, $width, $width, min($width_orig,$height_orig), min($width_orig,$height_orig)); 
             if ($width_orig==$height_orig) 
           imagecopyresized($image_p, $image, 0, 0, 0, 0, $width, $width, $width_orig, $width_orig); 

            $new_img_path = tempnam("/tmp", "FOO").".jpg"; 
            imagejpeg($image_p, $new_img_path); 
            $be = new CIBlockElement(); 
            $be->Update($arFields['ID'], Array('PREVIEW_PICTURE'=>CFile::MakeFileArray($new­­_img_path)), false); 
            @unlink($new_img_path); 

        } 
   

    if($arFields['WF_STATUS_ID']==1) 
    { 
        BXClearCache(true, "/ru/main_page/"); 
        BXClearCache(true, "/ru/detail/".$arFields['ID']."/"); 
    } 
} 
?>


вылетает

Код
Fatal error: Out of memory (allocated 19398656) (tried to allocate 2272 bytes) in ****/www/bitrix/modules/iblock/classes/general/iblockelement.php on line 1140


memory_limit 64M
ответил 12 Дек, 14 от Kpytblw (100 баллов)
00 голосов
ответил 03 Апр, 15 от ytoo (100 баллов)

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

0 голосов
1 ответ
0 голосов
5 ответов
спросил 15 Янв, 14 от YaN (100 баллов)
0 голосов
4 ответов
0 голосов
1 ответ