Возврат картинки AHAH-коллбеком

Возврат картинки AHAH-коллбекомДля получения картинки при клике по кнопке AHAH-запросом, нужна форма и AHAH-обработчик. Форма содержит текстовое поле (если нужно чтобы возвращаемая картинка содержала наш текст), кнопку submit, div для вывода сгенерированной картинки.
Текстовое поле для отправки текста. Текст отправлять не обязательно. Можно возвращать картинку или текст просто по кнопке submit, но это более простой случай, потому его рассматривать не будем. Кнопка содержит обязательные для AHAH-запроса массив #ahah, с параметром path, с информацией о AHAH-коллбеке - mymodule_message_js() (функцией, отвечающей за возврат результата в форму).

  1. function mymodule_form(){
  2. global $user;
  3. $form['title'] = array(
  4. '#type' => 'textfield',
  5. '#title' => t('My text'),
  6. '#default_value' => $node->title,
  7. '#size' => 60,
  8. '#maxlength' => 60,
  9. '#required' => TRUE,
  10. );
  11.  
  12. $form['submit'] = array(
  13. '#type' => 'submit',
  14. '#value' => t('click me'),
  15. '#ahah' => array(
  16. 'event' => 'click',
  17. 'path' => 'mymodule/message_js/',
  18. 'wrapper' => 'target',
  19. 'effect' => 'fade',
  20. )
  21. );
  22.  
  23. $form['target'] = array(
  24. '#type' => 'markup',
  25. '#prefix' => '<div id="target">',
  26. '#value' => t('This text will be replaced by a picture'),
  27. '#suffix' => '</div>',
  28. );
  29. return $form;
  30. }

AHAH-коллбек должен вернуть картинку, и, возможно, текст. Картинка удобно генерируется отдельным запросом (который не забываем прописать в хуке mymodule_menu). Функция drupal_json() возвращает скомпанованные данные. Будет ли картинка рисоваться с нуля или создаваться на основе заранее подготовленного изображения не важно. AHAH-коллбек возвратит ее в <div id="target">.

Переменная $str нужна для передачи текста в скрипт генерации изображения. Это не лучший вариант, но если особые требования не оговорены можно использовать его. Альтернативой может быть сохранение текста в БД и генерация картинки на основе значений из БД (генерация баннеров, статистики).

  1. function mymodule_message_js(){
  2. if ($str = $_POST['title']){
  3. $output = '<img src="myimage.png/'.$str.'"></a>';}
  4. drupal_json(array('status' => TRUE, 'data' => $output));
  5. }

Самая главная часть с hook_menu. Пункты в меню:

  1. $items['mypath'] отвечает за страницу где расположена описанная выше форма.
  2. $items['mymodule/message_js'] - AHAH-коллбек
  3. $items['myimage.png/%'] - генерация картинки

  1. function mymodule_menu() {
  2.  
  3. $items['mypath'] = array(
  4. 'title' => 'Custom caption',
  5. 'page callback' => 'drupal_get_form',
  6. 'page arguments' => array('stitch_form'),
  7. 'access callback' => user_access('myaccess'),
  8. );
  9.  
  10. $items['mymodule/message_js'] = array(
  11. 'page callback' => 'mymodule_message_js',
  12. 'page arguments' => $form_state,
  13. 'type' => MENU_CALLBACK,
  14. 'access callback' => user_access('myaccess'),
  15. );
  16.  
  17. $items['myimage.png/%'] = array(
  18. 'page callback' => 'mymodule_image',
  19. 'type' => MENU_CALLBACK,
  20. 'access callback' => user_access('myaccess'),
  21. 'page arguments' => array(1),
  22. );
  23.  
  24. return $items;
  25. }

Функция mymodule_image($str) реализуется с учетом основных требований для генерации картинки: отправка header-информации, генерации картинки, настройки кириллицы (если нужен кириллический текст), организации пути хранения файла шрифта на сервере.

  1. function mymodule_image($str){
  2. drupal_set_header("Content-type: image/png");
  3.  
  4. putenv('GDFONTPATH=' . realpath('.'));
  5. $image = imagecreate(88, 31);
  6. $background_color = imagecolorallocate($image, 2, 122, 198);
  7. $text_color = imagecolorallocate($image, 255, 255, 255);
  8. imagefill($image, 0, 0, $background_color);
  9.  
  10. $path_to_ttf = "modules/mymodule/arial.ttf";
  11. $text_color = imagecolorallocate ($image, $color_red=255, $color_green=255, $color_blue=255);
  12.  
  13. imagettftext($image, $size=8, $angle=0, $x=20, $y=10, $text_color, $path_to_ttf, $str);
  14.  
  15. imagepng($image);
  16. imagedestroy($image);
  17. exit();

Функция imagepng($image) в этом случае выводит картинку в части $output функции mymodule_message_js()
Результатом работы модуля при введенном тексте "jdrupal.ru", будет картинка
Картинка сгенерированная AHAH-коллбеком

Прикрепленный файлРазмер
jdrupal.png238 байтов

Отправить комментарий

CAPTCHA
Этот вопрос задается для того, чтобы выяснить, пьёте ли Вы кофе или рассылаете спам
5 + 4 =
Решите эту простую математическую задачу и введите результат. То есть для 1+3, введите 4.