Для этого разработчиками компании Bitrix был написан обработчик событий ( Event). Данная система позволяет регистрировать обработчик один раз в базе или каждый раз добавлять его «на лету» через init.php (/bitrix/php_interface/init.php).
Сначала нам надо зарегистрировать обработчик и объявить к каким информационным блокам будет применяться данный обработчик.
Код
<?php
$GLOBALS['WATERMART_IBLOCK'] = array(183); //ID информационных блоков для наложения ватермарка
require_once ($_SERVER['DOCUMENT_ROOT']."/bitrix/php_interface/include/watermark.php"); //Подключение библиотеки ватермарка
/*
Добавляем эвенты для обработки картинок
OnBeforeIBlockElementAdd - Перед добавлением элемента к инфоблоку
OnBeforeIBlockElementUpdate - Перед изменением элемента инфоблока
*/
AddEventHandler("iblock", "OnBeforeIBlockElementAdd", array("CWatermark", "OnBeforeIBlockElementAdd"));
AddEventHandler("iblock", "OnBeforeIBlockElementUpdate", array("CWatermark", "OnBeforeIBlockElementUpdate"));
?>
|
И сам файл обработчик, который и будет накладывать картинку
Код
<?php
class CWatermark{
/*
Функции OnBeforeIBlockElementAdd и OnBeforeIBlockElementUpdate принимают все поля добавляемого элемента, и на основании поля IBLOCK_ID принимает решение, надо накладывать картинку или нет
*/
function OnBeforeIBlockElementAdd (&$arFields){
if (in_array($arFields['IBLOCK_ID'], $GLOBALS['WATERMART_IBLOCK'])){
CWaterMark::PostWaterMark(&$arFields["DETAIL_PICTURE"]["tmp_name"]);
}
}
function OnBeforeIBlockElementUpdate (&$arFields){
if (in_array($arFields['IBLOCK_ID'], $GLOBALS['WATERMART_IBLOCK'])){
CWaterMark::PostWaterMark(&$arFields["DETAIL_PICTURE"]["tmp_name"]);
}
}
function PostWaterMark(&$_image){
$_upload_dir = COption::GetOptionString("main", "upload_dir"); //Получаем папку для загрузок
$wmTarget = $_SERVER['DOCUMENT_ROOT'] . "/bitrix/php_interface/include/watermark.png"; //Открываем картинку для наложения
$resultImage = imagecreatefromjpeg($_image);
imagealphablending($resultImage, true);
$_image = $_SERVER['DOCUMENT_ROOT'] . "/" . $_upload_dir . "/tmp/".md5(microtime()).".jpg"; //Создаем временную картинку
$finalWaterMarkImage = imagecreatefrompng($wmTarget); //Загружаем PNG ватермарка
/*
Получаем размеры картинки
*/
$finalWaterMarkWidth = imagesx($finalWaterMarkImage);
$finalWaterMarkHeight = imagesy($finalWaterMarkImage);
/*
Накладываем PNG поверх картинки с координатами 0.0, т.е. левый верхний угол
и копируем PNG от 0.0, подробнее http://www.softtime.ru/dic/id_dic=356&id_group=15
*/
imagecopy($resultImage, $finalWaterMarkImage, 0, 0, 0, 0, $finalWaterMarkWidth, $finalWaterMarkHeight);
/*
Рисуем изображение, настраиваем прозрачность и сохроняем
*/
imagealphablending($resultImage, false);
imagesavealpha($resultImage, true);
imagejpeg($resultImage, $_image, 100);
/*
Уничтожаем картинки и освобождаем ресурсы
*/
imagedestroy($resultImage);
imagedestroy($finalWaterMarkImage);
}
function Clear(){
/*
Стираем все картинки, которые были сделаны до этого
*/
$_upload_dir = COption::GetOptionString("main", "upload_dir");
$_WFILE = glob($_SERVER['DOCUMENT_ROOT'] . "/" . $_upload_dir . "/tmp/*.jpg");
foreach($_WFILE as $_file)
unlink($_file);
return true;
}
}
?>
|
Вот что у нас получилось. WaterMark может быть наложен не только на детальную картинку, и не только JPG, но от нас лишь требовалось показать пример работы данного скрипта.






Новости и события
Последние записи в блоге
Вход для клиентов



вот код:
<?php class CWatermark{ function OnBeforeIBlockElementAdd (&$arFields){ if (in_array($arFields['IBLOCK_ID'], $GLOBALS['WATERMART_IBLOCK'])){ CWaterMark::PostWaterMark(&$arFields["DETAIL_PICTURE"]["tmp_name"]); } } function OnBeforeIBlockElementUpdate (&$arFields){ if (in_array($arFields['IBLOCK_ID'], $GLOBALS['WATERMART_IBLOCK'])){ CWaterMark::PostWaterMark(&$arFields["DETAIL_PICTURE"]["tmp_name"]); } } function PostWaterMark(&$_image){ $_upload_dir = COption::GetOptionString("main", "upload_dir"); //Получаем папку для загрузок $wmTarget = $_SERVER['DOCUMENT_ROOT'] . "/bitrix/php_interface/include/watermark.png"; //Открываем картинку для наложения $resultImage = imagecreatefromjpeg($_image); imagealphablending($resultImage, true); $_image = $_SERVER['DOCUMENT_ROOT'] . "/" . $_upload_dir . "/tmp/".md5(microtime()).".jpg"; //Создаем временную картинку $finalWaterMarkImage = imagecreatefrompng($wmTarget); //Загружаем PNG ватермарка $finalWaterMarkWidth = imagesx($finalWaterMarkImage); $finalWaterMarkHeight = imagesy($finalWaterMarkImage); imagecopy($resultImage, $finalWaterMarkImage, 0, 0, 0, 0, $finalWaterMarkWidth, $finalWaterMarkHeight); imagealphablending($resultImage, false); imagesavealpha($resultImage, true); imagejpeg($resultImage, $_image, 100); imagedestroy($resultImage); imagedestroy($finalWaterMarkImage); } function Clear(){ $_upload_dir = COption::GetOptionString("main", "upload_dir"); $_WFILE = glob($_SERVER['DOCUMENT_ROOT'] . "/" . $_upload_dir . "/tmp/*.jpg"); foreach($_WFILE as $_file) unlink($_file); return true; } } ?>PHP Version 5.2.11
в чём ошибка?
Просмотр файла Просмотр файла Имя файла: init.php Тип: Скрипт PHP Размер: 834 Последнее измение: 26.01.2011 11:53:04 Последний доступ: 26.01.2011 12:13:04 Содержимое файла <?php $GLOBALS['WATERMART_IBLOCK'] = array(4); //ID информационных блоков для наложения ватермарка require_once ($_SERVER['DOCUMENT_ROOT']."/bitrix/php_interface/include/watermark.php"); //Подключение библиотеки ватермарка /* Добавляем эвенты для обработки картинок OnBeforeIBlockElementAdd - Перед добавлением элемента к инфоблоку OnBeforeIBlockElementUpdate - Перед изменением элемента инфоблока */ AddEventHandler("iblock", "OnBeforeIBlockElementAdd", array("CWatermark", "OnBeforeIBlockElementAdd")); AddEventHandler("iblock", "OnBeforeIBlockElementUpdate", array("CWatermark", "OnBeforeIBlockElementUpdate")); ?><?php require_once ($_SERVER['DOCUMENT_ROOT']."/bitrix/php_interface/watermark.php"); AddEventHandler("iblock", "OnBeforeIBlockElementAdd",array("CWatermark", "OnBeforeIBlockElementAdd")); AddEventHandler("iblock", "OnBeforeIBlockElementUpdate",array("CWatermark", "OnBeforeIBlockElementUpdate")) ?> <?php class CWatermark{ function OnBeforeIBlockElementAdd (&$arFields){ if (in_array($arFields['IBLOCK_ID'], $GLOBALS['WATERMART_IBLOCK'])){ CWaterMark::PostWaterMark(&$arFields["PREVIEW_PICTURE"] ["tmp_name"]); } } function OnBeforeIBlockElementUpdate (&$arFields){ if (in_array($arFields['IBLOCK_ID'], $GLOBALS['WATERMART_IBLOCK'])){ CWaterMark::PostWaterMark(&$arFields["PREVIEW_PICTURE"] ["tmp_name"]); } } function PostWaterMark(&$_image){ $_upload_dir = COption::GetOptionString("main", "upload_dir"); //Получаем папку для загрузок $wmTarget = $_SERVER['DOCUMENT_ROOT'] . "/bitrix/php_interface/watermark.png"; //Открываем картинку для наложения $resultImage = imagecreatefromjpeg($_image); imagealphablending($resultImage, true); $_image = $_SERVER['DOCUMENT_ROOT'] . "/" . $_upload_dir . "/tmp/".md5(microtime()).".jpg"; //Создаем временную картинку $finalWaterMarkImage = imagecreatefrompng($wmTarget); //Загружаем PNG ватермарка $finalWaterMarkWidth = imagesx($finalWaterMarkImage); $finalWaterMarkHeight = imagesy($finalWaterMarkImage); imagecopy($resultImage, $finalWaterMarkImage, 0, 0, 0, 0, $finalWaterMarkWidth, $finalWaterMarkHeight); imagealphablending($resultImage, false); imagesavealpha($resultImage, true); imagejpeg($resultImage, $_image, 100); imagedestroy($resultImage); imagedestroy($finalWaterMarkImage); } function Clear(){ $_upload_dir = COption::GetOptionString("main", "upload_dir"); $_WFILE = glob($_SERVER['DOCUMENT_ROOT'] . "/" . $_upload_dir . "/tmp/*.jpg"); foreach($_WFILE as $_file) unlink($_file); return true; } } ?>Не работает. Что не так?