Просмотр полной версии : RealUrl: можно ли заставить генерить свои ссылки?
Привет Уважаемой typo3 общественности!
Может у кого есть опыт решения подобных задач.
Мне необходимо заставить realurl определенную страницу рассматривать как главную, т.е. чтобы он генерил в меню для одного из адресов не http://www.mysite.ru/kompanija/ а нормальный http://www.mysite.ru/
Пока я обхожусь через редирект, что как бы не правильно:
'redirects' => array(
'kompanija/' => 'http://www.mysite.ru/',
),
городить огород в меню, т.е. лепить через TS искусственный пункт меню тоже как бы не правильно.
Хотелось бы получить совета, как поступать?:confused:
dmartynenko
28.12.2010, 13:11
Одним из способов который можно попробовать - сделать страницу kompanija ссылкой на корневую.
Вообще не очень понятно для чего вам это. Если поясните, то возможно найдется другой вариант реализации вашей задумки.
Одним из способов который можно попробовать - сделать страницу kompanija ссылкой на корневую.
Этот вариант не подходит, напротив, корневая страница у меня является ссылкой на главную. Так удобней, в ней главный TS скрипт, ей присвоен шаблон внутренних страниц(для того чтобы вся иерархия имела этот шаблон), а главной - шаблон главной.
Вообще не очень понятно для чего вам это. Если поясните, то возможно найдется другой вариант реализации вашей задумки.
Банально - каприз заказчика.
PS Собственно, и интересно, задача вроде как не тривиальная.:)
dmartynenko
28.12.2010, 14:06
Этот вариант не подходит, напротив, корневая страница у меня является ссылкой на главную. Так удобней, в ней главный TS скрипт, ей присвоен шаблон внутренних страниц(для того чтобы вся иерархия имела этот шаблон), а главной - шаблон главной.
Так все равно не понятно что мешает сделать еще одну страницу ссылкой на главную (коневую)?
У вас главная и корневая страницы это разные страницы? Если да, то зачем?
Так все равно не понятно что мешает сделать еще одну страницу ссылкой на главную (коневую)?
Идея хороша, но как то не красиво - две лишние страницы :-)
У вас главная и корневая страницы это разные страницы? Если да, то зачем?
да, это разные страницы, корневая страница в меню не входит, HMENU же строится от определенного корня (узла).
lib.mainMenu = HMENU
lib.mainMenu.entryLevel = 0
lib.mainMenu.wrap = <UL> | </UL>
...
PS Возможно я не правильно понимаю typo3. Уж слишком гибкая она, и путей решения задачи масса :-)
dmartynenko
28.12.2010, 14:34
Идея хороша, но как то не красиво - две лишние страницы :-)
На сколько я понимаю исходая задача этим решается (я еще раз ее внимательно перечитал)? Или задача все же другая?
Если у вас получается несколько (две) страницы в меню, которые ссылаются на главную и одна из них лишняя, то просто исключите ее по ID (свойство excludeUidList).
На сколько я понимаю исходая задача этим решается (я еще раз ее внимательно перечитал)? Или задача все же другая?
Нет, вот только что попробовал, скрыл главную из меню (Hide in menu), создал еще одну рядом и сделал её ссылкой на корень. Как результат - ничего не изменилось (кэши зачищал, таблицы realurl чистил). Адрес так и остался - http://www.mysite.ru/kompanija/
Если у вас получается несколько (две) страницы в меню, которые ссылаются на главную и одна из них лишняя, то просто исключите ее по ID (свойство excludeUidList).
я вместо excludeUidList использую "Hide in menu" - это же одно и то же?
dmartynenko
28.12.2010, 14:59
Нет, вот только что попробовал, скрыл главную из меню (Hide in menu), создал еще одну рядом и сделал её ссылкой на корень. Как результат - ничего не изменилось (кэши зачищал, таблицы realurl чистил). Адрес так и остался - http://www.mysite.ru/kompanija/
А при переходе по этому адресу что получается?
Страница у вас типа "Ссылка" (в старых версиях название "Ярлык") ?
Сейчас попробовал - выбирается тип страницы "Ссылка", выбирается страница в соответсвующем поле "Ссылка на страницу" и в меню получается прямая ссылка на указанную страницу (проверил TYPO3 4.1 и 4.4).
я вместо excludeUidList использую "Hide in menu" - это же одно и то же?
Это по смыслу похоже, но для разных целей.
Hide in menu - скрыть страницу из всех меню (кроме меню где явно указано includeNotInMenu).
excludeUidList - в конкретном меню скрыть именно указанные страницы.
dmartynenko
28.12.2010, 15:15
Нашел еще в доке по RealURL параметр:
dontResolveShortcuts
If set, page shortcuts are not resolved to their destination page.
NB: If you do not set this option the backends Speaking URL Management module will probably report duplicate entries in the pathCache table since both the shortcut page and the destination page will have the same URL entry. The error is in that case not a real problem of course, but annoying to the eye.
Еще раз повторил "приём с лишней страницей", после того как включил 'dontResolveShortcuts' => 1 ситуация наконец исправилась, правда теперь элемент меню главной страницы не получает статус "активный"
А в целом, Спасибо Дмитрий!
PS ...однако не покидает чувство, что это не правильный подход. :-)
PSS ...пытаюсь достучаться до Вашей аси, тщетно :-)
Андрей Аксенов
29.12.2010, 14:40
Не знаю, совсем по теме, или нет, но было здесь что-то схожее:
http://forum.typo3.biz/showthread.php?t=7925&highlight=%EC%E5%ED%FE
....
где была дана ссылка на страницу с фрагментами кода:
http://www.typo3wizard.com/en/snippets/menus/external-links-and-shortcuts-directly-in-the-menu.html
Переведу суть:
Внешние ссылки и ярлыки непосредственно в меню
Для страниц типа "ссылка" и "внешний адрес" TYPO3 по умолчанию не делает непосредственных ссылок на целевые внешние страницы / страницы-ссылки.
Этот фрагмент кода подключает режимы CUR и ACT для страниц типа ссылка.
Все действие осуществляется при помощи объекта CASE в stdWrap элемента меню:
lib.menu=HMENU
lib.menu {
1=TMENU
1.wrap=<ul>|</ul>
1.NO {
# do not create a link here else there are double <a> tags
doNotLinkIt = 1
wrapItemAndSub=<li>|</li>
stdWrap.cObject = CASE
stdWrap.cObject {
key.field = doktype
default = TEXT
default {
field = title
typolink.parameter.field = uid
stdWrap.htmlSpecialChars = 1
}
# 4 = shortcut
4 = TEXT
4 {
field = title
typolink.parameter.field = shortcut
}
# 3 = external url
3 = TEXT
3 {
field = title
typolink.parameter.field = url
typolink.extTarget.field = target
}
}
}
}
Комментировать не буду, по-моему все понятно из кода...
dmartynenko
29.12.2010, 15:07
Для страниц типа "ссылка" и "внешний адрес" TYPO3 по умолчанию не делает непосредственных ссылок на целевые внешние страницы / страницы-ссылки.
У меня для типа "ссылка" делает. Голый свежий TYPO3 + RealURL (да и старые тоже делают).
Для внешнего адреса конечно по умолчанию редирект.
Т.е., вы рекомендуете делать ссылку в меню "вручную", исключая её через excludeUidList ?
dmartynenko
29.12.2010, 16:31
Не понял что вы имеете в виду под "вручную"?
Приведенный выше код всегда делает прямые ссылки с пунктов меню как для страниц типа "ссылка", так и для "внешнего адреса".
Не верно выразился, я имел ввиду через COA выстраивать меню, исключив первый пункт, добавляя его вручную через свойство TEXT (изврат не обращайте внимания).
Другой вопрос, как к элементам меню, которое предложил Андрей, добавить атрибут title. Конструкция ниже, от чего то не работает:
lib.mainMenu = HMENU
lib.mainMenu {
1=TMENU
1.wrap= <UL> | </TR> </UL>
1.NO {
# do not create a link here else there are double <a> tags
doNotLinkIt = 1
ATagTitle.field = description
wrapItemAndSub = <li> | </li>
stdWrap.cObject = CASE
stdWrap.cObject { ...
dmartynenko
29.12.2010, 17:31
Попробуйте в 3-х местах добавить: typolink.title.field = description
doNotLinkIt = 1 запрещает меню самому формировать ссылки (ссылки формируются в stdWrap.cObject), поэтому ATagTitle не будет работь.
От... как я забыл про это свойство :-)
Спасибо Дмитрий! :-)
Попробовал, видно не умею я готовить этименю, вот что мы имеем:
lib.mainMenu {
1=TMENU
1.wrap = <UL> | </UL>
1.NO {
# do not create a link here else there are double <a> tags
doNotLinkIt = 1
allWrap = <li> | </li>
stdWrap.cObject = CASE
stdWrap.cObject {
key.field = doktype
default = TEXT
default {
field = nav_title
typolink.parameter.field = uid
typolink.title.field = description
stdWrap.htmlSpecialChars = 1
}
# 4 = shortcut
4 = TEXT
4 {
field = title // nav_title
typolink.parameter.field = shortcut
typolink.title.field = description
}
# 3 = external url
3 = TEXT
3 {
field = nav_title
typolink.parameter.field = url
typolink.extTarget.field = target
typolink.title.field = description
}
}
}
1.ACT = 1
1.ACT {
# do not create a link here else there are double <a> tags
doNotLinkIt = 1
allWrap = <li> | </li>
stdWrap.cObject = CASE
stdWrap.cObject {
key.field = doktype
default = TEXT
default {
field = nav_title
typolink.parameter.field = uid
typolink.title.field = description
stdWrap.htmlSpecialChars = 1
typolink.ATagParams = class="active" tabindex = {register:count_MENUOBJ}
}
# 4 = shortcut
4 = TEXT
4 {
field = nav_title
typolink.parameter.field = shortcut
typolink.title.field = description
typolink.ATagParams.wrap = class="active" tabindex = {register:count_MENUOBJ}
ATagParams.insertData = 1
ATagParams = class="active" tabindex = {register:count_MENUOBJ}
doNotLinkIt = 1
stdWrap.wrap = <span class="ActNoLink"> | </span>
}
3 = TEXT
3 {
field = nav_title
typolink.parameter.field = url
typolink.extTarget.field = target
typolink.title.field = description
typolink.ATagParams.wrap = class="active" tabindex = {register:count_MENUOBJ}
}
}
}
}
... много кода, толку совсем нет. Страница "Ярлык" не получает класс "Active"? остальные нормально, не ясно как такую ссылку делать не ссылкой (doNotLinkIt), т.е. просто передать значение поля {field:nav_title}
Тот код который делает то что нужно, кроме того что первый пункт меню "ярлык", не получает класс "Active" :
lib.mainMenu1 = HMENU
lib.mainMenu1 {
entryLevel = 0
wrap = <UL> | </UL>
1 = TMENU
1.NO {
allWrap = <li> | </li>
ATagTitle.field = abstract // description // subtitle // title
}
1.ACT = 1
1.ACT {
allWrap = <li> | </li>
ATagParams.insertData = 1
ATagParams = class="active" tabindex = {register:count_MENUOBJ}
doNotLinkIt = 1
stdWrap.wrap = <span class="ActNoLink"> | </span>
}
}
dmartynenko
30.12.2010, 15:10
В код сильно не вдавался, но ИМХО ярлык никогда не сможет получить свойства из ACT. Так как ACT определяется по совпадению id страницы в меню с текущей страницей в FE. Для ярлыка они никогда не совпадут.
Выход - добавить свойство через JS для этого пункта меню при совпадении с URL.
Можно использовать TS условия для этих целей - если текущее id страницы равно нужному, то добавляем в шаблон JS код, который добавит нужный класс этому пункту меню.
ИМХО ярлык никогда не сможет получить свойства
По моему это касается внешних ссылок, с ярлыками у ACT проблем нет, ведь когда я делал ссылку корневой страницы не первую внутреннюю, то АCT отрабатывал, если сделать тоже самое внутри корня (т.е. страница ссылается на соседнюю), то АСТ перестаёт действовать - т.е., дело в иерархии?!
В общем, я оставил эту затею, слишком много усилий ради такого пустяка.
Решение задачи перешло в академический интерес - как сделать изящно. :-)
dmartynenko
30.12.2010, 17:54
ACT отрабатывает и на нахождение страницы в пути к "корню".
Это нужно для вложенных меню:
Раздел 1
- подраздел 1.1
- подраздел 1.2
Раздел 2
- подраздел 2.1
- подраздел 2.2
Раздел 3
Если вы сейчас на странице "подраздел 2.1", то активными будут 2 страницы в обоих уровнях меню. Видимо это как раз ваш случай когда "ярлык" получил состояние ACT.
Работает на vBulletin® версия 3.8.1. Copyright ©2000-2025, Jelsoft Enterprises Ltd. Перевод: zCarot