PDA

Просмотр полной версии : eID-scripts и сессии FE-пользователей


void
05.03.2008, 22:30
Недавно писал расширение с использованием eID scripts и теперь хочу поделиться некоторыми мыслями.

1. Кратко о том, что это такое и зачем оно нужно.
Часто не требуется грузить весь фронтенд TYPO3, а достаточно небольшой его части. Например, нужно показать картинку или вернуть ответ на ajax-запрос. В этом случаем можно прописать в файле ext_localconf.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/. (Кстати, рекомендую просмотреть его тем, кто желает таки узнать, как работает схема рендеринга фронтэнда (http://buzz.typo3.org/index.php?eID=tx_cms_showpic&file=uploads%2Fpics%2Ftinguely.jpg&width=500m&height=500&bodyTag=%3Cbody%20bgColor%3D%22%23ffffff%22%3E&wrap=%3Ca%20href%3D%22javascript%3Aclose%28%29%3B% 22%3E%20%7C%20%3C%2Fa%3E&md5=7b9ffe8ebe4755441bc95ce88b28f8c5)).
Сразу после совсем базовой инициализации и различных проверок, но до создания глобального объекта TSFE можно увидеть вот такой кусок кода:

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

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

<?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
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.

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/pipermail/typo3-dev/2007-June/023952.html

typo27
23.08.2008, 01:41
So, finally succeeded:


require_once(PATH_t3lib . "class.t3lib_stdgraphic.php");
require_once(PATH_tslib . "class.tslib_gifbuilder.php");
require_once(PATH_t3lib.'class.t3lib_tstemplate.ph p');
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
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.

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

dmartynenko
17.06.2011, 12:04
А этот экст у вас подключен через Ext Manager ?

PS: eID в 4.5 у нас работает также как и в предыдущих версиях.

Kevich
17.06.2011, 12:30
Подключен, я даже его использую в качестве плагина frontend. Разве что на кэширование грешил, но очитска всего кэша в админке не помогает.

dmartynenko
17.06.2011, 12:47
Попробуйте использовать такой код:

$GLOBALS['TYPO3_CONF_VARS']['FE']['eID_include']['test'] = ...

Скорее всего глобальная переменная $TYPO3_CONF_VARS в вашем скрипте не определена, и поэтому подключение не срабатывает.

Kevich
20.06.2011, 13:00
И так не помогло. Вложил в сообщение само расширение, которое делаю. Может так понятней будет что я делаю не так. Хотя действую строго по тому, что написано...

dmartynenko
20.06.2011, 13:15
А можете просто папку с расширением заархивировать? Не хочется "мусорить" в существующей TYPO3 установке.

Kevich
20.06.2011, 13:32
Заархивировал

dmartynenko
20.06.2011, 13:53
По коду - вроде все в порядке.
А как вы вызываете свою eID-функцию, в коде примера не нашел.

Kevich
20.06.2011, 14:04
По коду - вроде все в порядке.
А как вы вызываете свою eID-функцию, в коде примера не нашел.

Вызываю просто: http://www.somesite.com/?eID=test

http://www.somesite.com/index.php?eID=test тоже не проходит

dmartynenko
20.06.2011, 14:16
Второй вызов, с index.php, правильный.

Вот из index.php код вызова eID:
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;
}

Судя по нему ничего мешать не должно (кроме например фатальных PHP ошибок). Поставьте в него отладочный вызов/print_r().

Ивано++
06.04.2013, 16:07
Так понял что через eID нет возможности использовать класс tslib_pibase?:mad: