Возврат картинки 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-коллбеком

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

  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступны HTML теги: <img> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <h1> <h2>
  • Строки и параграфы переносятся автоматически.
  • You may post code using <code>...</code> (generic) or <?php ... ?> (highlighted PHP) tags.
  • You can enable syntax highlighting of source code with the following tags: <code>, <blockcode>, <drupal6>, <php>.

Подробнее о форматировании

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