PDA

Просмотр полной версии : Использование typoLink в собственном скрипте


turim
03.03.2011, 15:27
Здравствуйте.
Имеется один сайт на typo3. В нем используется флешевая галерея для которой пришлось писать админку на php. Админка - набор отдельных php файлов, в которых производится чтение дерева тайпо и последующая геннерация xml для флеш. Возникла надобность во флеш вставлять real_url используемых страниц и тут появилась сама проблема. Долго блуждал по просторам google но так и не смог найти как получить доступ к чему-то типа typoLink вне движка тайпо.
Может кто подсказать какие файлы тайпо нужно заинкладить в кастомный пхп чтобы заставить работать эту функциональность?

Зарание спасибо за ответы.

-=UncleByte=-
03.03.2011, 19:35
http://codeline.richmd.ru/2008/05/%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%B5%D0%BC-xml-%D0%B4%D0%B5%D1%80%D0%B5%D0%B2%D0%B0-%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86-typo3-%D0%B4%D0%BB%D1%8F-flash-%D0%BC%D0%B5%D0%BD%D1%8E/

turim
03.03.2011, 20:17
Ссылка конечно интерестная, но не к месту.
Мне не нужно собирать xml в TS. Задача - кастомная админка для управления гелереей. Сама задача в целом решена. Вопрос только в том, как имея uid страницы в моем кое получить ссылку на эту страницу в правильном виде, а не index.php?id=1 и т.д.

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

-=UncleByte=-
04.03.2011, 01:27
Если используемая галерея встраивается в typo3 сайт, почему нельзя использовать возможности классов typo3?

ParserYa
04.03.2011, 10:31
-=UncleByte=-, он и спрашивает какой стандартный класс использовать для реализации TypoLink

turim, вот это инклудьте typo3/sysext/cms/tslib/class.tslib_content.php

dmartynenko
04.03.2011, 11:58
Если ваш PHP код по отношению к TYPO3 совсем уж "внешний" - то есть использовать TYPO3-классы не получается, то поставьте экстеншн pagepath (http://typo3.org/extensions/repository/view/pagepath/current/).

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


require_once(t3lib_extMgm::extPath('pagepath', 'class.tx_pagepath_api.php'));

$parameters = '&tx_ttnews[tt_news]=123';
$parameters = array('tx_ttnews[tt_news]' => 123);
$parameters = array('tx_ttnews' => array('tt_news' => 123));

$pagepath = tx_pagepath_api::getPagePath($pageId, $parameters);


Но на самом деле вся суть сводиться к формирование HTTP запроса (к eID скрипту) с передачей Id страницы и других возможных параметров. Как сформировать такой же запрос в вашем коде и как получить готовый URL из ответа, вы можете посмотреть в коде pagepath.

Конечно генерить URL таким способом медленнее, чем через прямое обращение к функциям класса tslib_content, но иногда другого выхода нет - например в BackEnd-е.

dmartynenko
04.03.2011, 12:18
Если ли бы вы делали ваш код, как типичный плагин наследуемый от класса tslib_pibase, то в нем есть ряд функций для генерации ссылок:

function pi_getPageLink($id,$target='',$urlParameters=array ())
function pi_linkToPage($str,$id,$target='',$urlParameters=a rray())
function pi_linkTP($str,$urlParameters=array(),$cache=0,$al tPageId=0)

Они в свою очередь являются обертками для функции класса tslib_cObj - getTypoLink_URL() и getTypoLink().


function pi_getPageLink($id,$target='',$urlParameters=array ()) {
return $this->cObj->getTypoLink_URL($id,$urlParameters,$target);
}

Есть способ формировать ссылки еще более "ядреным" методом:

$link = $GLOBALS['TSFE']->tmpl->linkData($page_id, '', $GLOBALS['TSFE']->no_cache, '', '', $params, $type);

Но так как это внутреняя функция, то документацию вы по ней вы вряд ли найдете - смотрите комментарии в коде ядра. Хотя тут все довольно очевидно, вам нужно менять только первый параметр - Id страницы.

jettero
05.03.2011, 15:16
Если ли бы вы делали ваш код, как типичный плагин наследуемый от класса tslib_pibase, то в нем есть ряд функций для генерации ссылок:

function pi_getPageLink($id,$target='',$urlParameters=array ())
function pi_linkToPage($str,$id,$target='',$urlParameters=a rray())
function pi_linkTP($str,$urlParameters=array(),$cache=0,$al tPageId=0)

Они в свою очередь являются обертками для функции класса tslib_cObj - getTypoLink_URL() и getTypoLink().

а getTypoLink_URL() и getTypoLink() в свою очередь обертки для typolink() :)
поэтому самый быстрый способ получить ссылку:
$url = $this->cObj->typolink(
'',
array(
'parameter' => $id,
'returnLast' => 'url',
)
);

dmartynenko
06.03.2011, 18:25
Ну если вы хотите так углубиться, то typolink() является "оберткой" для $GLOBALS['TSFE']->tmpl->linkData()

"Быстрый" в вашем примере понятие весьма условное. Так как скорость генерации ссылки будет одинакова - накладные расходы на обертки во много-много раз меньше, чем время генерации ссылки через linkData(). А вот удобство и читаемость кода ухудшаються. И банально можно опечататься в названии передаваемых переменных и потом долго искать причину, почему же нет ссылки.

jettero
08.03.2011, 04:38
Ну если вы хотите так углубиться, то typolink() является "оберткой" для $GLOBALS['TSFE']->tmpl->linkData()
typolink() нельзя назвать оберткой. Обертка это когда всю работу выполняет другая функция, которую мы вызываем с нужными параметрами. А если сравнить объем кода: linkData() - 85 строк, typolink() - 527 строк.

Эти функции находятся на разных слоях API. Каспер разрабатывал TYPO3 как фреймворк, а не как обычную CMS. И linkData() находится в t3lib директории, то есть это часть фреймворка. А typolink() в директории tslib, то есть это часть экстеншена СMS.

Все ссылки, которые генерятся через шаблоны, идут только через typolink(), и какое-либо расширение может через хуки в typolink() изменять вид ссылок. Поэтому, когда мы вызываем typolink() мы всегда знаем, что получаем самую "правильную" ссылку.

Ну и наконец вызывать linkData() просто неудобно - например нужно передавать не id страницы, а ее запись, то есть нужно будет самому делать запрос к БД, но это пол беды – нужно самому проверять, что у юзера есть доступ к этой странице, нужно проверить, что эта страница не shortcut, проверить, что там нет mount point и т.д. и т.п.
То есть придется самому написать половину из тех 500 строк в typolink() :)

PS Еще заметил, что у вас вызов неправильно написан:
$link = $GLOBALS['TSFE']->tmpl->linkData($page_id, '', $GLOBALS['TSFE']->no_cache, '', '', $params, $type);
там не $page_id, а массив $page.

Valery Romanchev
09.03.2011, 03:27
На эту тему есть экстеншен pagepath, который для генерации URL вызывает FE (конечно, не весь, а только нужную часть)
http://typo3.org/documentation/document-library/extension-manuals/pagepath/0.1.6/view/1/2/

dmartynenko
09.03.2011, 13:56
jettero, вы все правильно написали.

Но я написал решение для конкретного вопроса.
Вопрос только в том, как имея uid страницы в моем кое получить ссылку на эту страницу в правильном виде, а не index.php?id=1 и т.д.

И не предлагал сделать свою замену typolink() через linkData().