Russian TYPO3 community

Russian TYPO3 community (http://forum.typo3.ru/index.php)
-   Мастер-класс (http://forum.typo3.ru/forumdisplay.php?f=41)
-   -   eID-scripts и сессии FE-пользователей (http://forum.typo3.ru/showthread.php?t=5958)

void 05.03.2008 22:30

eID-scripts и сессии FE-пользователей
 
Недавно писал расширение с использованием eID scripts и теперь хочу поделиться некоторыми мыслями.

1. Кратко о том, что это такое и зачем оно нужно.
Часто не требуется грузить весь фронтенд TYPO3, а достаточно небольшой его части. Например, нужно показать картинку или вернуть ответ на ajax-запрос. В этом случаем можно прописать в файле ext_localconf.php своего расширения нечто такое:
PHP код:

if(TYPO3_MODE == 'FE'){
    
$TYPO3_CONF_VARS['FE']['eID_include']['something_cool'] = 'EXT:mycoolext/ajax.php';


(Разумеется, стоит создать в нашем расширении этот самый ajax.php)
Мы только что определили eID скрипт с ключевым словом 'something_cool'. Это ключевое слово должно быть уникальным в пределах инсталляции, поэтому лучше использовать название своего расширения (возможно с префиксами или постфиксами).

2. Как это работает

Вся инициализация TYPO3 начинается с выполнения файла index_ts.php, который лежит в typo3/sysext/cms/tslib/. (Кстати, рекомендую просмотреть его тем, кто желает таки узнать, как работает схема рендеринга фронтэнда).
Сразу после совсем базовой инициализации и различных проверок, но до создания глобального объекта TSFE можно увидеть вот такой кусок кода:
PHP код:

// *********************
// Look for extension ID which will launch alternative output engine
// *********************
if ($temp_extId t3lib_div::_GP('eID'))    {
    if (
$classPath t3lib_div::getFileAbsFileName($TYPO3_CONF_VARS['FE']['eID_include'][$temp_extId]))    {
        require_once(
PATH_tslib.'class.tslib_eidtools.php');
        require(
$classPath);
    }
    exit;


Как видим, если через GET или POST передано значение eID, то TYPO3 выдаёт нам в руки класс tslib_eidtools (из файла class.tslib_eidtools.php), говорит "а контент будете генерировать сами" и делает exit;
Для проверки напишем в нашем ajax.php что-то вроде
PHP код:

<?php
 
echo 'eID output';
?>

Теперь при обращении http://oursite.ru/index.php?eID=something_cool мы должны увидеть надпись 'eID output'. Разберемся с классом tslib_eidtools. У него есть всего два простых метода класса: connectDB() и initFeUser(). Первый, соответственно, соединяется с базой данных, а второй инициализирует fe-пользователя. Иногда в различных ajax-ответах нужно достать данные из сессии пользователя (кстати, нужно помнить о том, что fe user тут может быть и анонимным - сессия у него есть всё равно).

3. Про сессии

Итак, получить данные из сессии анонимного пользователя можно примерно так:
PHP код:

<?php
if (!defined ('PATH_typo3conf'))     die ('Could not access this script directly!');
class 
ajax{
    public 
$fe_user;
    
    public function 
__construct(){
        
$this->fe_user tslib_eidtools::initFeUser();
        }
    
        public function 
process(){
        
$data $this->fe_user->getKey('ses','ourdata');
        }
}

$ajax = new ajax();
echo 
$ajax->process();
?>

Здесь всё будет хорошо работать. Правда, иногда из сессии нужно не только читать данные, но и писать их в неё. И вот в этом случае обычный $this->fe_user->setKey() работать не будет.
После получаса бегания по исходникам тайпы, я нашел решение. Примерно вот такое:
PHP код:

<?php
if (!defined ('PATH_typo3conf'))     die ('Could not access this script directly!');
class 
ajax{
    public 
$fe_user;
    
    public function 
__construct(){
        
$this->fe_user tslib_eidtools::initFeUser();
        }
    
        public function 
process(){
        
$data $this->fe_user->getKey('ses','ourdata');
                
$data++;
                
$this->fe_user->setKey('ses','ourdata',$data);
    }
    public function 
__destruct(){
        
$this->fe_user->storeSessionData();    
    }
}

$ajax = new ajax();
echo 
$ajax->process();
?>

Важно не забыть вызвать fe_user->storeSessionData(), иначе сессия не будет записана в БД.

P.S. Стоит ли писать иногда такие вот посты о хитростях программирования расширений? Я бы попросил всех, кому такие вещи интересны, написать об этом в комментариях =)

demav 06.03.2008 01:54

Однозначно стоит писать! Тема про eID очень нужна.
Я бы только добавил еще где можно найти доп информацию в оригинале (то, что вы уже писали отвечая на мои вопросы).

У меня с помощью eID получилось сделать отображение имени пользователя на всех страницах сайта и при этом все объекты страницы кешируемые, что дает значительный прирост производительности.

marco 06.03.2008 12:33

1++! (Согласен с demav: Однозначно стоит писать!)

z0r1k 19.03.2008 19:55

Да, полностью согласен с marco и demav-ом!

typo27 22.08.2008 01:36

Hello,
I am trying to output simple picture in eID.

PHP код:

   require_once(PATH_tslib "class.tslib_content.php");
    require_once(
PATH_t3lib "class.t3lib_stdgraphic.php");
    require_once(
PATH_tslib "class.tslib_gifbuilder.php");


     
$imsTS=array();
     
$imsTS['file']="fileadmin/myimage.jpg";

    
$myCObj = new tslib_cObj();
    echo 
$myCObj->IMAGE($imsTS); 

But I am getting error:
Fatal error: Call to a member function getFileName() on a non-object in /home/webadmin/typo3_src-4.1.6/typo3/sysext/cms/tslib/class.tslib_content.php on line 4701

Has anybody succeed in outputing an image $myCObj->IMAGE i eID?

By the way, in the plugin pi1 php
$GLOBALS['TSFE']->cObj->IMAGE($imsTS);
works well.

dmartynenko 22.08.2008 15:13

eID mode does not have any FE classes. Thus using of such functions not possible.

What Dmitry Dulepov write day ago in mail list:

Цитата:

"eID should not extend tslib_pibase. tslib_pibase requires full TYPO3 Frontend. With eID you are on your own: you can have database connection and some constants (like PATH_site). The rest is only yours. TYPO3 is not really there."
One solution is to create page with you plugin which will be output IMAGE content by given parameter and page type=XXX. Then you can get it from eID script.

typo27 22.08.2008 20:16

Thanks,
just it seems some guy has succeeded to generate TS image in eID:
http://lists.netfielders.de/pipermai...ne/023952.html

typo27 23.08.2008 01:41

So, finally succeeded:

PHP код:

    require_once(PATH_t3lib "class.t3lib_stdgraphic.php");
  require_once(
PATH_tslib "class.tslib_gifbuilder.php");
    require_once(
PATH_t3lib.'class.t3lib_tstemplate.php');
    require_once(
PATH_t3lib.'class.t3lib_page.php');
    require_once(
PATH_tslib.'class.tslib_content.php');
    

    
$TSFEclassName t3lib_div::makeInstanceClassName('tslib_fe');
    
$id = isset($HTTP_GET_VARS['id'])?$HTTP_GET_VARS['id']:0;
    
$GLOBALS['TSFE'] = new $TSFEclassName($TYPO3_CONF_VARS$id'0'1'''','','');
    
$GLOBALS['TSFE']->initFEuser();
    
$GLOBALS['TSFE']->fetch_the_id();
    
$GLOBALS['TSFE']->initTemplate();
    
$GLOBALS['TSFE']->getConfigArray();
 
  
$myCobj t3lib_div::makeInstance('tslib_cObj');

  echo 
$myCobj->IMAGE($imgTS); 

Have no idea how it will be faster than regular plugin in normal page.

Pavel Antonov 23.08.2008 20:01

Цитата:

Сообщение от typo27 (Сообщение 21138)
Have no idea how it will be faster than regular plugin in normal page.

I think that you do exectly the same that common index_ts.php do. So all speed advantage of eID-scripts is gone (coz you create TSFE with all required objects) and it was much simple just to create page with plugin, then do it like this...

Kevich 17.06.2011 08:30

не знаю насколько старую тему поднимаю. Но сейчас использую typo3 4.5 и пытаюсь написать eID функцию. Однако столкнулся с проблемой, что при внесении переменной $TYPO3_CONF_VARS['FE']['eID_include']['test'] в файл ext_localconf.php он не видит этой переменной. Нашел лишь корявое внесение этой переменной в глобальный файл localconf.php.

Кто нибудь сталкивался с такой проблемой?


Часовой пояс GMT +4, время: 02:36.

Работает на vBulletin® версия 3.8.1.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot