Проблема с Alias
Проблема с Alias
Добрый день!
Когда я создаю новый контент с русским именем, в поле Alias (имя URL) по-умолчанию пишется какая-то хрень. Но на demo-сайте когда я пытаюсь сохранить такой контент, мне выдается сообщение, что алиас может состоять только из букв и цифр. А на моем сайте, куда я поставил последнюю (1.0.6) версию CMSMS с пакетом русификации и Альбомом 0.9.1 почему-то сообщение об ошибке не появляется, эта хрень пишется в базу. В итоге получается, что в тексте меню сайта написана какая-то хрень и вся разметка съезжает.
Может быть, кто-нибудь знает, почему так случается?
Когда я создаю новый контент с русским именем, в поле Alias (имя URL) по-умолчанию пишется какая-то хрень. Но на demo-сайте когда я пытаюсь сохранить такой контент, мне выдается сообщение, что алиас может состоять только из букв и цифр. А на моем сайте, куда я поставил последнюю (1.0.6) версию CMSMS с пакетом русификации и Альбомом 0.9.1 почему-то сообщение об ошибке не появляется, эта хрень пишется в базу. В итоге получается, что в тексте меню сайта написана какая-то хрень и вся разметка съезжает.
Может быть, кто-нибудь знает, почему так случается?
Re: Проблема с Alias
Сколько раз ты употребил слово "хрень" в своём сообщении? Покури http://wiki.cmsmadesimple.org/index.php ... ic_Support - только теперь надо
1) немного подправить под последнюю версию CMSMS
2) класс Convert упразднили, скачай версию 0.13 и выцепи его оттуда
Будет полноценный автоалиасинг транслитом =)
1) немного подправить под последнюю версию CMSMS
2) класс Convert упразднили, скачай версию 0.13 и выцепи его оттуда
Будет полноценный автоалиасинг транслитом =)
unsigned double ZYV;
Re: Проблема с Alias
2) класс Convert упразднили, скачай версию 0.13 и выцепи его оттуда
можно об этом подробнее.
Я сделал всё как написано в статье, но результат был не тот. Алиасы транслитом не пишет.
можно об этом подробнее.
Я сделал всё как написано в статье, но результат был не тот. Алиасы транслитом не пишет.
Re: Проблема с Alias
Я же говорю, к последней версии статья подходит лишь с некоторыми изменениями. Но идея верная, так что если в PHP соображаешь, то отладишь за полчаса. Если нет, то тогда, собственно, найми кого-нибудь, кто соображает, у меня, к сожалению, нет времени сейчас. Я тестировал недели две назад с предпоследней, пришлось поправить IF.
Про Convert - я по-моему, сказал достаточно конкретно - берешь старый дистрибутив - они все есть на форже, распаковываешь, и копируешь из lib класс Convert в новый дистрибутив.
Летом обновлю так, чтобы работало с последней версией.
Про Convert - я по-моему, сказал достаточно конкретно - берешь старый дистрибутив - они все есть на форже, распаковываешь, и копируешь из lib класс Convert в новый дистрибутив.
Летом обновлю так, чтобы работало с последней версией.
unsigned double ZYV;
Re: Проблема с Alias
Чтобы не долбиться с изменениями в коде и подгрузкой библиотек, я сделала так:
1. Сгрузила транслит библиотеку и скопировала в /lib
2. Потом создала тег пользователя
3. Вставила его в менеджере событий в ContentEditPre
1. Сгрузила транслит библиотеку и скопировала в /lib
2. Потом создала тег пользователя
Code: Select all
global $gCms;
require_once($_SERVER['DOCUMENT_ROOT']."/lib/translit.php");
$alias = $params['content']->mMenuText;
$alias = iconv('UTF-8', 'ISO-8859-5',$alias);
$alias = convert_cyr_string($alias, 'i','w');
$alias = Translit::UrlTranslit($alias);
$params['content']->mAlias = $alias;
Re: Проблема с Alias
Ого! Вот это мудрое и красивое решение с использованием системы событий, которой не было для старых версий, для которых я писал этот тег. Можешь добавить в Вики?
Только я вот чего думаю... надо бы там if дополнительный поставить, типа
А то иначе он всегда, наверное, будет перегенерировать алиасы транслитом при каждом сохранении страницы и если тебе какой-нибудь вдруг не понравится и ты решишь его исправить вручную -- уже не получится.
Только я вот чего думаю... надо бы там if дополнительный поставить, типа
Code: Select all
if (empty($params['content']->mAlias)) $params['content']->mAlias = $alias;
unsigned double ZYV;
Re: Проблема с Alias
Не знаюZYV wrote: Можешь добавить в Вики?

Не получитсяZYV wrote: А то иначе он всегда, наверное, будет перегенерировать алиасы транслитом при каждом сохранении страницы и если тебе какой-нибудь вдруг не понравится и ты решишь его исправить вручную -- уже не получится.

Re: Проблема с Alias
А что там в mAliasOld
? Может специфичную проверку сделать какую-то...

unsigned double ZYV;
Re: Проблема с Alias
Как я поняла там такая система, если страница новая, то Alias берется из Заголовка, если же страница редактируется и при этом убирается Alias (чтобы новый сгенерировать), то там подгружается mOldAlias, то есть где-то закешированный или из базы данных старый и берется по умолчанию, что вообщем-то не только для функции транслита неудобно, но вообще как-то не очень путево сделано.
Я пока обошла проблему негениально
Поставила в if сравнение 'translit'. Когда я хочу транслитерацию, то задаю в поле алиас 'translit', тогда она делается моим тегом, если же в поле что-то отличное от 'translit', то тег ничего не делает.
Я пока обошла проблему негениально

Re: Проблема с Alias
Нашла один баг в своем решении - заглавные буквы "проглатывались". Теперь сделала так:
Если нужно делать транслит, то пишу в поле alias "translit" - тогда транслитируется, при всех других значениях берет то, что есть 
Code: Select all
global $gCms;
function cyr_strtolower($a) {
$offset=32;
$m=array();
for($i=192;$i<224;$i++)$m[chr($i)]=chr($i+$offset);
return strtr($a,$m);
}
if (empty($params['content']->mAlias) || $params['content']->mAlias=='translit') {
require_once($_SERVER['DOCUMENT_ROOT']."/lib/translit.php");
$alias = $params['content']->mMenuText;
$alias = iconv('UTF-8', 'ISO-8859-5',$alias);
$alias = convert_cyr_string($alias, 'i','w');
$alias = Translit::UrlTranslit(cyr_strtolower($alias));
$params['content']->mAlias = $alias;}

Re: Проблема с Alias
Вот, кстати, у меня тоже они вроде проглатывались, только я так и не сообразил в чем-же причина...
unsigned double ZYV;
Re: Проблема с Alias
Вот последняя версия тега. При создании новой страницы транслит делается автоматически. Если же нужно сделать translit уже существующего alias, то в поле alias нужно задать translit.
Code: Select all
if (empty($params['content']->mOldAlias) # new page
|| $params['content']->mAlias == 'translit' ) {
global $gCms;
function cyr_strtolower($a) {
$offset=32;
$m=array();
for($i=192;$i<224;$i++)$m[chr($i)]=chr($i+$offset);
return strtr($a,$m);
}
require_once($_SERVER['DOCUMENT_ROOT']."/lib/translit.php");
$alias = $params['content']->mMenuText;
$alias = iconv('UTF-8', 'ISO-8859-5',$alias);
$alias = convert_cyr_string($alias, 'i','w');
$alias = Translit::UrlTranslit(cyr_strtolower($alias));
$params['content']->mAlias = $alias;
}
Last edited by Sonya on Mon Sep 08, 2008 7:58 am, edited 1 time in total.
- Il_Burbero
- Forum Members
- Posts: 128
- Joined: Tue Apr 15, 2008 10:36 am
Re: Проблема с Alias
Нельзя ли положить класс куда нибудь в доступное место? Сайт автора че то недоступен 

Re: Проблема с Alias
Хорошее сегодня настроение - http://zaytsev.net/misc/translit/ - хотя мог бы сам найти.
unsigned double ZYV;
- Il_Burbero
- Forum Members
- Posts: 128
- Joined: Tue Apr 15, 2008 10:36 am
Re: Проблема с Alias
Ну вот не нашел.
Кстати скачал. Че то не вштырило (или лыжи не едут или я тормоз), нашел другой метод. Но он предполагает запись в ядро, что на сам деле не есть хорошо.
Итак есть другой класс транслитерации (далее Транслит). Вообще есть клад классов здесь http://www.phpclasses.org, правда для скачивания библиотек надо регистрироваться. Так вот там есть http://www.phpclasses.org/browse/package/2650.html класс. На всякий случай привожу код (класс маленький и еще поэтому он понра).
В ходе ковыряния в коде (каламбур) нашел что все не латиники прогоняются через munge_string_to_url определенную в файле lib/misc.functions.php. Как всегда кракозябры типа кириликов меняют, а сами наши кирилики нет. Обидно.
В общем функцию приводим к виду:
В защиту метода:
1. Латиники остаются на месте (на точном месте, т.е. пошел Windows будет poshel-Windows)
2. Меньше колебаний и меньше строк (против Сониного где нужно еще что то мутить).
3. Дополнительные функции не требуются.
Минусы
ХА нашел... В общем в классе рекомендую заменить "`" на другой знак или пусто "", т.к. в последствии он отсечется и получится два слова вместо одного.
Вроде работает и на простом контенте и на Новостях.
Кстати скачал. Че то не вштырило (или лыжи не едут или я тормоз), нашел другой метод. Но он предполагает запись в ядро, что на сам деле не есть хорошо.
Итак есть другой класс транслитерации (далее Транслит). Вообще есть клад классов здесь http://www.phpclasses.org, правда для скачивания библиотек надо регистрироваться. Так вот там есть http://www.phpclasses.org/browse/package/2650.html класс. На всякий случай привожу код (класс маленький и еще поэтому он понра).
Code: Select all
<?
// (c) YURiQUE (Yuriy Malchenko), 2005
// jmalchenko@gmail.com
//
// A very simple class with more natural cyrillic to latin transliteration.
//
// function Transliterate() takes 3 arguments - the string to transliterate itself,
// an encoding of the input string and an encoding of the result to get.
//
class Translit {
var $cyr=array(
"Щ", "Ш", "Ч", "Ц","Ю", "Я", "Ж", "А","Б","В","Г","Д","Е","Ё","З","И","Й","К","Л","М","Н","О","П","Р","С","Т","У","Ф","Х", "Ь","Ы","Ъ","Э","Є","Ї",
"щ", "ш", "ч", "ц","ю", "я", "ж", "а","б","в","г","д","е","ё","з","и","й","к","л","м","н","о","п","р","с","т","у","ф","х", "ь","ы","ъ","э","є","ї");
var $lat=array(
"Shh","Sh","Ch","C","Ju","Ja","Zh","A","B","V","G","D","Je","Jo","Z","I","J","K","L","M","N","O","P","R","S","T","U","F","Kh","'","Y","`","E","Je","Ji",
"shh","sh","ch","c","ju","ja","zh","a","b","v","g","d","je","jo","z","i","j","k","l","m","n","o","p","r","s","t","u","f","kh","'","y","`","e","je","ji"
);
function Transliterate($str, $encIn, $encOut){
$str = iconv($encIn, "utf-8", $str);
for($i=0; $i<count($this->cyr); $i++){
$c_cyr = $this->cyr[$i];
$c_lat = $this->lat[$i];
$str = str_replace($c_cyr, $c_lat, $str);
}
$str = preg_replace("/([qwrtpsdfghklzxcvbnmQWRTPSDFGHKLZXCVBNM]+)[jJ]e/", "\${1}e", $str);
$str = preg_replace("/([qwrtpsdfghklzxcvbnmQWRTPSDFGHKLZXCVBNM]+)[jJ]/", "\${1}'", $str);
$str = preg_replace("/([eyuioaEYUIOA]+)[Kk]h/", "\${1}h", $str);
$str = preg_replace("/^kh/", "h", $str);
$str = preg_replace("/^Kh/", "H", $str);
return iconv("utf-8", $encOut, $str);
}
}
?>
В общем функцию приводим к виду:
Code: Select all
function munge_string_to_url($alias, $tolower = false)
{
// replacement.php is encoded utf-8 and must be the first modification of alias
include(dirname(__FILE__) . '/replacement.php');
include_once(dirname(__FILE__) . '/class.translit.php'); //путь к классу Транслит
$alias = str_replace($toreplace, $replacement, $alias); //эту строку можно вообще закомментировать/удалить!
$translit = new Translit(); //вызов класса
$alias = $translit->Transliterate($alias, "utf-8", "utf-8"); //транслитерация
!!!далее без изменений
1. Латиники остаются на месте (на точном месте, т.е. пошел Windows будет poshel-Windows)
2. Меньше колебаний и меньше строк (против Сониного где нужно еще что то мутить).
3. Дополнительные функции не требуются.
Минусы
ХА нашел... В общем в классе рекомендую заменить "`" на другой знак или пусто "", т.к. в последствии он отсечется и получится два слова вместо одного.
Вроде работает и на простом контенте и на Новостях.
Last edited by Il_Burbero on Fri Jul 04, 2008 10:27 am, edited 1 time in total.