Russian TYPO3 community

Russian TYPO3 community (http://forum.typo3.ru/index.php)
-   Общие вопросы (http://forum.typo3.ru/forumdisplay.php?f=12)
-   -   расширение CoolURL (http://forum.typo3.ru/showthread.php?t=7939)

Никита 31.08.2009 16:30

расширение CoolURL
 
Здравствуйте, я установил расширение coolurl, подключил свой магазин к typo3, в итоге адреса страниц правильно и красиво переписываются, а вот продукты нет (http://www.localhost/shop/?productID=4, хотелось бы вот так: http://www.localhost/shop/product_name/). В модуле coolurl можно для одного продукта переписать, а можно ли как-нибудь установить правило, чтобы для всех сразу?

dmartynenko 31.08.2009 19:39

Каким образом вы свой магазин подключили?

И RealURL и Cooluri могут заменить productID=хх на название продукта, если вы им укажите какую-либо таблицу из базы TYPO3 и на что заменять ID. Т.е. таблица как минимум должна содержать uid и какое-нибудь поле title, и быть зарегистрирована в TYPO3 (т.е. создана каким-либо установленным в системе экстеншеном).

reva2 31.08.2009 19:47

Цитата:

Сообщение от dmartynenko (Сообщение 25406)
И RealURL и Cooluri могут заменить productID=хх на название продукта, если вы им укажите какую-либо таблицу из базы TYPO3 и на что заменять ID. Т.е. таблица как минимум должна содержать uid и какое-нибудь поле title, и быть зарегистрирована в TYPO3 (т.е. создана каким-либо установленным в системе экстеншеном).

Еще одним ключевым моментом является то, что для генерации ссылок должна быть использована функция typolink.

Никита 31.08.2009 19:49

Я сделал своё расширение, таблица с uid (у меня product_id) и title естественно есть, так где можно установить правила подмены url. Файл для ссылок уже есть.

dmartynenko 01.09.2009 11:55

Читайте документацию по Cooluri. Там должно быть все подробно расписано. Я могу дать готовый пример только для RealURL.

Цитата:

Еще одним ключевым моментом является то, что для генерации ссылок должна быть использована функция typolink.
Кстати это существенный момент.
Вы еще не сказали как именно вы встроили магазин?
Что бы преобразовать обычный УРЛ в красивый ЧПУ действительно нужно задействовать логику TYPO3 через вызов функции typolink. Для родных экстеншенов это работает как говорят "out of box". Для "неродных" можно использовать http://typo3.org/extensions/reposito...epath/current/
Но еще нужно преобразовать УРЛ обратно - если ваш магазин совсем никак не связан с TYPO3 и ему вместо productID=4 будет передано http://www.localhost/shop/product_name/ что он будет с этим делать?

Никита 01.09.2009 12:25

Спасибо. Давайте пример для realurl, пожалуйста.

dmartynenko 01.09.2009 13:04

В файл конфигурации typo3conf/realurl_conf.php
в блок postVarSets вставляете что-то вроде:

Код:

...
'postVarSets' => array (
...
// страница ID=123 c магазином
'123' => array (
        'tovar' => array (
                array(
                        'GETvar' => 'ProductID',
                        'lookUpTable' => array(
                                'table' => 'tx_moymagazin_tovary',
                                'id_field' => 'uid',
                                'alias_field' => 'title',
                                'addWhereClause' => ' AND NOT (deleted OR hidden)',
                                'useUniqueCache' => 1,
                                'useUniqueCache_conf' => array(
                                        'strtolower' => 1,
                                        'spaceCharacter' => '-',
                                        ),
                                ),
                        ),
                ),
        ), // для ID=123 закончили
...
),
...

В результате получите:

http://localhost/shop/tovar/zubnaya-schetka/
shop - алиас для страницы 123 с магазином
tovar - префикс для распознавания что дальше будет идти код товара
zubnaya-schetka - значение поля title из вашей таблицы tx_moymagazin_tovary для указанного ID

Никита 01.09.2009 13:24

СПасибо, разберусь.

Никита 03.09.2009 01:21

Установил расширение realurl, для обычных страниц работает, а для продуктов - нет.
Хотел бы обратить Ваше внимание на следующие моменты.

1. В моём собственном интернет-магазине все ссылки изначально "красивые", поэтому я не нуждаюсь в использовании функции typolink(), правильно, она нужна только для переписывания ссылки - из динамической в статическую?
2. Обратно переписываю ссылки с помощью директивы в файле .htaccess:
"RewriteRule shop/product_name9/ index.php?ProductID=9"
3. В файл realconf.php или real_conf.php вставляю строки:
'postVarSets' => array(
'_DEFAULT' => array(
//begin of product code
'70' => array (
'shop' => array (
array(
'GETvar' => 'ProductID',
'lookUpTable' => array(
'table' => 'product',
'id_field' => 'product_id',
'alias_field' => 'name',
'addWhereClause' => ' AND NOT (deleted OR hidden)',
'useUniqueCache' => 1,
'useUniqueCache_conf' => array(
'strtolower' => 1,
'spaceCharacter' => '-',
),
),
),
),
),
//end of product code
//----------------------------------------------------------------
// news archive parameters
'archive' => array(
array(
'GETvar' => 'tx_ttnews[year]' ,

В итоге на странице http://www.localhost/shop/product_name9/ надпись:

Error!

Reason: "shop/name/" could not be found, closest page matching is shop/

Что же всё-таки я неправильно делаю?
Заранее спасибо.

dmartynenko 03.09.2009 13:50

Цитата:

Сообщение от Никита (Сообщение 25418)
1. В моём собственном интернет-магазине все ссылки изначально "красивые", поэтому я не нуждаюсь в использовании функции typolink(), правильно, она нужна только для переписывания ссылки - из динамической в статическую?

Так зачем вам вообще связываться с TYPO3 и его механизмами работы с URL ?
Если вас магазин установлен в отдельном каталоге с именем /shop/, то TYPO3 вообще не будет вызываться - будет вызываться например /shop/index.php и делать все что ему нужно...

Далее судя по вашему RewriteRule вы не даете TYPO3 ничего делать по генерации URL (да и файлов realconf.php или real_conf.php не существует, есть только typo3conf/realurl_conf.php).

Поэтому получая указанный URL RealURL и TYPO3 пытаются с ним разобраться и честно вам пишут, что страница shop/ найдена в дереве страниц, а дальше не понятно что с вашим URL делать.

Третий раз задаю вам вопрос - как вы подключили ваш магазин к TYPO3? Тогда и решение можно будет предложить по существу, а не предлагать вам то что совершенно не нужно.

Никита 03.09.2009 14:27

Ну изначально мой магазин и существовал как отдельный модуль в каталоге shop/, и даже была административная панель, но этого всё-таки мало, поэтому я и решил связать его с typo3 для полного счастья.


Связал интернет-магазин с typo3 очень просто: взял расширение extendedshop и переписыл там все файлы под мой магазин, поэтому сейчас категории shop не существует и физически магазин находится в корне сайта, но фактически, конечно, он начинается со страницы shop, созданной правда в typo3.

В итоге всё прекрасно работает вместе с typo3, но ссылки некрасивые.
Изначально было два выхода:
1. попытаться всё-таки их переписать средствами typo3 или напрямую через mod_rewrite
2. Закачать папку с магазином в корень сайта и подключить шаблон, созданный в typo3 к магазину.
По-моему 1-ый вариант покрасивши...

dmartynenko 03.09.2009 15:23

Цитата:

Сообщение от Никита (Сообщение 25425)
В итоге всё прекрасно работает вместе с typo3, но ссылки некрасивые.

Если все работает - то вам осталось вместо функции генерации URL для товара в коде вашего магазина вызвать TYPO3 функцию typolink() с нужными параметрами. Или одну из функций pi_*Link* из класса pi_base, от которого наследуются все FE плагины для TYPO3.

Получите красивые ссылки при правильной настройке RealURL/CoolURI.

Никита 03.09.2009 16:02

Моя функция для генерации красивого URL для товара:
public static function ToProduct($productId)
{
/*Сейчас определяю внешний вид ссылки (беру из бд имя продукта, соответствующее его ProductID)*/
$link = self::CleanUrlText(Catalog::GetProductName($produc tId)) . '/';
return self::Build($link);
}
то есть мне особо не надо генерить ссылки - они уже есть или всё равно надо?

Вот моя функции для генерации простого URL для товара:
public static function ToProduct($productId)
{
return self::Build('?ProductId=' . $productId);
}
Наверное сюда надо прикрутить функцию typolink()? А каким образом? Просто заменить на typolink()? Расширение pagepath подключать надо? Можно примерчик? И потом надо обратно url поменять? С помощью .htaccess?

dmartynenko 03.09.2009 17:43

Такой вариант может сработать - генерить ссылки без TYPO3. TYPO3 при получении такого URL будет его парсить и заполнять соответствующие переменные в $_GET.

Если вы используете TYPO3 и для генерации - то получаете URL который будет правильно парситься. Иначе надо следующие нюансы.

Сейчас у вас index.php?ProductID=9 переводится в shop/product_name9/
Пусть у вас есть страница с алиасом shop - ее RealURL распознает. Но дальше ему надо понять что делать с product_name9. В конфиге для RealURL вы привели код:

Код:

'70' => array (
  'shop' => array (
      array(
        'GETvar' => 'ProductID',

Судя по всему 70 это uid страницы с алиасом shop.
Но дальше идет префикс shop за которым будет title товара, причем из-за 'spaceCharacter' => '-' он будет таким "product-name9". Сгенерированный URL получиться таким:
example.org/shop/shop/product-name9/

Он отличается от того, который вы передаете TYPO3 при помощи апачевского RewriteRule. Поэтому при парсинге возникнет ошибка, как вы приводили выше.

Экст pagepath можно использовать для генерации корректного URL - ему передаются параметры страница, и ваш ProductID и он вернет URL. Но это не быстрое решение. Быстрее работает если создать объект cObject и вызвать у него typolink. Посмотрите как это делается в том же pagepath.

У вас может получиться эмулировать корректный URL и не тратить дополнительное время на его генерацию через TYPO3. Но я не уверен что это сработает из-за подмены uid на title (lookUpTable). Возможно логика RealURL такова, что он именно при генерации запоминает соответствие uid и title и потом при парсинге его использует.

Никита 03.09.2009 17:59

Спасибо, буду пробовать.

Никита 03.09.2009 22:13

1. Значит я попробывал генерить ссылки без TYPO3, но безуспешно. Правильно ли я всё делаю: установил расширение realurl, сконфигурировал файл realurlconf.php, сгенерил правильные ссылки и прописал файл .htaccess ("RewriteRule shop/shop/product_name9/ index.php?ProductID=9")?


2. А если использовать typo3 для генерации URL, то что надо сделать? Установить экст pagepath, и прописать линки через функцию typolink() в моём файле, и всё? А где надо обратно перевести url, чтобы потом его обработать (в .htaccess)?

dmartynenko 04.09.2009 15:55

Цитата:

Сообщение от Никита (Сообщение 25436)
1. Значит я попробывал генерить ссылки без TYPO3, но безуспешно. Правильно ли я всё делаю: установил расширение realurl, сконфигурировал файл realurlconf.php, сгенерил правильные ссылки и прописал файл .htaccess ("RewriteRule shop/shop/product_name9/ index.php?ProductID=9")?

Я не телепат и не могу сказать какой URL получиться если генерировать его через TYPO3. Это зависит от настройки как TYPO3 так и RealURL. Поэтому правильный ли RewriteRule вы прописали я не знаю.

Цитата:

Сообщение от Никита (Сообщение 25436)
2. А если использовать typo3 для генерации URL, то что надо сделать? Установить экст pagepath, и прописать линки через функцию typolink() в моём файле, и всё? А где надо обратно перевести url, чтобы потом его обработать (в .htaccess)?

В документации к pagepath даже код приведен:
Код:

require_once(t3lib_extMgm::extPath('pagepath', 'class.tx_pagepath_api.php');
$parameters = array('PruductID' => 6);
$url = tx_pagepath_api::getPagePath($pageId, $parameters);

Через typolink быстрее будет работать. И возможно даже проще.
Я не видел код вашего плагина для TYPO3, но обычно обычно FE плагины наследуются от класса tslib_pibase, и тогда создание ссылки выглядит примерно так (typolink при этом вызывается внутри tslib_pibase):
Цитата:

$linkText = "Самый лучший продукт";
$urlParameters = array('ProductID' => $id);
$url = $this->pi_linkTP($linkText, $urlParameters);

Никита 07.09.2009 15:30

Спасибо огромное за помощь! С задачей справился!
В итоге остановился на cooluri. А красивые ссылки инсертю в таблицу для cooluri с помощюь триггера, как только пишу новый продукт сразу в соответствующей таблицы показывается url на него.

dmartynenko 07.09.2009 18:39

Цитата:

Сообщение от Никита (Сообщение 25491)
Спасибо огромное за помощь! С задачей справился!
В итоге остановился на cooluri. А красивые ссылки инсертю в таблицу для cooluri с помощюь триггера, как только пишу новый продукт сразу в соответствующей таблицы показывается url на него.

Самый простой и думаю самый эффективный способ.
По и самый "не TYPO3" способ :)

PS: Кстати обратите внимание, что эти таблицы могут очищатся при "полной очистке кэша TYPO3". Так что сделайте для надежности ежедневную процедуру по крону заполнения для всех товаров.


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

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