Russian TYPO3 community Форум больше не используется. Присоединяйтесь к каналу #community-ru в Slack for TYPO3 community  

Вернуться   Russian TYPO3 community > Обсуждение общих технических вопросов > Мастер-класс

Ответ
 
Опции темы Опции просмотра
Старый 05.03.2008, 22:30   #1
void
Senior Member
 
Аватар для void
 
Регистрация: 14.03.2006
Адрес: Russia, Penza
Сообщений: 1,504
Отправить сообщение для void с помощью ICQ
По умолчанию 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. Стоит ли писать иногда такие вот посты о хитростях программирования расширений? Я бы попросил всех, кому такие вещи интересны, написать об этом в комментариях =)
__________________
TYPO3 FAQ

Последний раз редактировалось void; 05.03.2008 в 22:48
void вне форума   Ответить с цитированием
Старый 06.03.2008, 01:54   #2
demav
Senior Member
 
Аватар для demav
 
Регистрация: 21.04.2006
Сообщений: 245
По умолчанию

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

У меня с помощью eID получилось сделать отображение имени пользователя на всех страницах сайта и при этом все объекты страницы кешируемые, что дает значительный прирост производительности.
demav вне форума   Ответить с цитированием
Старый 06.03.2008, 12:33   #3
marco
Senior Member
 
Регистрация: 04.02.2005
Адрес: Львів
Сообщений: 126
Отправить сообщение для marco с помощью ICQ Отправить сообщение для marco с помощью Yahoo
По умолчанию

1++! (Согласен с demav: Однозначно стоит писать!)
marco вне форума   Ответить с цитированием
Старый 19.03.2008, 19:55   #4
z0r1k
Продвинутый
 
Аватар для z0r1k
 
Регистрация: 27.03.2006
Адрес: Ukraine, Crimea, Simferopol
Сообщений: 79
Отправить сообщение для z0r1k с помощью ICQ Отправить сообщение для z0r1k с помощью Skype™
По умолчанию

Да, полностью согласен с marco и demav-ом!
__________________
http://michaelleibenson.org.ua
z0r1k вне форума   Ответить с цитированием
Старый 22.08.2008, 01:36   #5
typo27
Новенький
 
Регистрация: 30.01.2008
Сообщений: 27
По умолчанию

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.
typo27 вне форума   Ответить с цитированием
Старый 22.08.2008, 15:13   #6
dmartynenko
Senior Member
 
Аватар для dmartynenko
 
Регистрация: 20.07.2007
Адрес: Беларусь, Минск
Сообщений: 957
Отправить сообщение для dmartynenko с помощью ICQ
По умолчанию

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.
dmartynenko вне форума   Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB code is Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Синхронизация пользователей typo3 с Аctiv Directory margol Общие вопросы 0 09.01.2008 16:01
Сессии в Typo3 Semyon Общие вопросы 4 22.12.2005 01:18


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


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

Хостинг и техническая поддержка: TYPO3 Лаборатория