Здравствуйте, Пытаюсь сгенерировать ("image.php") в компонент изображение с текстом. Текст берется из сессионного глобмассива. Но на самом деле ничего не берется. Если чуть переделать код image.php: echo $_SESSION['text']; exit; и просто подключить этот файл к странице (require_once()), то текст из сессионной переменной показывается. А подключая как изображение нифига: Код где должно отображаться изображение: Код (PHP): ..... <img src="components/com_test/image.php?id=<?=session_id()?>" /> .... Код " image.php": Код (PHP): $id = $_GET['id']; session_id($id); session_start(); $str = $_SESSION["text"]; $im=imagecreate(500,35) or die ("Cannot Initialize new GD image stream"); $background=imagecolorallocate($im,255,100,255); $textcolor=imagecolorallocate($im,255,255,255); imagestring($im,5,0,9,$str,$textcolor); header( 'Content-type: image/png' ); imagePNG($im); $_SESSION: Код (PHP): Array ( [__default] => Array ( ....... ......... ........ ) [text] => hello ) Если это делать не в Joomla, то все нормально. Не подскажите, как правильно брать сессионную переменную?
Я, как тот самый представитель той самой национальности, отвечу вопросом на вопрос - а нафига такой изврат через файл image.php. Не проще ли через файл компонента это пустить? Что касается сессий, то в джумле работают функции ob_*, а они, как я помню, не очень дружат с ними.
Может я вообще чего-то не так делаю? Код в "default.php" Код (PHP): <img src="<?=JROUTE::_('index2.php?option=com_guest&task=img&no_html=1');?>" /> task=img В методе "img" контроллера находится код генерации изображения. Вообще ничего не показывает. Если этот код поместить в отдельный файл и вызвать его через <img src=.../>, картинку показывает, но в нем доступа к сессии уже нет. Вот если бы в отдельном файле добится доступа к сессии Joomla... Надо как-то указать, что session_start() -- в БД, а не на сервере.
Тэкс. Забудь про сессии. Тебе в джумле доступен объект пользователя, а через него можно выйти на сессию - разве это не оно?
uborshik, Отследи заголовки, когда через index2.php изображение генерируешь может тогда в логе ошибок что-то остается?
Да не очень то доступен мне объект пользователя, скрипт вроде в директории сайта лежит, но он как-бы к Joomla не подключен. Это скрипт выводящий картинку средствами РНР -- изображение "каптчи". Я над ним по-всякому извращался. И в компонент засовывал и даже в объекты Joomla пытался. И в виде функции в "default.php" оформлял. В общем извращался как мог, лишь бы получить доступ к сессии. У меня в сессии сгенерированный код для этой "каптчи" лежит. Короче очередной изврат: Кидаю файл с "Каптчей" ('captcha.php') в корневую директорию. В скрипте выводящим страницу c формой ('default.php') так и прописываю: <img src='captcha.php' /> В 'captcha.php': Код (PHP): if(!defined('JPATH_BASE')) define ('JPATH_BASE',dirname(__FILE__)); if(!defined('_JEXEC')) define ('_JEXEC',1); if(!defined('DS')) define ('DS',DIRECTORY_SEPARATOR); require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' ); require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' ); $s = &JFactory::getSession(); $d = $s->get('session.counter'); $img = imagecreatetruecolor(520, 240); $text_color = imagecolorallocate($img, 233, 14, 91); imagestring($img, 2, 5, 5, "com_GUEST: ".$d, $text_color); imagepng($img); imagedestroy($img); Я уже даже и не знаю, как это назвать. Но это работает. По-крайней мере читает в картинку переменные сессии. И меня бы даже это очень устроило. Каковы могут быть последствия такого решения? Какие косяки могут вылезти в дальнейшем? Не все переменные сессии читает. В пространстве имен [__default] может прочесть [session.count],[session.timer.start[last[now]]], но находящуюся там же [numers], установленную как Код (PHP): $sess=&JFactory::getSession(); $sess->('numers',222); Не читает. Возможно не тот ID сессии. Где-бы про это почитать...
Согласен. Да и сам путь мой показанный выше, кажись тупиковый. В 'captcha.php' сессия открывается под стандартным именем(PHPSESSID), ID уже бесполезно рассматривать. В БД сессий этого имени нет значит берется это все не из БД сессий, либо Джумла это быстренько все уничтожает из БД, что не успеваю отследить. Мне кажется, что даже если (не знаю, как) принудительно задать имя и ID сессии при методе JFactory::getSession(), все равно ничего не выйдет в моем случае, раз ищет сессии не в БД, а на сервере. (хотя может чего не так понял). На крайняк, можно принудительно вытаскивать сессию из БД (это сто процентов работает правильно, уже пробовал), но это опять не пишется с политикой безопасности. Мне очень понравилась идея с index2.php, но пока даже и не знаю как вообще правильно организовывать подобные решения. Рою инет.
Ну, в общем, не стал исправлять предыдущий пост, чтобы понятно было о чем речь. Короче все работает. Надо было в 'default.php' изображение выводить так: Код (PHP): <?php $sn=session_name(); $cid=session_id(); ?> <img src="capcha.php?sn=<?=$sn; ?>&cid=<?=$cid; ?>" /> В ' captcha.php ' добавить Код (PHP): ... @$cid = $_GET['cid']; session_id($cid); $s = &JFactory::getSession(); ... А код инициализации сессионной переменной поставил в index.php Джумлы. Код (PHP): $rands = rand(1,9).rand(1,9).rand(1,9); $gSess = &JFactory::getSession(); $gSess->set('numers',$rands); Наверное, конечно, нужно где-то в другом месте инициализировать. Я было в самом компоненте это делать начал, но "капча" не подхватывала его. Конечно, не супер решение, но это уже лучше чем мое самое первое (в топе не описывал), когда из БД брал сессию вручную. Буду рыть дальше на предмет index2.php. Либо пытаться это решение встроить в Joomla по человечески.
Да, чтоб поставить точку, код инициализации переменной сессии мало установить просто, абы где, в index.php. Это я прописывал после этих строк: index.php Код (PHP): require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' ); require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' ); $rands = rand(1,9).rand(1,9).rand(1,9); $gSess = &JFactory::getSession(); $gSess->set('numers',$rands); Ниже, после $mainframe =& JFactory::getApplication('site'), моя "каптча" -- уже не схватывла нужную переменную. (выше, даже не пробовал).
Итого: для создания работоспособной каптчи с использованием сессий на джумле 1.5 используем: кусок файла темплейта: .... Код (PHP): <? $sess = JFactory::getSession(); ?> <img src="<? echo JURI::base()."/";?>index2.php?option=com_contact&task=getcaptcha&<?echo $sess->getName(); ?>=<? echo $sess->getId()?>" /> ... в контролере компонента (в данном случае com_contact) добавляем функцию ... Код (PHP): function getcaptcha() { include('captcha/kcaptcha.php'); $captcha = new KCAPTCHA(); $sess = JFactory::getSession(); if($_REQUEST[$sess->getName()]){ $sess->set('captcha_keystring', $captcha->getKeyString()); } exit; } ... и при сабмите формы получаем: ... Код (PHP): function submit() { global $mainframe; // Test captcha $captcha = JRequest::getVar('captcha'); $sess = JFactory::getSession(); $sessCaptcha = $sess->get('captcha_keystring'); .... з.ы: joomla в функции register в includes/joomla/session/storage.php вызывает session_set_save_handler - устанавливая новые кааллбеки функций работы с сессиями( по умолчанию в джумле сессии хранятся в БД) - этот параметр можно перенастроить, поставив - в configuration.php параметру $session_handler одно из сл. значений: none, database, apc, eaccelerator, memcache, xcache. в принципе ни чего сложного при работе с механизмом сессий джумлы.
Есть вопрос: Хочу добавить к каптче кнопку "обновить изображение" на случай, если оно будет трудно различимо. Делаю это через ajax по нажатию кнопки. Проблема в том чтобы ajax вернул новый пароль и перезаписал значение в джумловской сессии. Но если поставить $gSess = JFactory::getSession(); $gSess->set('captcha_keystring',base64_encode($captcha_k)); перед выводом, то вернет пустое значение, а если после, то не перезапишется сессия. вот не знаю как быть. Спасибо за ответы. PS Понимаю, что передавать капчу через GET (пусть и в base64) не слишком безопасно, потом сделаю шифрование по ключу. Сейчас проблема не в этом. Код (html): <script language="javascript" type="text/javascript"> .... //По клику отправляю ajax-запрос к файлу new_pass.php, и передаю его возврат в капчу $('#btnReloadCapcha').click(function(){ var url_capcha = "/components/com_adsmanager/capcha/index.php"; var url_new_pass = "/components/com_adsmanager/capcha/new_pass.php"; // alert(url_new_pass); $.post(url_new_pass, {capcha_field:$('#capcha_field').get(0).value}, function(data) { alert(data); url_capcha +="?<?php echo session_name()?>=<?php echo session_id()?>&cptch="+data; document.getElementById('imgCpch').src = url_capcha; }, 'text'); }); }); .... </script> new_pass.php Код (PHP): require_once("../../../libraries/loader.php"); require_once("../../../libraries/joomla/factory.php"); $captcha_k = generate_password(5); session_start(); $gSess = JFactory::getSession(); $gSess->set('captcha_keystring',base64_encode($captcha_k)); echo base64_encode($captcha_k);
Если каптча генерирует случайное изображение каждый раз, то можно просто обновлять картинку через JS, добавляя к ссылке случайное число(чтобы не выдавалось кэшированное изображение).
Проблема как раз не с генерацией нового изображения через js, а сохранения нового значения в джумловскую сессию. Сейчас прикручиваю капчу к компоненту adsmanager. Пытался сделать по аналогии с решением, предложенным progmist - не вышло,т.к. не удалось одновременно обратиться к сессии и к сгенерированному капчей значению. Не очень понял, что является контроллером для adsmanager, в который надо вставлять function getcaptcha(). В итоге стал генерить отдельно код капчи,писать его в джумловскую сессию, и передавать его в зашифрованном виде в изображение через GET.
Всё бы ничего, да вот только с генерацией изображения проблема. Оно генерируется, но браузеры отказываются отображать, мотивируя это тем что оно неверное. В чём может проблема?