Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Функции
 
 автор: Лена   (15.06.2009 в 11:05)   письмо автору
 
 

Внутри одной функции вызывается вторая.
В функции 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;
}
?>

Если непонятно объяснила, спрашивайте.

  Ответить  
 
 автор: Trianon   (15.06.2009 в 11:17)   письмо автору
 
   для: Лена   (15.06.2009 в 11:05)
 

Ядро - имеется в виду - php?

  Ответить  
 
 автор: Лена   (15.06.2009 в 11:32)   письмо автору
 
   для: Trianon   (15.06.2009 в 11:17)
 

Нет, ядро Друпала.

  Ответить  
 
 автор: Valick   (15.06.2009 в 11:38)   письмо автору
 
   для: Лена   (15.06.2009 в 11:32)
 

Странно, по идее если её туда нельзя передать, значит она там не используется...
может я Вас неправильно понимаю, но если вы внесли изменение в функцию ядра, то почему нельзя передавать?

  Ответить  
 
 автор: Trianon   (15.06.2009 в 12:52)   письмо автору
 
   для: Valick   (15.06.2009 в 11:38)
 

На самом деле, достаточно часто в ту или иную callback-функцию необходимо передать некоторый пользовательский контекст.

Как это корректно делается в друпале - я не знаю.
В принципе, последним средством и вправду будет использовать $GLOBALS , и если этот самый callback не обязан быть реентерабельным, то ничего страшного по идее произойти не может.
Хотя, если в конкретной среде есть правила передачи контекста, лучше воспользоваться ими.

  Ответить  
 
 автор: Лена   (15.06.2009 в 14:53)   письмо автору
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 ничего не дает.

  Ответить  
 
 автор: Trianon   (15.06.2009 в 14:59)   письмо автору
 
   для: Лена   (15.06.2009 в 14:53)
 

Первое, что бросается в глаза, это то, что переменная $path_file определяется в функции function testimagepng_mypage() как локальная. То есть с глобальной $path_file никак не соотносится.

так что для начала
function testimagepng_mypage(){
global $path_file;

  Ответить  
 
 автор: Лена   (15.06.2009 в 15:50)   письмо автору
 
   для: Trianon   (15.06.2009 в 14:59)
 

Получилось, но не все.
Картинка теперь отображается, но после вывода формы я хочу удалить само изображение. Файл изображения не удаляется. - unlink($path_file);

  Ответить  
 
 автор: Trianon   (15.06.2009 в 15:55)   письмо автору
 
   для: Лена   (15.06.2009 в 15:50)
 

return $tcontent;
//убиваем файл
unlink($path_file);

после return ничего выполняться все равно не будет.

Кроме того, если его удалить, как же тогда его браузер покажет?

  Ответить  
 
 автор: Лена   (15.06.2009 в 16:33)   письмо автору
 
   для: Trianon   (15.06.2009 в 15:55)
 

Нет, я хочу вывести, а потом удалить. Я же не буду все эти файлы со случайными названиями собирать. Есть мысль, что это можно сделать в обработчике. Пришли данные формы - удаляем файл, а потом уже сравниваем цифры из сессии и пост-данные.

  Ответить  
 
 автор: Trianon   (15.06.2009 в 16:40)   письмо автору
 
   для: Лена   (15.06.2009 в 16:33)
 

можно и так.
Можно вообще удалить все файлы из этого каталога, созданные ранее чем 5 минут назад.

Это если скриптом отдать файл не выходит никак. Что крайне странно само по себе.

  Ответить  
 
 автор: Лена   (15.06.2009 в 22:47)   письмо автору
 
   для: Trianon   (15.06.2009 в 16:40)
 

А по времени как быстрее: при каждом вызове скрипта удалять один файл или сразу кучу файлов удалять, которые насобирались за 5 минут?

  Ответить  
 
 автор: Trianon   (16.06.2009 в 02:28)   письмо автору
 
   для: Лена   (15.06.2009 в 22:47)
 

несущественно.
Важнее то, что второй вариант за собой гарантированно подотрет.
Первый же....

  Ответить  
 
 автор: sim5   (15.06.2009 в 16:17)   письмо автору
 
   для: Лена   (15.06.2009 в 15:50)
 

Вы можете вообще не сохранять никуда файл (если дело касается каптчи).

  Ответить  
 
 автор: Лена   (15.06.2009 в 16:34)   письмо автору
 
   для: sim5   (15.06.2009 в 16:17)
 

Без файла не получается, я уже все возможные способы перепробовала.

  Ответить  
 
 автор: sim5   (21.06.2009 в 00:26)   письмо автору
 
   для: Лена   (15.06.2009 в 16:34)
 

Значит не все перепробовали. Сохранять каптчу нужно не на диске для пользователей, а через память в сессии. Уже если нельзя куда-то что-то передать, то уж где-то сохранить в сессии, а в другом месте получить всегда можно:
<?
//рисуем каптчу
$im  imagecreate (8032);
$bgc imagecolorallocate ($im000);
$tc  imagecolorallocate ($im255255255);
imagefilledrectangle ($im008032$bgc);
imagestring ($im155"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']; 

  Ответить  
 
 автор: GeorgeIV   (15.06.2009 в 11:19)   письмо автору
 
   для: Лена   (15.06.2009 в 11:05)
 

можно объявить его (аргумент, переменную) глобально

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования