|
|
|
| Внутри одной функции вызывается вторая.
В функции b_form мне нужно использовать переменную $path_file, которая формируется в функции asd().
Передавать как аргумент в функцию b_form() нельзя, b_form() - функция ядра и имеет определенный набор аргументов(я их здесь для простоты не писала).
Как мне передать? Вот пример.
<?php
function asd(){
$path_file = 'image_' . mt_rand() . '.png';
$c = b_form();
return $c;
}
function b_form(){
$res['img'] = '<img src="'. check_url(url($path_file)).'" />';
//другие элементы массива $res;
return $res;
}
?>
|
Если непонятно объяснила, спрашивайте. | |
|
|
|
|
|
|
|
для: Лена
(15.06.2009 в 11:05)
| | Ядро - имеется в виду - php? | |
|
|
|
|
|
|
|
для: Trianon
(15.06.2009 в 11:17)
| | Нет, ядро Друпала. | |
|
|
|
|
|
|
|
для: Лена
(15.06.2009 в 11:32)
| | Странно, по идее если её туда нельзя передать, значит она там не используется...
может я Вас неправильно понимаю, но если вы внесли изменение в функцию ядра, то почему нельзя передавать? | |
|
|
|
|
|
|
|
для: Valick
(15.06.2009 в 11:38)
| | На самом деле, достаточно часто в ту или иную callback-функцию необходимо передать некоторый пользовательский контекст.
Как это корректно делается в друпале - я не знаю.
В принципе, последним средством и вправду будет использовать $GLOBALS , и если этот самый callback не обязан быть реентерабельным, то ничего страшного по идее произойти не может.
Хотя, если в конкретной среде есть правила передачи контекста, лучше воспользоваться ими. | |
|
|
|
|
 39.5 Кб |
|
|
для: Trianon
(15.06.2009 в 12:52)
| | Помогите, пожалуйста.
Рассказываю честно, что делаю.
Попробовала я сделать капчу на Друпале отдельным модулем. Дело в том, что без Друпала(только средствами PHP) и капча, и форма идут на ура, при переносе в Друпал изображение не выводится, вместо него - крестик. Пути правильные, вроде как все правильное, только где-то изображение блокируется. Как мне сказали, что возможна ситуация, когда один модуль конфликтует с другим и из-за этого не выводится.
Все, что было можно, перепробовала, не получалось, а потом решила, что называется, извратиться.
Попробовала сформировать случайное иображение, записать его в файл и вывести уже сохраненный файл, после файл удалить. Как ни странно, получилось.
Только вот название файла я теперь хочу сделать не статичное(image.png), а динамичное(image_' . mt_rand() . '.png). В этом-то вся и загвоздка. Нужно передать название изображения из одной функции в другую.
Вот код(упрощенный):
<?php
//callback-функция
function testimagepng_mypage(){
//здесь я генерирую изображение
//формирую случайное число, которое буду выводить поверх изображения
//и сохраняю число в переменной $number
//посылаю заголовки - не кешировать изображение, заголовок, указывающий на тип изображения
//вывод изображения в файл
$path_file = 'image_' . mt_rand() . '.png';
imagepng($im, $path_file);
imagedestroy($im);
//записываем полученное число в сессию
$_SESSION['number'] = $number;
//выводим изображение из файла в форму
//drupal_get_form - функция ядра, парсер всех форм Друпала,
//разбирает массив и превращает его в html-код(см. ниже, в другой функции)
$tcontent = drupal_get_form('testimagepng_form',$node);
return $tcontent;
//убиваем файл
unlink($path_file);
}
//формируем саму форму, в которой мы используем капчу
//на выходе получается стандартный html-код типа <form action = '' method... - и т.д.
function testimagepng_form($node){
global $path_file;
$res['mycaptcha_image'] = array(
'#type' => 'markup',
'#value' => '<img src="'. check_url(url($path_file)) .'" alt="'. t('Image CAPTCHA') .
'" title="'. t('Image CAPTCHA') .'" /><br><br>',
'#weight' => -1,
);
//другие элементы формы
return $res;
}
?>
|
В результате получается форма, картинку которой я прикрепила в аттаче.
Как передать переменную из testimagepng_mypage в testimagepng_form.
global ничего не дает. | |
|
|
|
|
|
|
|
для: Лена
(15.06.2009 в 14:53)
| | Первое, что бросается в глаза, это то, что переменная $path_file определяется в функции function testimagepng_mypage() как локальная. То есть с глобальной $path_file никак не соотносится.
так что для начала
function testimagepng_mypage(){
global $path_file; | |
|
|
|
|
|
|
|
для: Trianon
(15.06.2009 в 14:59)
| | Получилось, но не все.
Картинка теперь отображается, но после вывода формы я хочу удалить само изображение. Файл изображения не удаляется. - unlink($path_file); | |
|
|
|
|
|
|
|
для: Лена
(15.06.2009 в 15:50)
| | return $tcontent;
//убиваем файл
unlink($path_file);
после return ничего выполняться все равно не будет.
Кроме того, если его удалить, как же тогда его браузер покажет? | |
|
|
|
|
|
|
|
для: Trianon
(15.06.2009 в 15:55)
| | Нет, я хочу вывести, а потом удалить. Я же не буду все эти файлы со случайными названиями собирать. Есть мысль, что это можно сделать в обработчике. Пришли данные формы - удаляем файл, а потом уже сравниваем цифры из сессии и пост-данные. | |
|
|
|
|
|
|
|
для: Лена
(15.06.2009 в 16:33)
| | можно и так.
Можно вообще удалить все файлы из этого каталога, созданные ранее чем 5 минут назад.
Это если скриптом отдать файл не выходит никак. Что крайне странно само по себе. | |
|
|
|
|
|
|
|
для: Trianon
(15.06.2009 в 16:40)
| | А по времени как быстрее: при каждом вызове скрипта удалять один файл или сразу кучу файлов удалять, которые насобирались за 5 минут? | |
|
|
|
|
|
|
|
для: Лена
(15.06.2009 в 22:47)
| | несущественно.
Важнее то, что второй вариант за собой гарантированно подотрет.
Первый же.... | |
|
|
|
|
|
|
|
для: Лена
(15.06.2009 в 15:50)
| | Вы можете вообще не сохранять никуда файл (если дело касается каптчи). | |
|
|
|
|
|
|
|
для: sim5
(15.06.2009 в 16:17)
| | Без файла не получается, я уже все возможные способы перепробовала. | |
|
|
|
|
|
|
|
для: Лена
(15.06.2009 в 16:34)
| | Значит не все перепробовали. Сохранять каптчу нужно не на диске для пользователей, а через память в сессии. Уже если нельзя куда-то что-то передать, то уж где-то сохранить в сессии, а в другом месте получить всегда можно:
<?
//рисуем каптчу
$im = imagecreate (80, 32);
$bgc = imagecolorallocate ($im, 0, 0, 0);
$tc = imagecolorallocate ($im, 255, 255, 255);
imagefilledrectangle ($im, 0, 0, 80, 32, $bgc);
imagestring ($im, 1, 5, 5, "Ab36F", $tc);
//сохраняем ее через память в сессию
ob_start();
imagejpeg($im);
$_SESSION['im'] = ob_get_contents();
ob_end_clean();
imagedestroy($im);
//где требуется выводим
$im = imagecreatefromstring($_SESSION['im']);
imagejpeg($im);
//или просто
echo $_SESSION['im'];
|
| |
|
|
|
|
|
|
|
для: Лена
(15.06.2009 в 11:05)
| | можно объявить его (аргумент, переменную) глобально | |
|
|
|