Просмотр полной версии : клонирование расширения на подстраницы
создал галерею
дерево галереи - обычные старницы сайта
элементы галереи - объекты моего расширения - вставляются как обычный контент на страницы в админке
элемент галереи содержит название, описание и фотки
для клонирования механизма использовал подключение расширения в корневой папке галереи через тупоскрипт (там же механизм отрабатывания листинг или сама галерея и превьюшки)
но вот возникла проблема
потому как использую кеширование страниц - галерея кеширует последнюю генерацию несмотря на то что урл меняется (в пределах одной страницы на которой и список и просмотр галереи, это необходимо мне для правильного построения breadcrumb и построения мень в несколько уровней с сохранением раскрытым текущего уровня которые генерятся через тупоскрипт)
если вставлять расширение на страницу как объект в контентную область - все отрабатывается как нужно даже в режиме кеширования страницы, но это неудоство - страниц может быть более сотни и на все вставлять расширение - глупо, думается тут должен быт ьдругой механизм
использую typo3 4.6 и TV
в пределах старницы урл меняется по следующим правилам
если присутствует сегмент "gallery" - считается что мы отображаем не список галерей а просматриваем галерею
если присутствует сегмент "page" - отрабатываем пагинацию независимо от режима - список или просмотр
dmartynenko
21.08.2012, 19:10
URL вы как формируете?
Экстеншен у вас наверное свой и вставлен как USER?
Если код экстеншена на базе tslib_pibase, то может стоит $this->pi_USER_INT_obj = 1;?
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]" в коде самого экста.
Ну так как все таки формируете 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].
Ссылки вам нужно формировать так:
$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));
Короче одно другому должно соответствовать.
Решит, только если у вас в эксте прописано $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".
Ну как сказать. Чаще наоборот пагинация не должна влиять на другие плагины. Например у вас есть основной список "новостей" и в правой колонке какие-то "топ 10" по популярности. Если вы перейдете в основном списке на 2-ю, то "топ 10" обычно не должен стать "топ с 10 по 20".
я исхожу из другой ситуации
мне необходимо сделать такую переменной доступно на любой страница сайта в нескольких расширениях
либо я описываю для каждой страницы ее синтаксис (а их около 5 сотен)
либо я добавляю ее в том виде как использую сейчас и пользуюсь на здоровье
а наличие(отображение) пагинации у меня определяется в PHP/template
поэтому в обычном листинге оно будет, а в топе - не будет
Решит, только если у вас в эксте прописано $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
Спасибо, уже не пью ;)
Для лучшего понимания для чего нужен $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, а не настраивать расширение на обязаловку
Работает на vBulletin® версия 3.8.1. Copyright ©2000-2025, Jelsoft Enterprises Ltd. Перевод: zCarot