12
июня

Вывод логотипа производителя на изображении товара

Таск: есть товар с картинкой. Товар связан с производителем (термин таксономии), а у производителя есть поле с логотипом. Необходимо на картинке товара выводить в виде ватермарка логотип производителя.

Решение: у модуля ImageCache Actions помимо основных эффектов есть такая плюшка - Custom actions - которая позволяет написать свой собственный код, который будет обрабатывать изображение, при этом в коде будут доступны две переменные (массивы):

  • $image
  • $image_context

Вот что есть в README.txt модуля по данным массивам:

$image is an object containing the following properties:
- source: string, the source of the image, e.g. public://photo.jpg
- info: array, example data:
- width (int) 180
- height (int) 180
- extension (string) png
- mime_type (string) image/png
- file_size (int) 4417
- toolkit: string, imagemagick or GD
- resource: resource. The GD image resource.
- ops: array. An array of strings with the ImageMagick commands.
$image_context is an associative array containing:
- effect_data: array, the data of this image effect, example data for the custom
action effect:
- php (string)
- managed_file: object|null. A managed file object containing these properties:
- fid (string) 2
- uid (string) 1
- filename (string) photo.jpg
- uri (string) public://photo.jpg
- filemime (string) image/jpeg
- filesize (string) 445751
- status (string) 1
- timestamp (string) 1327525851
- metatags Array [0]
- rdf_mapping Array [0]
- referring_entities: array|null. A nested array with (fully loaded) entities
referring to the current image. The 1st level of entries is keyed by the field
name, the 2nd by entity type, and the 3rd by entity id. Example data:
- field_photo Array [1]
- node Array [1]
- 12 Object of: stdClass
- nid (string) 12
- vid (string) 12
- type (string) page
- author ...
- timestamp ...
- ...
- entity: object|null, the 1st entity in referring_entities. This is for easy
access to the referring entity if it may be assumed that only 1 entity is
referring to the current image.
- image_field: array|null, the 1st image field in entity that is referring to
the current image. This is for easy access to the image field data if it may
be assumed that only 1 image field is referring to the current image. Example
data:
- fid (int) 2
- alt (string) ...
- title (string) ...
- ...

$image_context[‘entity’] - хранит объект сущности(в моем случае нода) к которой привязано изображение (точнее хранит первую сущность если их несколько).
Получив объект ноды в свое распоряжение, без особого труда вытаскиваем URL логотипа из привязанного термина таксономии.

Функция которая добавляет водяной знак в модуле “ImageCache Actions” уже есть, поэтому нужно просто найти название колбэка и передать все необходимые параметры в image_effect_apply($image, $effect)

, где
$image - массив который нам доступен (см. выше)
$effect - массив с параметрами эффекта, содержащий следующие элементы:

  • effect callback - колбэк эффекта
  • data - ассоциатитвный массив с параметрами которые передаются в effect callback

В файле imagecache_canvasactions.module ищем функцию imagecache_canvasactions_image_effect_info() и находим имя колбэка нужного эффекта, в моем случае - эффект watermark:

function imagecache_canvasactions_image_effect_info() {
…………………………….
  $effects['canvasactions_file2canvas'] = array(
    'label' => t('Overlay (watermark)'),
    'help' => t('Choose the file image you wish to use as an overlay,
              and position it in a layer on top of the canvas.'),
    'effect callback' => 'canvasactions_file2canvas_effect',
    'dimensions passthrough' => TRUE,
    'form callback' => 'canvasactions_file2canvas_form',
    'summary theme' => 'canvasactions_file2canvas_summary',
  );
…………………
}

Далее в файле canvasactions.inc находим этот колбэк и смотрим какие параметры в массив $data необходимо передавать:

/**
 * Image effect callback for the overlay (watermark) image effect.
 *
 * @param stdClass $image
 * @param array $data
 *
 * @return boolean
 *   true on success, false otherwise.
 */
function canvasactions_file2canvas_effect(stdClass $image, array $data = 
array()) {
  $overlay = imagecache_actions_image_load($data['path']);
  if ($overlay) {
    if (!isset($data['alpha'])) {
      $data['alpha'] = 100;
    }
    return image_overlay($image, $overlay, $data['xpos'],
$data['ypos'], $data['alpha']);
  }
  return FALSE;
}

, где

  • path - путь к изображению которое будет ватермарком
  • xpos - смещение по горизонтали в пикселях (можно использовать left, center, или right.)
  • ypos - смещение по вертикали в пикселях (можно использовать top, center, или bottom.)
  • alpha - непрозрачность (0-100)

То есть все те параметры, которые требуются если добавлять водяной знак через админку сайта.

Собираем массив $effect:

$effect = array (
 'effect callback' => 'canvasactions_file2canvas_effect',
 'data' => array (
  'xpos' => 'left+20',
  'ypos' => 'top+20',
  'alpha' => '80',
  'path' => $logo_uri, //URL ватермарка
 ),
);


, и отправляем image_effect_apply($image, $effect);

Полный код пресета:

  • field_manufacture - поле ноды, ссылка на термин таксономии
  • field_logo - поле термина таксономии, содержащее изображение логотипа

if (isset($image_context['entity'] -> field_manufacture[LANGUAGE_NONE]
[0]['tid'])){
  $term = taxonomy_term_load($image_context['entity']
 ->field_manufacture[LANGUAGE_NONE][0]['tid']);
  $logo_uri = isset($term->field_logo[LANGUAGE_NONE][0]['uri']) ? 
$term->field_logo[LANGUAGE_NONE][0]['uri'] : '';
    if ($logo_uri) {
      $effect = array (
        'effect callback' => 'canvasactions_file2canvas_effect',
          'data' => array (
            'xpos' => 'left+20',
            'ypos' => 'top+20',
            'alpha' => '80',
            'path' => $logo_uri,
          ),
      );
      return image_effect_apply($image, $effect);
    }
}
return FALSE;

Результат можно посмотреть тут - http://wekey.ru/security/dosmotr-posylok-bagazha/dosmotr-ruchnoy-kladi-bagazha-i-posylok/rapiscan-618xr

Алексей
Компания ib.by

Комментарии