Просмотр полной версии : получение в темплейт переменных из extension
можно ли, и если можно то как, получить в шаблон необходимые мне данные из моего расширения???
речь идет не о возвращаемом результате (хотя интересует и возможность получения масива данных в шаблон чтоб потом из шаблона управлять выводом этих данных), а о получении какой-то переменной, например я хочу чтоб в бредкрамб попадало не название страницы, а название логической единицы выводимой на данной странице
так как страница выводит динамический контент, то к примеру в магазине это может быть наименование товара и я хочу выдать это наименование в своем расширении в переменную, а в шаблоне отловить ее и вставить в бредкрамб
dmartynenko
04.01.2010, 17:05
Поищите tt_news + breadcrumb
Задача регулярно обсуждается и в гугле можно найти ее решение.
Например: http://www.typo3-jack.net/typo3-project-tt-news-lists-netfielders-de/13757-typo3-ttnews-add-title-breadcrumb-trail.html
Для вашего экстеншена делается по аналогии.
спасибо за ссылку, я прочитал топик - действительно полезный, но из него не понятно как именно находясь в шаблоне воспользоваться переменной из расширения.
к примеру есть расширение Test
в нем объявлены атрибуты title и mode
как находясь в шаблоне получить в
temp.mainTemplate.subparts.CONTENT_TITLE = TEXT
temp.mainTemplate.subparts.CONTENT_TITLE.value = ????title????
либо проверить
[?????????mode=5?????]
temp.mainTemplate.subparts.CONTENT_CONTENT < tx_test_pi1
[end]
dmartynenko
04.01.2010, 19:47
Я не знаю что вы имеете в виду под атрибутами расширения. В TYPO3 таких терминов я не встречал. Уточните откуда вы ожидаете получить title (БД, GET/POST, FF, TypoScript) ?
В примере по ссылке (и аналогичных) три основных момента:
1. RECORDS - получение записей из БД.
2. source.data = GPvar:tx_ttnews|tt_news - из переменной GET берется параметр tx_ttnews[tt_news]=ID и используется для поиска по PK таблицы tt_news (т.е. возвращается одна запись с указаным в url ID)
3. conf.* - это описание того, что и как должно быть возвращено (выведено на страницу).
Все параметры подробно описаны в TSRef.
я имел ввиду файл-класс расширения и как любой класс - он имеет атрибуты и методы
я предполагаю что если и есть доступ к объекту расширения, то либо это какой то гетер, либо чтение public атрибутов
в моем случае я себе представляю такой механизм действий (не уверен что это возможно)
при генерации страницы, вызывается расширение находящееся на этой странице которое сохраняет в своих public атрибутах значения мне необходимые, потом я из TypoScript(из шаблона) обращаюсь к этому объекту и получаю его атрибуты
использую их в условии и подставляю в шаблон
в данный момент я как раз руководствуюсь этим справочником(TSRef), но к сожалению по моей проблеме ничего найти не смог
не исключаю что более продвинутыми людьми это решается другими методами
можно передать через GLOBALS['TSFE']->applicationData['tx_ext_key'] (я иногда и просто GLOBALS['tx_ext_key'] юзаю, хотя это не кошерно)
в шаблоне это будет TSFE:applicationData|tx_ext_key (но тут еще надо понимать область видимости - где можно использовать эти данные, я обычно пользуюсь этим внутри TS объекта, который генерируется из php кода плагина через tslib_cObj::cObjGetSingle)
можно через TS константы
прописать в ext_localconf.php:
t3lib_extMgm::addTypoScriptConstants('tx_ext_key_v ar1 = 123')
в шаблоне это будет {$tx_ext_key_var1}
но тут минус что тяжелый код не должен помещаться в ext_localconf.php т.к. он инклюдится при любом вызове, здесь лучше размещать только какие-то глобальные переменные конфигурации
dmartynenko
05.01.2010, 12:58
Непосредственно обращаться к методам и атрибутам класса из TS нельзя.
В общем случае шаблон обрабатывается до выполнения пользовательских PHP скриптов из расширений, поэтому applicationData установятся после парсинга шаблона и проверки TS условий.
Но есть еще в TS механизм userFunc - когда вызывается указанный метод вашего класса, ему передается часть TS кода шаблона, и он возвращает контент в TYPO3. Аналогичная возможность есть в TS-условиях.
ПС: хотя вам 3ton это и не нравится, но иногда быстрее помочь найти решения зная общую решаемую задачу, а не отдельный ее кусок, который TYPO3-способом может быть не решить.
ПС: хотя вам 3ton это и не нравится, но иногда быстрее помочь найти решения зная общую решаемую задачу, а не отдельный ее кусок, который TYPO3-способом может быть не решить.
проблема в том, что в зависимости от того какой будет режим использования моего расширения в разные моменты на одной и той же странице отдельная часть интерфейса, находящаяся в другой части страницы нежели мое расширение, должна быть отображена по разному
узнать режим работы расширения я смогу лишь в самом расширении обработав переменные из RealUrl из TS и из FF и только после этого я буду знать как отображать ту отдельно расположенную часть интерфейса
если есть возможность ее решить другими способами - буду рад выслушать их
dmartynenko
05.01.2010, 14:56
Было бы проще, что бы ваше расширение само показывало ту, вторую часть. Тогда вы в своем коде можете обрабатывать нужные вам условия.
Вы, например, можете в коде своего расширения создавать и выводить "результат" куска TS кода.
Так проще задействовать стандартные средства TYPO3 из вашего PHP кода (например, http://typo3.toaster-schwerin.de/typo3_dev/2007_08/msg00030.html)
Можно и в шаблоне условия прописывать. Каких-то особенных переменных из RealURL не существует - существуют переменные из GET, а RealURL лишь промежуточное звено, о котором ни TS ни ваш PHP код не знает. Если его отключить - сайт будет работать точно также, только URL будут выглядеть по другому.
Единственная проблема - сложность ваших условий. Пременные из GET/POST использовать просто:[globalVar = GP:print > 0]
А вот из TS и FF напрямую нельзя.
Кроме того, TS-условия создают дополнительные копии контента в кэше. Чем больше условий, тем больше (и медленней) будет кэш TYPO3.
в моем случае в зависимости от 2 параметра в URL 3 и 4 могут держать в себе разные переменные для этого расширения, что не позволит в тот момент знать что же я хочу проверить
а вот насчет вывода из своего расширения часть темплейта для другой области страницы - довольно интересно.
это может решить многие мои проблемы, не только текущую
можно об этом поподорбнее?
dmartynenko
05.01.2010, 15:14
Все довольно просто. В своем расширении создаете массив аналогичный TS коду. И потом передаете в cObjGetSingle().
$TS['conf'] = 'RECORDS';
$TS['conf.']['tables']='tt_content';
$TS['conf.']['source'] = '151,99,113,199,163,208';
$TS['conf.']['dontCheckPid'] = 1;
$TS['conf.']['conf.']['tt_content'] = 'TEXT';
$TS['conf.']['conf.']['tt_content.']['field'] = 'bodytext';
$content = $this->cObj->cObjGetSingle($TS['conf'],$TS['conf.']);
Есть функции cObjGetSingle() или cObjGet(), вторая более "продвинутый" вариант для сложных TS скриптов.
Примеры того, как это используется в более сложном варианте (с подстановкой TS констант) есть в:
http://typo3.org/extensions/repository/view/typoscript_code/current/
http://typo3.org/extensions/repository/view/smarty/current/
а можно совместить вывод результата в HTML и после него дать TypoScript ???
dmartynenko
05.01.2010, 15:41
Вопрос недопонял, в каком месте совместить, в первой или второй ваших частях?
Вызов cObjGetSingle() вернет вам HTML код, который вы должны еще вернуть TYPO3 из функции main(). Иначе он никуда не попадет.
Исключение - если ваш TS объект будет типа USER_INT/COA_INT. Тогда вам вернется "маркер" (такой специальынй HTML код), который вы должны будете вернуть TYPO3 из функции main(). А сам контент будет вызван и сформирован асинхронно, без кэширование (почитайте отличие в TSRef между USER и USER_INT).
судя по вашему посту, я могу делать все так же как и раньше в своем расширении, но перед return'om результата из main функции я могу добавить TypoScript код к результату который будет так же обработан, как если бы он был прописан в шаблоне
я прав?
если да, то интересует - в какой момент будет обработан возвращаемый скрипт, в момент когда я передаю результат выполнения расширения в subparts
temp.mainTemplate.subparts.CONTENT_BLOCK < plugin.tx_astro7experts_pi1
или по завершению обработки скрипта шаблона?
кстати возвращаемый из расширения TypoScript должен будет сделать следущее
temp.mainTemplate.subparts.MODE_BLOCK = TEXT
temp.mainTemplate.subparts.MODE_BLOCK.value = tra-la-la
Непосредственно обращаться к методам и атрибутам класса из TS нельзя.
к атрибутам можно
к атрибутам можно
а когда будет произведен доступ к атрибуту, до срабатывания расширения или после и если можно пример, буду очень признателен
Я не очень понимаю что вы имеете в виду под срабатыванием расширения. Пример я привел выше TSFE:applicationData|tx_ext_key - здесь доступ к атрибуту ->applicationData['tx_ext_key'] объекта TSFE.
Чтобы это работало проще всего ренедрить TS объект внутри самого плагина вручную вызывая cObjGetSingle()
вот пример
я вызываю свой плагин
temp.mainTemplate.subparts.CONTENT_BLOCK < plugin.tx_astro7experts_pi1
и мне надо чтоб после этого вызова в коде я мог получить значение переменной mode которая является атрибутом класса
class tx_astro7experts_pi1 extends tslib_pibase
и применить ее значение в сравнивании
[полученая переменная = 3]
выполнится то что мне нужно
[end]
как его можно реализовать?
вот пример
я вызываю свой плагин
temp.mainTemplate.subparts.CONTENT_BLOCK < plugin.tx_astro7experts_pi1
тут плагин не вызывается, тут вы просто копируете строку
после парсинга шаблона ветка temp.* удаляется и соответственно плагин оттуда не вызовется
и мне надо чтоб после этого вызова в коде я мог получить значение переменной mode которая является атрибутом класса
class tx_astro7experts_pi1 extends tslib_pibase
из TS можно получить доступ только к атрибутам глобальных объектов
и для пользовательских данных уже придумано место где их можно хранить и передавать (GLOBALS['TSFE']->applicationData)
к примеру я в своем расширении сделал так
$_GLOBALS['TSFE']->applicationData['tx_astro7experts_mode'] = 'sdfgsdf';
как мне в шаблоне получить это значение???
temp.mainTemplate.subparts.BREADCRUMB = TEXT
temp.mainTemplate.subparts.BREADCRUMB.value < TSFE:applicationData|tx_astro7experts_mode
так не получается
например так
temp.test = TEXT
temp.test.data = TSFE:applicationData|tx_astro7experts_mode
но чтобы это работало в основном шаблоне этот код должен идти после того места, где фактически вызовется ваш плагин
и не понятно почему у вас $_GLOBALS а не $GLOBALS
насколько помню в php нету $_GLOBALS
и не понятно почему у вас $_GLOBALS а не $GLOBALS
насколько помню в php нету $_GLOBALS
очепятка :)
например так
temp.test = TEXT
temp.test.data = TSFE:applicationData|tx_astro7experts_mode
но чтобы это работало в основном шаблоне этот код должен идти после того места, где фактически вызовется ваш плагин
вот этот пример помог!
теперь помогите как использовать это в условиях
[globalVar=TSFE:applicationData|tx_astro7experts_mo de=3]
temp.mainTemplate.subparts.BREADCRUMB = TEXT
temp.mainTemplate.subparts.BREADCRUMB.value = test
[end]
так не срабатывает
Можно использовать TS объект CASE и выводить через него.
Через условия я думаю работать не будет - все условия рассчитываются перед парсингом шаблона и соответственно до вызова плагина.
Можно использовать TS объект CASE и выводить через него.
а можно с этого момента поподробнее?
http://typo3.org/documentation/document-library/core-documentation/doc_core_tsref/4.3.0/view/1/7/#id2524306
Работает на vBulletin® версия 3.8.1. Copyright ©2000-2025, Jelsoft Enterprises Ltd. Перевод: zCarot