Картинки, фотографии и прочие графические изображения не просто «оживляют» сайт, они являются его неотъемлемой частью. В этом уроке мне хотелось бы затронуть такую тему как загрузка и обработка изображений при размещении на сайт средствами НетКэта.
В ходе урока будут рассмотрены такие вопросы как:
На сайте изображения могут использоваться в: фотогалерее, изображение к новости и т.д.
Мы уже работали с изображениями в одних из прошлых уроков. В этом же уроки было рассмотрено такое понятие как тип хранения файлов или, вернее, тип файловой системы. В НетКэте таких типов 3: простая, стандартная и защищённая.
Для того, чтобы у вас была возможность добавлять изображение в какой-либо объект (новость, статью или галерею), нужно создать соответствующее поле в компоненте.
Пример такого поля:
На его примере разберёмся с настройками поля:
Таким образом, после создания необходимого поля, вы уже можете осуществлять загрузку изображений. Следующим шагом очень важно программно осуществить постобработку закачиваемого изображения. Нет необходимости размещать на сайте изображение размером с большой плакат. Оптимальными размерами могут быть, к примеру, 800x600 пикселей. Но это для большого изображения. Размеры превью, конечно же, должны быть меньше, к примеру 150x90 пикселей.
Давайте разберём простой пример.
У вас на сайте есть раздел со статьями. Статьи у вас выводятся списком на главной странице, списком в разделе статей и внутри самой статьи. Предположим, что на главной странице и в полном отображении у статьи выводится изображение в виде превью размером 600x300 пикселей
В списке статей и внутри, изображение будет иметь уменьшенный вид с размером 160x100 пикселей.
Для работы с изображениям существует класс nc_ImageTransform. Класс автоматически загружается в действиях после добавления и изменения объекта. Чтобы загрузить его в других местах, нужно подключить файл nc_imagetransform.class.php.
Сделать это можно следующем способом:
require_once($INCLUDE_FOLDER."classes/nc_imagetransform.class.php");
У данного класса есть методы:
string imgResize($src_img, $dest_img, $width, $height, $mode=0, $format='jpg', $quality=90, $message_id = 0, $field = 0)
На простом примере код будет выглядеть так:
require_once($INCLUDE_FOLDER."classes/nc_imagetransform.class.php"); $photo_path = $DOCUMENT_ROOT.nc_file_path($classID, $message,'Picture', ""); if ( $photo_path) { nc_ImageTransform::imgResize($photo_path,$photo_path,'600','600', 0, 'jpg', 90, $message, 'Picture'); }
Здесь изображение из поля «Picture» обрезается по бОльшей стороне до 600 пикселей.
Как в общих случаях можно поступить при закачке изображения:
Используя второй способ вы сможете задать необходимые параметры для любого количества изображений.
nc_ImageTransform::imgResize($photo_path,$photo_path,'150','100', 0, 'jpg', 90, $message, 'Picture');
# Обрезка основной фотографии if ($_FILES['f_Picture'][size] != 0 ) { require_once($INCLUDE_FOLDER."classes/nc_imagetransform.class.php"); $photo_path = $DOCUMENT_ROOT.nc_file_path($classID, $message,'Picture', ""); if ( $photo_path) { nc_ImageTransform::imgResize($photo_path,$photo_path,'600','600', 0, 'jpg', 90, $message, 'Picture'); nc_ImageTransform::createThumb('Picture','SmallPicture',150,100); } }
Пример: у вас на сайте есть фотогалерея и вам нужно, чтобы в общем списке выводилось превью, а при нажатии на одно из изображений выводилась его увеличенная копия. Сделать это можно по аналогии с вышеприведнным примером: создаёте два поля, в действия прописываете нужный код.
Следующий функционал, который можно внедрить — это наложение водяного знака (watermark) на закачиваемое изображение. У класса nc_ImageTransform так же существует метод для наложения вотермарки:
bool putWatermark ( $classID, $field, $message, $watermark, $mode = 0 )
На практике использование метода выглядит следующим образом:
if ($_FILES['f_Picture'][size] != 0 ) { require_once($INCLUDE_FOLDER."classes/nc_imagetransform.class.php"); $photo_path = $DOCUMENT_ROOT.nc_file_path($classID, $message,'Picture', ""); if ( $photo_path) { nc_ImageTransform::imgResize($photo_path,$photo_path,'600','600', 0, 'jpg', 90, $message, 'Picture'); nc_ImageTransform::putWatermark($classID,'Picture',$message, '/images/netcat.png', 1 ); nc_ImageTransform::createThumb('Picture','SmallPicture',150,100); } }
Примечание:
Для того, чтобы вставить свой код в блоки действий после добавления/изменений, сгенерируйте код действий и в самом верху вставьте свой код: