Проблема с Alias

Обсуждение CMS Made Simple в России.

Moderators: iturbay, wdwp

Glad

Проблема с Alias

Post by Glad »

Добрый день!

Когда я создаю новый контент с русским именем, в поле Alias (имя URL) по-умолчанию пишется какая-то хрень. Но на demo-сайте когда я пытаюсь сохранить такой контент, мне выдается сообщение, что алиас может состоять только из букв и цифр. А на моем сайте, куда я поставил последнюю (1.0.6) версию CMSMS с пакетом русификации и Альбомом 0.9.1 почему-то сообщение об ошибке не появляется, эта хрень пишется в базу. В итоге получается, что в тексте меню сайта написана какая-то хрень и вся разметка съезжает.

Может быть, кто-нибудь знает, почему так случается?
ZYV
Language Partners
Language Partners
Posts: 868
Joined: Tue Nov 15, 2005 9:08 pm

Re: Проблема с Alias

Post by ZYV »

Сколько раз ты употребил слово "хрень" в своём сообщении? Покури http://wiki.cmsmadesimple.org/index.php ... ic_Support - только теперь надо

1) немного подправить под последнюю версию CMSMS
2) класс Convert упразднили, скачай версию 0.13  и выцепи его оттуда

Будет полноценный автоалиасинг транслитом =)
unsigned double ZYV;
ofrost
Forum Members
Forum Members
Posts: 47
Joined: Tue May 01, 2007 8:52 pm

Re: Проблема с Alias

Post by ofrost »

2) класс Convert упразднили, скачай версию 0.13  и выцепи его оттуда

можно об этом подробнее.

Я сделал всё как написано в статье, но результат был не тот. Алиасы транслитом не пишет.
ZYV
Language Partners
Language Partners
Posts: 868
Joined: Tue Nov 15, 2005 9:08 pm

Re: Проблема с Alias

Post by ZYV »

Я же говорю, к последней версии статья подходит лишь с некоторыми изменениями. Но идея верная, так что если в PHP соображаешь, то отладишь за полчаса. Если нет, то тогда, собственно, найми кого-нибудь, кто соображает, у меня, к сожалению, нет времени сейчас. Я тестировал недели две назад с предпоследней, пришлось поправить IF.

Про Convert - я по-моему, сказал достаточно конкретно - берешь старый дистрибутив - они все есть на форже, распаковываешь, и копируешь из lib класс Convert в новый дистрибутив.

Летом обновлю так, чтобы работало с последней версией.
unsigned double ZYV;
Sonya

Re: Проблема с Alias

Post by Sonya »

Чтобы не долбиться с изменениями в коде и подгрузкой библиотек, я сделала так:

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;
3. Вставила его в менеджере событий в ContentEditPre
ZYV
Language Partners
Language Partners
Posts: 868
Joined: Tue Nov 15, 2005 9:08 pm

Re: Проблема с Alias

Post by ZYV »

Ого! Вот это мудрое и красивое решение с использованием системы событий, которой не было для старых версий, для которых я писал этот тег. Можешь добавить в Вики?

Только я вот чего думаю... надо бы там if дополнительный поставить, типа

Code: Select all

if (empty($params['content']->mAlias)) $params['content']->mAlias = $alias;
А то иначе он всегда, наверное, будет перегенерировать алиасы транслитом при каждом сохранении страницы и если тебе какой-нибудь вдруг не понравится и ты решишь его исправить вручную -- уже не получится.
unsigned double ZYV;
Sonya

Re: Проблема с Alias

Post by Sonya »

ZYV wrote: Можешь добавить в Вики?
Не знаю  :) Еще не пользовалась.
ZYV wrote: А то иначе он всегда, наверное, будет перегенерировать алиасы транслитом при каждом сохранении страницы и если тебе какой-нибудь вдруг не понравится и ты решишь его исправить вручную -- уже не получится.
Не получится :) Но там есть такая фишка, если mAlias пустой, то он берет mAliasOld и заменяет его еще до события, то есть по сути - пустой алиас туда уже не приходит. Надо посмотреть, как это можно обойти.
ZYV
Language Partners
Language Partners
Posts: 868
Joined: Tue Nov 15, 2005 9:08 pm

Re: Проблема с Alias

Post by ZYV »

А что там в mAliasOld :) ? Может специфичную проверку сделать какую-то...
unsigned double ZYV;
Sonya

Re: Проблема с Alias

Post by Sonya »

Как я поняла там такая система, если страница новая, то Alias берется из Заголовка, если же страница редактируется и при этом убирается Alias (чтобы новый сгенерировать), то там подгружается mOldAlias, то есть где-то закешированный или из базы данных старый и берется по умолчанию, что вообщем-то не только для функции транслита неудобно, но вообще как-то не очень путево сделано.

Я пока обошла проблему негениально :) Поставила в if сравнение 'translit'. Когда я хочу транслитерацию, то задаю в поле алиас 'translit', тогда она делается моим тегом, если же в поле что-то отличное от 'translit', то тег ничего не делает.
Sonya

Re: Проблема с Alias

Post by Sonya »

Нашла один баг в своем решении - заглавные буквы "проглатывались". Теперь сделала так:

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;}
Если нужно делать транслит, то пишу в поле alias "translit"  - тогда транслитируется, при всех других значениях берет то, что есть :)
ZYV
Language Partners
Language Partners
Posts: 868
Joined: Tue Nov 15, 2005 9:08 pm

Re: Проблема с Alias

Post by ZYV »

Вот, кстати, у меня тоже они вроде проглатывались, только я так и не сообразил в чем-же причина...
unsigned double ZYV;
Sonya

Re: Проблема с Alias

Post by Sonya »

Вот последняя версия тега. При создании новой страницы транслит делается автоматически. Если же нужно сделать 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.
User avatar
Il_Burbero
Forum Members
Forum Members
Posts: 128
Joined: Tue Apr 15, 2008 10:36 am

Re: Проблема с Alias

Post by Il_Burbero »

Нельзя ли положить класс куда нибудь в доступное место? Сайт автора че то недоступен :'(
ZYV
Language Partners
Language Partners
Posts: 868
Joined: Tue Nov 15, 2005 9:08 pm

Re: Проблема с Alias

Post by ZYV »

Хорошее сегодня настроение - http://zaytsev.net/misc/translit/ - хотя мог бы сам найти.
unsigned double ZYV;
User avatar
Il_Burbero
Forum Members
Forum Members
Posts: 128
Joined: Tue Apr 15, 2008 10:36 am

Re: Проблема с Alias

Post by Il_Burbero »

Ну вот не нашел.
Кстати скачал. Че то не вштырило (или лыжи не едут или я тормоз), нашел другой метод. Но он предполагает запись в ядро, что на сам деле не есть хорошо.
Итак есть другой класс транслитерации (далее Транслит). Вообще есть клад классов здесь 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);
    }
  }
?>
В ходе ковыряния в коде (каламбур) нашел что все не латиники прогоняются через munge_string_to_url определенную в файле lib/misc.functions.php. Как всегда кракозябры типа кириликов меняют, а сами наши кирилики нет. Обидно.
В общем функцию приводим к виду:

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.
Post Reply

Return to “Russian - русский”