Joomla 1.5 Генерация изображений и массив сессии

Тема в разделе "Программирование", создана пользователем uborshik, 15.06.2009.

  1. Offline

    uborshik Недавно здесь

    Регистрация:
    15.06.2009
    Сообщения:
    7
    Симпатии:
    0
    Пол:
    Мужской
    Здравствуйте,
    Пытаюсь сгенерировать ("image.php") в компонент изображение с текстом. Текст берется из сессионного глобмассива.
    Но на самом деле ничего не берется.

    Если чуть переделать код image.php: echo $_SESSION['text']; exit; и просто подключить этот файл к странице (require_once()), то текст из сессионной переменной показывается. А подключая как изображение нифига:
    Код где должно отображаться изображение:
    Код (PHP):
    1. .....
    2. <img src="components/com_test/image.php?id=<?=session_id()?>" />
    3. ....


    Код " image.php":
    Код (PHP):
    1. $id = $_GET['id'];
    2. session_id($id);
    3. session_start();
    4. $str = $_SESSION["text"];
    5.  
    6. $im=imagecreate(500,35) or die ("Cannot Initialize new GD image stream");
    7. $background=imagecolorallocate($im,255,100,255);
    8. $textcolor=imagecolorallocate($im,255,255,255);
    9. imagestring($im,5,0,9,$str,$textcolor);
    10.  
    11. header( 'Content-type: image/png' );
    12. imagePNG($im);


    $_SESSION:
    Код (PHP):
    1. Array
    2. (
    3.     [__default] => Array
    4.  
    5.         (
    6.             .......
    7.                 .........
    8.                       ........
    9.          )
    10.  
    11.    [text] => hello
    12.  
    13. )


    Если это делать не в Joomla, то все нормально.

    Не подскажите, как правильно брать сессионную переменную?
     
    Последнее редактирование: 15.06.2009
  2.  
  3. Dead Krolik
    Offline

    Dead Krolik специалист

    Регистрация:
    13.04.2007
    Сообщения:
    3 688
    Симпатии:
    101
    Пол:
    Мужской
    Я, как тот самый представитель той самой национальности, отвечу вопросом на вопрос - а нафига такой изврат через файл image.php. Не проще ли через файл компонента это пустить?

    Что касается сессий, то в джумле работают функции ob_*, а они, как я помню, не очень дружат с ними.
     
  4. Offline

    uborshik Недавно здесь

    Регистрация:
    15.06.2009
    Сообщения:
    7
    Симпатии:
    0
    Пол:
    Мужской
    Если через файл компонента пропускать, то вместо изображения какие-то "крякозяблики" пишет.
     
  5. sectus
    Offline

    sectus специалист

    Регистрация:
    19.04.2006
    Сообщения:
    1 210
    Симпатии:
    46
    Пол:
    Мужской
    Надо через index2.php или добавить в запрос ?tmpl=component
     
  6. Offline

    uborshik Недавно здесь

    Регистрация:
    15.06.2009
    Сообщения:
    7
    Симпатии:
    0
    Пол:
    Мужской
    Может я вообще чего-то не так делаю?

    Код в "default.php"
    Код (PHP):
    1. <img src="<?=JROUTE::_('index2.php?option=com_guest&task=img&no_html=1');?>" />

    task=img
    В методе "img" контроллера находится код генерации изображения.
    Вообще ничего не показывает. Если этот код поместить в отдельный файл и вызвать его через <img src=.../>, картинку показывает, но в нем доступа к сессии уже нет.
    Вот если бы в отдельном файле добится доступа к сессии Joomla... Надо как-то указать, что session_start() -- в БД, а не на сервере.
     
    Последнее редактирование: 17.06.2009
  7. Dead Krolik
    Offline

    Dead Krolik специалист

    Регистрация:
    13.04.2007
    Сообщения:
    3 688
    Симпатии:
    101
    Пол:
    Мужской
    Тэкс. Забудь про сессии. Тебе в джумле доступен объект пользователя, а через него можно выйти на сессию - разве это не оно?
     
  8. sectus
    Offline

    sectus специалист

    Регистрация:
    19.04.2006
    Сообщения:
    1 210
    Симпатии:
    46
    Пол:
    Мужской
    uborshik, Отследи заголовки, когда через index2.php изображение генерируешь

    может тогда в логе ошибок что-то остается?
     
  9. Offline

    uborshik Недавно здесь

    Регистрация:
    15.06.2009
    Сообщения:
    7
    Симпатии:
    0
    Пол:
    Мужской
    Да не очень то доступен мне объект пользователя, скрипт вроде в директории сайта лежит, но он как-бы к Joomla не подключен.
    Это скрипт выводящий картинку средствами РНР -- изображение "каптчи". Я над ним по-всякому извращался. И в компонент засовывал и даже в объекты Joomla пытался. И в виде функции в "default.php" оформлял. В общем извращался как мог, лишь бы получить доступ к сессии. У меня в сессии сгенерированный код для этой "каптчи" лежит.

    Короче очередной изврат:
    Кидаю файл с "Каптчей" ('captcha.php') в корневую директорию.
    В скрипте выводящим страницу c формой ('default.php') так и прописываю: <img src='captcha.php' />
    В 'captcha.php':
    Код (PHP):
    1. if(!defined('JPATH_BASE')) define ('JPATH_BASE',dirname(__FILE__));
    2.         if(!defined('_JEXEC')) define ('_JEXEC',1);
    3.         if(!defined('DS')) define ('DS',DIRECTORY_SEPARATOR);
    4.  
    5.         require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' );
    6.     require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' );
    7.  
    8.         $s = &JFactory::getSession();
    9.         $d = $s->get('session.counter');
    10.  
    11.         $img = imagecreatetruecolor(520, 240);
    12.         $text_color = imagecolorallocate($img, 233, 14, 91);
    13.         imagestring($img, 2, 5, 5, "com_GUEST: ".$d, $text_color);
    14.         imagepng($img);
    15.         imagedestroy($img);

    Я уже даже и не знаю, как это назвать. Но это работает. По-крайней мере читает в картинку переменные сессии. И меня бы даже это очень устроило.
    Каковы могут быть последствия такого решения? Какие косяки могут вылезти в дальнейшем?
    Не все переменные сессии читает. В пространстве имен [__default] может прочесть [session.count],[session.timer.start[last[now]]], но находящуюся там же [numers], установленную как
    Код (PHP):
    1. $sess=&JFactory::getSession();
    2. $sess->('numers',222);
    Не читает.
    Возможно не тот ID сессии.
    Где-бы про это почитать...
     
    Последнее редактирование: 18.06.2009
  10. Dead Krolik
    Offline

    Dead Krolik специалист

    Регистрация:
    13.04.2007
    Сообщения:
    3 688
    Симпатии:
    101
    Пол:
    Мужской
    Вне джумлы даже и не думай, бессмысленно и опасно.
     
  11. Offline

    uborshik Недавно здесь

    Регистрация:
    15.06.2009
    Сообщения:
    7
    Симпатии:
    0
    Пол:
    Мужской
    Согласен. Да и сам путь мой показанный выше, кажись тупиковый. В 'captcha.php' сессия открывается под стандартным именем(PHPSESSID), ID уже бесполезно рассматривать. В БД сессий этого имени нет значит берется это все не из БД сессий, либо Джумла это быстренько все уничтожает из БД, что не успеваю отследить.
    Мне кажется, что даже если (не знаю, как) принудительно задать имя и ID сессии при методе JFactory::getSession(), все равно ничего не выйдет в моем случае, раз ищет сессии не в БД, а на сервере. (хотя может чего не так понял).
    На крайняк, можно принудительно вытаскивать сессию из БД (это сто процентов работает правильно, уже пробовал), но это опять не пишется с политикой безопасности.
    Мне очень понравилась идея с index2.php, но пока даже и не знаю как вообще правильно организовывать подобные решения.
    Рою инет.
     
    Последнее редактирование: 18.06.2009
  12. Offline

    uborshik Недавно здесь

    Регистрация:
    15.06.2009
    Сообщения:
    7
    Симпатии:
    0
    Пол:
    Мужской
    Ну, в общем, не стал исправлять предыдущий пост, чтобы понятно было о чем речь.
    Короче все работает.
    Надо было в 'default.php' изображение выводить так:
    Код (PHP):
    1. <?php
    2.  $sn=session_name();
    3.  $cid=session_id();
    4. ?>
    5. <img src="capcha.php?sn=<?=$sn; ?>&cid=<?=$cid; ?>" />


    В ' captcha.php ' добавить
    Код (PHP):
    1. ...
    2.         @$cid = $_GET['cid'];
    3.         session_id($cid);
    4.         $s = &JFactory::getSession();
    5. ...

    А код инициализации сессионной переменной поставил в index.php Джумлы.
    Код (PHP):
    1. $rands = rand(1,9).rand(1,9).rand(1,9);
    2. $gSess = &JFactory::getSession();
    3. $gSess->set('numers',$rands);

    Наверное, конечно, нужно где-то в другом месте инициализировать. Я было в самом компоненте это делать начал, но "капча" не подхватывала его.
    Конечно, не супер решение, но это уже лучше чем мое самое первое (в топе не описывал), когда из БД брал сессию вручную.
    Буду рыть дальше на предмет index2.php.
    Либо пытаться это решение встроить в Joomla по человечески.
     
    Последнее редактирование: 18.06.2009
  13. Offline

    uborshik Недавно здесь

    Регистрация:
    15.06.2009
    Сообщения:
    7
    Симпатии:
    0
    Пол:
    Мужской
    Да, чтоб поставить точку, код инициализации переменной сессии мало установить просто, абы где, в index.php. Это я прописывал после этих строк:
    index.php
    Код (PHP):
    1. require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' );
    2. require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' );
    3.  
    4. $rands = rand(1,9).rand(1,9).rand(1,9);
    5. $gSess = &JFactory::getSession();
    6. $gSess->set('numers',$rands);


    Ниже, после $mainframe =& JFactory::getApplication('site'), моя "каптча" -- уже не схватывла нужную переменную. (выше, даже не пробовал).
     
    Последнее редактирование: 18.06.2009
  14. progmist
    Offline

    progmist Недавно здесь

    Регистрация:
    18.05.2009
    Сообщения:
    155
    Симпатии:
    10
    Пол:
    Мужской
    Итого:

    для создания работоспособной каптчи с использованием сессий на джумле 1.5 используем:

    кусок файла темплейта:
    ....
    Код (PHP):
    1. <?
    2. $sess = JFactory::getSession();
    3. ?>
    4. <img src="<? echo JURI::base()."/";?>index2.php?option=com_contact&task=getcaptcha&<?echo $sess->getName(); ?>=<? echo $sess->getId()?>" />

    ...


    в контролере компонента (в данном случае com_contact) добавляем функцию
    ...
    Код (PHP):
    1. function getcaptcha() {
    2. include('captcha/kcaptcha.php');
    3.  
    4. $captcha = new KCAPTCHA();
    5.  
    6. $sess = JFactory::getSession();
    7.  
    8. if($_REQUEST[$sess->getName()]){
    9. $sess->set('captcha_keystring', $captcha->getKeyString());
    10. }
    11.  
    12. exit;
    13. }

    ...


    и при сабмите формы получаем:
    ...
    Код (PHP):
    1. function submit()
    2. {
    3. global $mainframe;
    4. // Test captcha
    5. $captcha = JRequest::getVar('captcha');
    6. $sess = JFactory::getSession();
    7. $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.


    в принципе ни чего сложного при работе с механизмом сессий джумлы.
     
  15. Offline

    mletov Недавно здесь

    Регистрация:
    14.02.2009
    Сообщения:
    12
    Симпатии:
    0
    Пол:
    Мужской
    Есть вопрос:
    Хочу добавить к каптче кнопку "обновить изображение" на случай, если оно будет трудно различимо. Делаю это через ajax по нажатию кнопки.
    Проблема в том чтобы ajax вернул новый пароль и перезаписал значение в джумловской сессии. Но если поставить
    $gSess = JFactory::getSession();
    $gSess->set('captcha_keystring',base64_encode($captcha_k));
    перед выводом, то вернет пустое значение, а если после, то не перезапишется сессия. вот не знаю как быть.
    Спасибо за ответы.

    PS Понимаю, что передавать капчу через GET (пусть и в base64) не слишком безопасно, потом сделаю шифрование по ключу. Сейчас проблема не в этом.

    Код (html):
    1. <script language="javascript" type="text/javascript">
    2. ....
    3. //По клику отправляю ajax-запрос к файлу new_pass.php, и передаю его возврат в капчу
    4.                            $('#btnReloadCapcha').click(function(){
    5.                                       var url_capcha = "/components/com_adsmanager/capcha/index.php";
    6.                                       var url_new_pass = "/components/com_adsmanager/capcha/new_pass.php";
    7.                                     //  alert(url_new_pass);
    8.                                       $.post(url_new_pass,
    9.                                                         {capcha_field:$('#capcha_field').get(0).value},
    10.                                                         function(data)
    11.                                                                 {
    12.                                                                 alert(data);
    13.                                                                 url_capcha +="?<?php echo session_name()?>=<?php echo session_id()?>&cptch="+data;
    14.                                                                 document.getElementById('imgCpch').src = url_capcha;
    15.                                                                 },
    16.                                                                 'text');
    17.                             });
    18.                            
    19.                         });
    20. ....
    21. </script>


    new_pass.php
    Код (PHP):
    1. require_once("../../../libraries/loader.php");
    2. require_once("../../../libraries/joomla/factory.php");
    3. $captcha_k = generate_password(5);
    4. session_start();
    5. $gSess = JFactory::getSession();
    6. $gSess->set('captcha_keystring',base64_encode($captcha_k));
    7. echo base64_encode($captcha_k);
     
    Последнее редактирование: 15.12.2009
  16. sectus
    Offline

    sectus специалист

    Регистрация:
    19.04.2006
    Сообщения:
    1 210
    Симпатии:
    46
    Пол:
    Мужской
    Если каптча генерирует случайное изображение каждый раз, то можно просто обновлять картинку через JS, добавляя к ссылке случайное число(чтобы не выдавалось кэшированное изображение).
     
  17. Offline

    mletov Недавно здесь

    Регистрация:
    14.02.2009
    Сообщения:
    12
    Симпатии:
    0
    Пол:
    Мужской
    Проблема как раз не с генерацией нового изображения через js, а сохранения нового значения в джумловскую сессию.
    Сейчас прикручиваю капчу к компоненту adsmanager. Пытался сделать по аналогии с решением, предложенным progmist - не вышло,т.к. не удалось одновременно обратиться к сессии и к сгенерированному капчей значению. Не очень понял, что является контроллером для adsmanager, в который надо вставлять function getcaptcha(). В итоге стал генерить отдельно код капчи,писать его в джумловскую сессию, и передавать его в зашифрованном виде в изображение через GET.
     
    Последнее редактирование: 15.12.2009
  18. Offline

    grinat Недавно здесь

    Регистрация:
    12.02.2010
    Сообщения:
    1
    Симпатии:
    0
    Пол:
    Мужской
    Всё бы ничего, да вот только с генерацией изображения проблема. Оно генерируется, но браузеры отказываются отображать, мотивируя это тем что оно неверное. В чём может проблема?
     

Поделиться этой страницей

Загрузка...