PDA

Просмотр полной версии : клонирование расширения на подстраницы


3ton
21.08.2012, 12:12
создал галерею

дерево галереи - обычные старницы сайта
элементы галереи - объекты моего расширения - вставляются как обычный контент на страницы в админке

элемент галереи содержит название, описание и фотки

для клонирования механизма использовал подключение расширения в корневой папке галереи через тупоскрипт (там же механизм отрабатывания листинг или сама галерея и превьюшки)

но вот возникла проблема
потому как использую кеширование страниц - галерея кеширует последнюю генерацию несмотря на то что урл меняется (в пределах одной страницы на которой и список и просмотр галереи, это необходимо мне для правильного построения breadcrumb и построения мень в несколько уровней с сохранением раскрытым текущего уровня которые генерятся через тупоскрипт)

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

использую typo3 4.6 и TV

в пределах старницы урл меняется по следующим правилам

если присутствует сегмент "gallery" - считается что мы отображаем не список галерей а просматриваем галерею

если присутствует сегмент "page" - отрабатываем пагинацию независимо от режима - список или просмотр

dmartynenko
21.08.2012, 19:10
URL вы как формируете?
Экстеншен у вас наверное свой и вставлен как USER?
Если код экстеншена на базе tslib_pibase, то может стоит $this->pi_USER_INT_obj = 1;?

3ton
21.08.2012, 22:44
URL формирую и отрабатываю вручную

расширение вставлено как


lib.ts_content = COA
plugin.tx_3tgallery_pi1.mode = LISTING
[globalString = GP:3t_gallery|gallery=/[0-9a-zA-Z_]/]
plugin.tx_3tgallery_pi1.mode = GALERY
[end]
lib.ts_content.10 = CONTENT
lib.ts_content.10 < plugin.tx_3tgallery_pi1



кстати может есть какой-то более корректный способ проверки наличия переменной gallery
потому как регулярка всетаки на мой взгляд тут лишняя, а другого рабочего варианта не обнаружил

на всякий случай - временно вышел из ситуации отработкой режима на стороне расширения в РНР
потому часть кода можно убрать




lib.ts_content = COA
lib.ts_content.10 = CONTENT
lib.ts_content.10 < plugin.tx_3tgallery_pi1

dmartynenko
22.08.2012, 12:23
Ну так как все таки формируете URL? Приведите код.
Просто если ваш плагин кэшируемый и вы формируете URL корректно через typolink, то к URL добавляется параметр cHash. Он позволяет кэшировать содержание страницы по URL, с учетом разных параметров.
Подробнее http://typo3.org/documentation/article/the-mysteries-of-chash-1
Кстати при использовании RealURL cHash в ссылке не виден, но он есть.

Если вы формируете URL как-то сами минуя typolink (то есть там нет cHash), то ваш плагин будет работать нормально только если будет не кэшируемым (USER_INT). Иначе механизм кэширования TYPO3 будет вам "мешать".

Что касается условия, такой вариант пробовали?
plugin.tx_3tgallery_pi1.mode = GALERY
# если 3t_gallery[gallery] не задан, то показываем список
[globalVar = GP:3t_gallery|gallery = ]
plugin.tx_3tgallery_pi1.mode = LISTING
[GLOBAL]

Посмотри TSRef, в TS нет закрывающего тэга [end], есть тэг перехода в область глобальной видимости [GLOBAL]

Еще дополню касательно условия в TS. Каждое TS условие создает в кэше страниц отдельную, так сказать, ветку кэша. Если сайт большой и страниц много, то кэш может сильно разрастаться. Поэтому я лично предпочитаю делать переключение режима плагина по условия вида "есть 3t_gallery[gallery]" в коде самого экста.

3ton
22.08.2012, 12:55
Ну так как все таки формируете URL? Приведите код.
Просто если ваш плагин кэшируемый и вы формируете URL корректно через typolink, то к URL добавляется параметр cHash. Он позволяет кэшировать содержание страницы по URL, с учетом разных параметров.
Подробнее http://typo3.org/documentation/article/the-mysteries-of-chash-1
Кстати при использовании RealURL cHash в ссылке не виден, но он есть.

Если вы формируете URL как-то сами минуя typolink (то есть там нет cHash), то ваш плагин будет работать нормально только если будет не кэшируемым (USER_INT). Иначе механизм кэширования TYPO3 будет вам "мешать".

спасибо, покурю доки в этом направлении
на данный момент линк формируется вручную так

$urlA = $this->pi_getPageLink($pageId).'\gallery\'.$gallery['alias'];

$urlP = $this->pi_getPageLink($pageId).'\page\'.$page;



Что касается условия, такой вариант пробовали?
plugin.tx_3tgallery_pi1.mode = GALERY
# если 3t_gallery[gallery] не задан, то показываем список
[globalVar = GP:3t_gallery|gallery = ]
plugin.tx_3tgallery_pi1.mode = LISTING
[GLOBAL]

не пробовал, спасибо за совет(ценно для саморазвития) но пока решил оставить рутинг режима на РНР


Посмотри TSRef, в TS нет закрывающего тэга [end], есть тэг перехода в область глобальной видимости [GLOBAL]

информацию брал из доков typo3
Doc Core TS (http://typo3.org/documentation/document-library/core-documentation/doc_core_ts/4.6.0/view/1/2/)
So in this example the line “[GLOBAL]” is a condition (built-in, always returns true) and the line “[ condition 1 ][ condition 2]” is a condition. If “[ condition 1 ][ condition 2]” is true then the TypoScript in the middle would be parsed until [GLOBAL] (or [END]) resets the conditions and parses the TypoScript for any case again.


Еще дополню касательно условия в TS. Каждое TS условие создает в кэше страниц отдельную, так сказать, ветку кэша. Если сайт большой и страниц много, то кэш может сильно разрастаться. Поэтому я лично предпочитаю делать переключение режима плагина по условия вида "есть 3t_gallery[gallery]" в коде самого экста.
так и сделал пока

dmartynenko
22.08.2012, 13:05
Ссылки вам нужно формировать так:


$urlA = $this->pi_getPageLink($pageId, '', array($this->prefixId => array('gallery' => $gallery_id)));
$urlP = $this->pi_getPageLink($pageId, '', array($this->prefixId => array('page' => $page_id)))

Тут предполагается что $this->prefixId у вас задан как 3t_gallery. Хотя обычно, после кикстартера и по хорошему тону TYPO3, он вида tx_3tgallery_pi1.

Ну а что-бы такие URL стали "красивыми", то нужен конфиг для RealURL. Хотя полагаю у вас он уже есть, ведь вы как-то получаете из красивого URL обратно 3t_gallery[gallery].

3ton
22.08.2012, 13:18
Ссылки вам нужно формировать так:


$urlA = $this->pi_getPageLink($pageId, '', array($this->prefixId => array('gallery' => $gallery_id)));
$urlP = $this->pi_getPageLink($pageId, '', array($this->prefixId => array('page' => $page_id)))

спасибо, попробую... это решит проблемы с кешированием содержимого эксетншена подключенного через тупоскрипт???


Тут предполагается что $this->prefixId у вас задан как 3t_gallery. Хотя обычно, после кикстартера и по хорошему тону TYPO3, он вида tx_3tgallery_pi1.

Ну а что-бы такие URL стали "красивыми", то нужен конфиг для RealURL. Хотя полагаю у вас он уже есть, ведь вы как-то получаете из красивого URL обратно 3t_gallery[gallery].
они описаны, но только в разделе postVarSets


'postVarSets' => array(
'_DEFAULT' => array(
'page' => array(
array(
'GETvar' => 'page'
)
),
'gallery' => array(
array(
'GETvar' => '3t_gallery[gallery]'
)
),
)
),

dmartynenko
22.08.2012, 13:38
Решит, только если у вас в эксте прописано $this->pi_USER_INT_obj = 0. Я вас спрашивал что у вас с этим параметром, вы не ответили.

Что касается page, то в предложеном мной варианте нужно в конфиге RealURL сделать так:

'page' => array(
array(
'GETvar' => '3t_gallery[page]'
)
),

Если не хотите для RealURL менять, то тогда ссылку сделайте так

$urlP = $this->pi_getPageLink($pageId, '', array('page' => $page_id));


Короче одно другому должно соответствовать.

3ton
22.08.2012, 14:21
Решит, только если у вас в эксте прописано $this->pi_USER_INT_obj = 0. Я вас спрашивал что у вас с этим параметром, вы не ответили.

а где его глянуть??? :)
это имеется ввиду???
t3lib_extMgm::addPItoST43($_EXTKEY, 'pi1/class.tx_3tgallery_pi1.php', '_pi1', 'list_type', 0);



Что касается page, то в предложеном мной варианте нужно в конфиге RealURL сделать так:

'page' => array(
array(
'GETvar' => '3t_gallery[page]'
)
),

Если не хотите для RealURL менять, то тогда ссылку сделайте так

$urlP = $this->pi_getPageLink($pageId, '', array('page' => $page_id));


Короче одно другому должно соответствовать.
скорее второй вариант использую, так как страница должна быть доступна для/из любого расширения

dmartynenko
22.08.2012, 14:30
а где его глянуть??? :)
это имеется ввиду???


В PHP коде вашего экста, в основном классе плагина, в функции main()
В том же коде у у вас $this->pi_getPageLink, "$this" на это намекает :)


скорее второй вариант использую, так как страница должна быть доступна для/из любого расширения


Ну как сказать. Чаще наоборот пагинация не должна влиять на другие плагины. Например у вас есть основной список "новостей" и в правой колонке какие-то "топ 10" по популярности. Если вы перейдете в основном списке на 2-ю, то "топ 10" обычно не должен стать "топ с 10 по 20".

3ton
22.08.2012, 15:13
Ну как сказать. Чаще наоборот пагинация не должна влиять на другие плагины. Например у вас есть основной список "новостей" и в правой колонке какие-то "топ 10" по популярности. Если вы перейдете в основном списке на 2-ю, то "топ 10" обычно не должен стать "топ с 10 по 20".

я исхожу из другой ситуации

мне необходимо сделать такую переменной доступно на любой страница сайта в нескольких расширениях

либо я описываю для каждой страницы ее синтаксис (а их около 5 сотен)
либо я добавляю ее в том виде как использую сейчас и пользуюсь на здоровье
а наличие(отображение) пагинации у меня определяется в PHP/template
поэтому в обычном листинге оно будет, а в топе - не будет

3ton
22.08.2012, 15:19
Решит, только если у вас в эксте прописано $this->pi_USER_INT_obj = 0. Я вас спрашивал что у вас с этим параметром, вы не ответили.


спасибо, помогло!
то что доктор прописал...

куда пиво высылать? ;)

dmartynenko
22.08.2012, 16:02
Спасибо, уже не пью ;)

Для лучшего понимания для чего нужен $this->pi_USER_INT_obj посмотрите код pi_getPageLink() и тех функций что она вызывает (в конечном итоге всегда используется typolink).

У вас кстати изначально плагин был создан как USER_INT. На это указывает ... 'list_type', 0); и $this->pi_USER_INT_obj = 1.
Первое приведет к тому, что контент вашего плагина кэшироваться не будет.

Если вам нужен кэшируемый плагин, то поменяйте в ext_localconf.php 0 на 1 (то есть будет ...'list_type', 1); ).
Либо в TS шаблоне явно укажите, что
plugin.tx_3tgallery_pi1 = USER

3ton
22.08.2012, 16:36
Спасибо, уже не пью ;)

Для лучшего понимания для чего нужен $this->pi_USER_INT_obj посмотрите код pi_getPageLink() и тех функций что она вызывает (в конечном итоге всегда используется typolink).

У вас кстати изначально плагин был создан как USER_INT. На это указывает ... 'list_type', 0); и $this->pi_USER_INT_obj = 1.
Первое приведет к тому, что контент вашего плагина кэшироваться не будет.

Если вам нужен кэшируемый плагин, то поменяйте в ext_localconf.php 0 на 1 (то есть будет ...'list_type', 1); ).
Либо в TS шаблоне явно укажите, что
plugin.tx_3tgallery_pi1 = USER

про 'list_type', 0); я был в курсе и удивился когда в тупоскрипте это не сработало, а вот про $this->pi_USER_INT_obj = 1 не слышал

кстати последний вариант с
plugin.tx_3tgallery_pi1 = USER
думаю все же правильнее, потому как бывает что расширение должно возвращать и статичный контент, в таком случае лучше это управлять при выводе в TS, а не настраивать расширение на обязаловку