Возврат картинки AHAH-коллбеком
Прислано: sadmin
пн, 01/03/2010 - 08:55
Для получения картинки при клике по кнопке AHAH-запросом, нужна форма и AHAH-обработчик. Форма содержит текстовое поле (если нужно чтобы возвращаемая картинка содержала наш текст), кнопку submit, div для вывода сгенерированной картинки.
Текстовое поле для отправки текста. Текст отправлять не обязательно. Можно возвращать картинку или текст просто по кнопке submit, но это более простой случай, потому его рассматривать не будем. Кнопка содержит обязательные для AHAH-запроса массив #ahah, с параметром path, с информацией о AHAH-коллбеке - mymodule_message_js() (функцией, отвечающей за возврат результата в форму).
Кросс-пост с моего блога http://jdrupal.ru | На хабре только ссылкой
function mymodule_form(){ global $user; $form['title'] = array( '#type' => 'textfield', '#title' => t('My text'), '#default_value' => $node->title, '#size' => 60, '#maxlength' => 60, '#required' => TRUE, ); $form['submit'] = array( '#type' => 'submit', '#value' => t('click me'), '#ahah' => array( 'event' => 'click', 'path' => 'mymodule/message_js/', 'wrapper' => 'target', 'effect' => 'fade', ) ); $form['target'] = array( '#type' => 'markup', '#prefix' => '<div id="target">', '#value' => t('This text will be replaced by a picture'), '#suffix' => '</div>', ); return $form; }
AHAH-коллбек должен вернуть картинку, и, возможно, текст. Картинка удобно генерируется отдельным запросом (который не забываем прописать в хуке mymodule_menu). Функция drupal_json() возвращает скомпанованные данные. Будет ли картинка рисоваться с нуля или создаваться на основе заранее подготовленного изображения не важно. AHAH-коллбек возвратит ее в <div id="target">.
Переменная $str нужна для передачи текста в скрипт генерации изображения. Это не лучший вариант, но если особые требования не оговорены можно использовать его. Альтернативой может быть сохранение текста в БД и генерация картинки на основе значений из БД (генерация баннеров, статистики).
function mymodule_message_js(){ if ($str = $_POST['title']){ $output = '<img src="myimage.png/'.$str.'"></a>';} drupal_json(array('status' => TRUE, 'data' => $output)); }
Самая главная часть с hook_menu. Пункты в меню:
- $items['mypath'] отвечает за страницу где расположена описанная выше форма.
- $items['mymodule/message_js'] - AHAH-коллбек
- $items['myimage.png/%'] - генерация картинки
function mymodule_menu() { $items['mypath'] = array( 'title' => 'Custom caption', 'page callback' => 'drupal_get_form', 'page arguments' => array('stitch_form'), 'access callback' => user_access('myaccess'), ); $items['mymodule/message_js'] = array( 'page callback' => 'mymodule_message_js', 'page arguments' => $form_state, 'type' => MENU_CALLBACK, 'access callback' => user_access('myaccess'), ); $items['myimage.png/%'] = array( 'page callback' => 'mymodule_image', 'type' => MENU_CALLBACK, 'access callback' => user_access('myaccess'), 'page arguments' => array(1), ); return $items; }
Функция mymodule_image($str) реализуется с учетом основных требований для генерации картинки: отправка header-информации, генерации картинки, настройки кириллицы (если нужен кириллический текст), организации пути хранения файла шрифта на сервере.
function mymodule_image($str){ drupal_set_header("Content-type: image/png"); putenv('GDFONTPATH=' . realpath('.')); $image = imagecreate(88, 31); $background_color = imagecolorallocate($image, 2, 122, 198); $text_color = imagecolorallocate($image, 255, 255, 255); imagefill($image, 0, 0, $background_color); $path_to_ttf = "modules/mymodule/arial.ttf"; $text_color = imagecolorallocate ($image, $color_red=255, $color_green=255, $color_blue=255); imagettftext($image, $size=8, $angle=0, $x=20, $y=10, $text_color, $path_to_ttf, $str); imagepng($image); imagedestroy($image); exit();
Функция imagepng($image) в этом случае выводит картинку в части $output функции mymodule_message_js()
Результатом работы модуля при введенном тексте "jdrupal.ru", будет картинка
![]()
- sadmin's blog
- Для комментирования войдите или зарегистрируйтесь
Отличная статья!
Не понятно откуда в фунции появляется $str:
function mymodule_message_js(){ $output = '<img src="myimage.png/'.$str.'"></a>'; drupal_json(array('status' => TRUE, 'data' => $output)); }
Её нет на ходе среди параметров и нет объявления глобальной переменной.
- Для комментирования войдите или зарегистрируйтесь
Спасибо, верно подмечено! Ошибся при переписывании для заметки, в рабочем варианте
function mymodule_message_js(){ if ($str = $_POST['title']){ $output = '<img src="myimage.png/'.$str.'"></a>'; } drupal_json(array('status' => TRUE, 'data' => $output)); }
- Для комментирования войдите или зарегистрируйтесь
if ($str = $_POST['title']){
Не будет ли опасно?
- Для комментирования войдите или зарегистрируйтесь
Дык он втыкает текст в картинку, и всё. В чем может быть опасность?
- Для комментирования войдите или зарегистрируйтесь
Cорри, протупил, подумал сначала что он в alt или куда-то туда вставляет. Побоялся XSS
- Для комментирования войдите или зарегистрируйтесь
хорошо бы хук от имиджкеша подключить как-нибудь (сам хочу научить, но пока руки не дошли), чтобы на диск записывалась картинка и кешировалась(зачем её каждый раз генерировать), но пожайлуй это уже совсем другая история...
хочется чего-то вида /img/testpic/мойтекст.png, чтобы обрабатывалось imagecache-м, и позволяло выполнять разные действия-пресеты над картинкой (превьюшки)
- Для комментирования войдите или зарегистрируйтесь
При чем тут imagecache?
В функции function mymodule_image($str) сперва проверяете, есть ли уже файл 'saved_images/' . md5($str) . '.png
Если есть - возвращаете его
если нет - генерите картинку и сохраняете по пути 'saved_images/' . md5($str) . '.png'
http://php.net/manual/en/function.imagepng.php в помощь
- Для комментирования войдите или зарегистрируйтесь
хочется чего-то вида /img/testpic/мойтекст.png, чтобы обрабатывалось imagecache-м, и позволяло выполнять разные действия-пресеты над картинкой (превьюшки)
Ну вот как я выше описал, вывести картинку можно theme('imagecache', 'PRESET', 'saved_images/' . md5('мой текст') . '.png')
- Для комментирования войдите или зарегистрируйтесь
что мне как злоумышленнику мешает создать вот такой простенький ДОС
создаем контент следующего содержания
<img src="myimage.png/idite_vse_lesomidite_vse_lesomidite_vse_lesomidite_vse_lesom">
продублировав его n раз?
и что произойдет когда обычный пользователь откроет этот контент?
а если я это создам в месте которое топовое по популярности?
mymodule_image я бы вынес в отдельный независящий от друпала файл.
в него в обязательном порядке добавил бы token для контроля правомочности запроса.
- Для комментирования войдите или зарегистрируйтесь
Добро пожаловать в Друпал, сынок!
Удали пост.
Не терзай души молодых друпалговнокодеров.
;)
- Для комментирования войдите или зарегистрируйтесь
я правильно понимаю, что могу напрямую вызывать myimage.png/аббакадабра без всяких форм? отличная дыра для ддоса )
чорт, писал ответ когда верхнего поста про ддос еще не было))
- Для комментирования войдите или зарегистрируйтесь
Спасибо. Пригодится.
- Для комментирования войдите или зарегистрируйтесь






Комментарии