Информация о модификации модуля CoolURI

advertisement
Информация о модификациях и работе модуля CoolURI
Информация о модификации модуля CoolURI ......................................................................1
Причины модификации модуля ...............................................................................................1
Решение и альтернативы ему ...................................................................................................1
О том, как самостоятельно назначать URL страницы ...........................................................2
Первый способ: ......................................................................................................................2
Второй способ: .......................................................................................................................3
Пояснения и код модифицированной функции ......................................................................3
Информация о модификации модуля CoolURI
Пятого апреля 2011, модуль CoolURI был модифицирован для того, чтобы он
правильно автоматически создавал URL страницы (конкретно для shgpi.edu.ru). Для этого
была модифицирована одна функция, которая отвечает за построение pagepath страницы –
массива значений с заголовками текущей страницы, страницы родителя… - и так до корня
сайта.
Функция эта находится в файле typo3conf/ext/cooluri/class.tx_cooluri.php и
называется getPageTitleBE($conf,$value)
Код функции с пояснениями и указанием модификации будет в конце данного
документа.
Причины модификации модуля
С момента переноса shgpi.edu.ru на TYPO3, с этим модулем возникли сложности –
его автоматическое обновление URL адресов страниц не работало корректно для
shgpi.edu.ru – несколько страниц (напр. «Новости» у факультетов) получали одинаковый
адрес или же кусок URL, обозначающего раздел (напр. /uch_sov/ для Ученого совета), был
в URL пропущен. На момент летней практики, эти проблемы были обойдены
(блокированы) изменением срока, через который должны обновляться страницы (задается
в CoolURIConf.xml)
Вообще, как сейчас уже известно, данные сложности возникли из-за шаблонов,
которые есть у разных разделов. А точнее из-за галочки в поле «rootlevel» - составление
пути прекращалось по достижении страницы, на которой находился шаблон с данным
свойством.
Решение и альтернативы ему
Для того чтобы достичь приемлемого уровня автоматизации создания URL есть 3 пути:
1) Модифицировать текущией шаблоны. У данного подхода есть один существенный
минус – текущие шаблоны – это самый быстрый способ создания структуры сайта
shgpi.edu.ru, в том виде в котором он находится с 2006 года. Чтобы структуру
сохранить и, заодно, URL правильные строить надо много экспериментировать с
TypoScript – а это требует времени и умений – этот путь был признан
нерациональным.
446993120
1
2) Использовать альтернативу модулю CoolURI – модуль RealURL – этот вариант
очень трудоемок и требует много времени на изучение модуля RealURL и его
возможностей.
3) Задать «правильную» конфигурацию в CoolURIConf.xml – синтаксис достаточно
сложен и, даже прочитав документацию, лично я, не нашел решения данной
проблемы.
4) Модифицировать функцию, которая строит pagepath – модуль написан на php,
функцию разобрать не сложно – это был самый быстрый и рациональный путь. У
него есть только один недостаток – необходимо не забывать также
модифицировать данную функцию при обновлении модуля.
О том, как самостоятельно назначать URL страницы
URL страницы можно назначить 2мя способами:
1) Задавая метки страниц
2) Непосредственно через интерфейс модуля CoolURI
Первый способ:
На портале используется модуль CoolURI преобразовывающий имена страниц в из
вида index.php&id=xxx в читаемый (или любой другой по желанию пользователя)
адрес (URL). Если не задавать создаваемой Вам странице определенных полей, то её
адрес (URL), будет создан автоматически при первом обращении к странице через сайт
(т.е. вне админки) (попасть на эту страницу можно набрав в адресной строке браузера
http://shgpi.edu.ru/index.php?id=[id_страницы]).
Чтобы самостоятельно задать URL, необходимо у задать данной странице
определенные поля: «Speaking URL path segment:» «Exclude this page from middle of
a page path», «Always exclude this page from a page path (dangerous!)».
Значения этих полей следует задавать маленькими латинскими буквами!
Вообще, можно задавать и кириллицей, но! – она будет преобразована в транслит,
и только создаст лишнюю нагрузку на модуль. Ну а буквы различного регистра в URL
многими браузерами будут преобразованы к нижнему регистру и это может вызвать
проблемы с отображением страницы (будет не найдена и т.д.).
Поясню предназначение этих полей:
Speaking URL path segment – самое важное поле – собственно здесь указывается
метка данной страницы в общем URL (URL формируется также из меток всех
предыдущих страниц или папок).
Exclude this page from middle of a page path – это поле указывает – исключать ли
метку данной страницы или папки из общего URL (галочка - исключать)
Always exclude this page from a page path (dangerous!) – поле указывает что данная
страница или папка всегда будет исключаться из общего URL. Опасно это тем, что
данная опция исключает метку из общего URL даже если этот URL пуст (т.е. можно
446993120
2
создать несколько ссылок на http://shgpi.edu.ru/ и, шаблон будет применен, тот, что на
этой странице, а не на главной странице сайта)
Второй способ:
URL страницы можно назначить через интерфейс модуля CoolURI непосредственно. Для
этого.
1) Первое, что нам надо сделать – наведите указатель мыши на иконку созданной
вами страницы. Вы должны увидеть что то типа
- эта контекстная
подсказка о идентификаторе страницы – нам нужно его на пару минут запомнить
или записать, для чего, будет написано ниже. Также можно перейти на созданную
Вами страницу и посмотреть её id в правом верхнем углу в её Path
. Также, найдите и
запомните таким же образом id страницы родителя.
2) Далее, перейдите в раздел Admin Tools -> CoolURI. Нажмите на кнопку Cached
Links, затем на ссылку all. Появится список соответствия id страниц и их читаемых
адресов. Нажимаем Ctrl+F и ищем id=(номер родительской страницы) – это нужно
затем, чтобы узнать её читаемый адрес, и соответственно правильно назвать
созданную Вами страницу. Копируем этот адрес. Скролим до верха страницы и
нажимаем там кнопку New link. На появившейся странице, в верхнее поле ввода
вставляете скопированный адрес и дописываете название страницы (латиницей, в
нижнем регистре) в нужном Вам виде. В нижнее поле ввода записываете id=(номер
созданной Вами страницы). На sticky поставьте галочку – это заставит модуль
CoolURI не обновлять автоматически заданный Вами URL. После этого жмем на
кнопку Save new URI.
Пояснения и код модифицированной функции
Для начала поясню алгоритм функции.
В неё передается текущая конфигурация из файла CoolURIConf.xml – точнее из
раздела pagepath и id текущей страницы (функция срабатывает, когда страница в
первый раз запрашивается через сайт). Из конфигурации определяется, значение какой
колонки из таблицы pages будет использоваться для создания URL метки страницы,
потом в цикле извлекаются данные текущей страницы и проверяется (- эта проверка и
была модифицирована), есть ли у этой страницы шаблоны с установленным «rootlevel»
- если есть – то цикл прекращается и возвращается URL-путь. Если же таких шаблонов
нет, то проверяется, есть ли версия страницы на этом языке и не исключена ли
страница из построения URL-пути, после чего URL-метка страницы преобразуется и
заносится в массив pagepath, а цикл повторяется для родительской страницы текущей.
И так до того момента, пока не найден корень сайта, либо шаблон с свойством
«rootlevel».
function getPageTitleBE($conf,$value) {
if ($GLOBALS['TSFE']->showHiddenPage || self::isBEUserLoggedIn()) {
$enable = ' AND deleted=0';
} else {
446993120
3
$enable = ' AND deleted=0 AND hidden=0';
}
$db = &$GLOBALS['TYPO3_DB'];
// выбирается из какого параметра конфиг файла будет строиться URL метка страницы
if (empty($conf->alias)) $sel = (string)$conf->title;
else $sel = (string)$conf->alias;
//первоначальный id страницы от которой URL-путь начинает строиться
$id = (int)$value[(string)$conf->saveto];
$confArray = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['cooluri']);
$langVar = $confArray['LANGID'];
// langId будет пуст (т.е. 0) ввиду того, что на портале не передается код языка
$langId = empty($value[$langVar])?false:$value[$langVar];
$langId = (int)$langId;
$pagepath = Array();
if (empty($conf->alias)) $sel = (string)$conf->title;
else $sel = (string)$conf->alias;
$sel = t3lib_div::trimExplode(',',$sel);
$max = 15;
while ($max>0 && $id) {
// проверка на то, был ли передан id и подстраховка
if (!is_numeric($id)){
$id = $GLOBALS['TSFE']->sys_page->getPageIdFromAlias($id);
}
// вытаскивается все поля относящиеся к текущей странице пути.
$q = $db->exec_SELECTquery('*','pages','uid='.$id.$enable);
$page = $db->sql_fetch_assoc($q);
// вытаскивается количество принадлежащих странице шаблонов с уст полем "rootlevel"
// собственно заремаривание этой выборки и замена условия выхода из цикла – это и есть
// модификация
/*
$temp = $db->exec_SELECTquery('COUNT(*) as num','sys_template','pid='.$id.' AND root=1'.$enable);
$count = $db->sql_fetch_assoc($temp);
if ($count['num']>0 || $page['is_siteroot']==1) { return $pagepath; }
*/
if ($page['is_siteroot']==1) { return $pagepath; }
if ($langId) {
$q
=
$db->exec_SELECTquery('*','pages_language_overlay','pid='.$id.'
sys_language_uid='.$langId.$enable);
$lo = $db->sql_fetch_assoc($q);
if ($lo) {
unset($lo['uid']);
unset($lo['pid']);
$page = array_merge($page,$lo);
}
}
if (!$page) break;
//
Проверка на исключение страницы из пути
if (($page['tx_cooluri_exclude']==1 && !empty($pagepath)) || $page['tx_cooluri_excludealways']) {
446993120
4
AND
++$max;
$id = $page['pid'];
continue;
}
// вытаскивается значения поля, которое будет служить меткой страницы
foreach ($sel as $s) {
$trimmed = trim($page[$s]);
if (!empty($trimmed)) {
$title = $trimmed;
break;
}
}
// обработка полученой метки
if (!empty($conf->sanitize) && $conf->sanitize==1) {
$pagepath[] = Link_Func::sanitize_title_with_dashes($title);
} elseif (!empty($conf->t3conv) && $conf->t3conv==1) {
$pagepath[] = Link_Func::specCharsToASCII($title);
} elseif (!isset($conf->urlize) || $conf->urlize!=0) {
$pagepath[] = Link_Func::URLize($title);
} else {
$pagepath[] = urlencode($title);
}
//родительская страница текущей
$id = $page['pid'];
--$max;
if (!empty($conf->maxsegments) && count($pagepath)>=(int)$conf->maxsegments) $max = 0;
}
return $pagepath;
}
446993120
5
Download