• twitter image
  • facebook image
  • youtube image
  • linkedin image
Language: CMS made Simple Czech Site Zur deutschsprachigen Supportseite Site francophone Sitio en Castellano CMSMS - Magyarország CMSMS -  ???????
Pages: 1 [2] 3
  Print  
Author Topic: Проблема с Alias  (Read 20577 times)
0 Members and 1 Guest are viewing this topic.
Il_Burbero
Forum Members
**

Karma: 3
Offline Offline

Posts: 127



WWW
« Reply #15 on: 04 Jul 2008, 06:09 »

Ну вот не нашел.
Кстати скачал. Че то не вштырило (или лыжи не едут или я тормоз), нашел другой метод. Но он предполагает запись в ядро, что на сам деле не есть хорошо.
Итак есть другой класс транслитерации (далее Транслит). Вообще есть клад классов здесь http://www.phpclasses.org, правда для скачивания библиотек надо регистрироваться. Так вот там есть http://www.phpclasses.org/browse/package/2650.html класс. На всякий случай привожу код (класс маленький и еще поэтому он понра).
Code:
<?
// (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:
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 Edit: 04 Jul 2008, 06:27 by Il_Burbero » Logged
ZYV
Moderator
Power Poster
*****

Karma: 8
Offline Offline

Posts: 868


« Reply #16 on: 04 Jul 2008, 16:26 »

Я недавно думал о таком варианте, его БОЛЬШОЙ плюс в том, что везде работает (т.е. и в новостях, и в других местах).

Минус в том, что надо патчить misc.functions.php. Если честно, намучился уже кошмарным образом с обновлением сайтов на CMSMS, где кустарщики правили ядро. Нет бы за 5 секунд всё сделать и получить деньги... Надо скачивать дистрибутив и модули нужной версии, делать diff, потом пробежать глазами пачсет, применить его к новому дистрибутиву, потом проверять, что всё так же работает... бее...

Чем тебе тот класс понравился не знаю, те же яйца, только в профиль. Мне PixelApes больше понравился, т.к. там вроде бы по стандарту, то ли Дворак, то ли ГОСТ, а то самопальщиков этих боюсь я. Но на самом деле разницы никакой Smiley

P.S. Я тут подумал, вариант Сони-то можно ведь целиком в тег запихнуть. Так что я бы всё-таки пошел этим путем, наверное. Особливо если новости, например, не нужны, визитка, скажем, обычная квазистатическая.
Logged

unsigned double ZYV;
Il_Burbero
Forum Members
**

Karma: 3
Offline Offline

Posts: 127



WWW
« Reply #17 on: 05 Jul 2008, 10:56 »

Quote
Чем тебе тот класс понравился не знаю, те же яйца, только в профиль
Исключительно размером Smiley. Как то читал книжку (давно) про хакеров и вот с тех пор в голове накрепко засела тамошняя мысль "программа должна быть маленькой и быстрой" и с тех пор у меня фобия больших скриптов Smiley
И еще представленный мной класс (забыл сказать) поддерживает украинские кракозяблики, глядишь кому то и надо...

И я полностью согласен что менять ядро без крайней необходимости не следует, лучше обходится встроенными возможностями, тем паче что в этой КМС они просто огромные.
Logged
koljan
Forum Members
**

Karma: 0
Offline Offline

Posts: 59


« Reply #18 on: 09 Jul 2008, 17:06 »

Хорошее сегодня настроение - http://zaytsev.net/misc/translit/ - хотя мог бы сам найти.

скачал translit-1-2.zip, но архив не распаковывается, кто поможет?
Logged
ZYV
Moderator
Power Poster
*****

Karma: 8
Offline Offline

Posts: 868


« Reply #19 on: 10 Jul 2008, 01:52 »

Перевыложил. Попробуй ещё раз.
Logged

unsigned double ZYV;
koljan
Forum Members
**

Karma: 0
Offline Offline

Posts: 59


« Reply #20 on: 10 Jul 2008, 02:39 »

Quote
Я тут подумал, вариант Сони-то можно ведь целиком в тег запихнуть. Так что я бы всё-таки пошел этим путем, наверное. Особливо если новости, например, не нужны
а если нужны?  у меня проблема с новостями, если заголовок в кирилице, то не могу показать новость полностью при нажатии на заголовок в резюме, т.к. нет названия новости. Если вставляю цифры или латиницу в заголовок всё работает.
Logged
Il_Burbero
Forum Members
**

Karma: 3
Offline Offline

Posts: 127



WWW
« Reply #21 on: 10 Jul 2008, 04:55 »

а если нужны?  у меня проблема с новостями, если заголовок в кирилице, то не могу показать новость полностью при нажатии на заголовок в резюме, т.к. нет названия новости. Если вставляю цифры или латиницу в заголовок всё работает.
А если нужны то используй мой метод
Только апострофы из класса убери, а то получится из "предьявил" "pred-yavil". У меня работает этот метод с новостями очень хорошо.
Logged
koljan
Forum Members
**

Karma: 0
Offline Offline

Posts: 59


« Reply #22 on: 10 Jul 2008, 05:04 »

нет, наверное не буду этот метод пименять, боюсь...  Tongue

если что-то потом не будет работать, ищи крайнего...
Logged
ZYV
Moderator
Power Poster
*****

Karma: 8
Offline Offline

Posts: 868


« Reply #23 on: 12 Jul 2008, 12:42 »

Для новостей, я пропатчил файлы модуля News:

380:News.module.php
90:action.rss.php
343:action.default.php

примерно так...

Quote
// ZYV         
//            $prettyurl = 'news/' . $articleid.'/'.$returnid."/$aliased_title";
              $prettyurl = 'news/' . $articleid.'/'.$returnid."/text";

Ищи $aliased_title и заменяй в таком духе.
Logged

unsigned double ZYV;
koljan
Forum Members
**

Karma: 0
Offline Offline

Posts: 59


« Reply #24 on: 16 Jul 2008, 02:55 »

Для новостей, я пропатчил файлы модуля News:

380:News.module.php
90:action.rss.php
343:action.default.php

примерно так...

Quote
// ZYV         
//            $prettyurl = 'news/' . $articleid.'/'.$returnid."/$aliased_title";
              $prettyurl = 'news/' . $articleid.'/'.$returnid."/text";

Ищи $aliased_title и заменяй в таком духе.

помогло, спасибо! После следующего update надо эту процедуру повторить?
« Last Edit: 16 Jul 2008, 03:00 by koljan » Logged
ZYV
Moderator
Power Poster
*****

Karma: 8
Offline Offline

Posts: 868


« Reply #25 on: 16 Jul 2008, 15:04 »

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

Надо бы как-то с разработчиками интерфейс этой mungle-функции обсудить, чтобы не надо было в ядро лазать, да всё времени нет Sad
Logged

unsigned double ZYV;
jjoss
New Member


Karma: 0
Offline Offline

Posts: 7


« Reply #26 on: 07 Sep 2008, 16:54 »

Объясните, пожалуйста, как именно надо сделать, что делаю не так? У меня при добавлении страницы, если Title написан русскими буквами и Alias не заполнен руками, выдается Alias must be all letters and numbers.

1. Скачал translit.php в папку /lib
2. В админке Extensions > User Defined Tags > Add User Defined Tag
3. Name: Alias, Code: из последнего поста многоуважаемой Сони
4. Extensions > Events > ContentEditPre
5. Выбрал Alias, нажал Add, он появился в списке

При добавлении страницы алиас сам не заполняется. Но потом в строке адреса отображаются слова переведенные в транслит, а не те, что я писал в поле алиаса, когда добавлял материал. Может быть надо какой-то другой event использовать?
« Last Edit: 07 Sep 2008, 17:45 by jjoss » Logged
Sonya
Power Poster
***

Karma: 24
Offline Offline

Posts: 825


Russian minded, German located


WWW
« Reply #27 on: 08 Sep 2008, 04:00 »

Объясните, пожалуйста, как именно надо сделать, что делаю не так? У меня при добавлении страницы, если Title написан русскими буквами и Alias не заполнен руками, выдается Alias must be all letters and numbers.

1. Скачал translit.php в папку /lib
2. В админке Extensions > User Defined Tags > Add User Defined Tag
3. Name: Alias, Code: из последнего поста многоуважаемой Сони
4. Extensions > Events > ContentEditPre
5. Выбрал Alias, нажал Add, он появился в списке

При добавлении страницы алиас сам не заполняется. Но потом в строке адреса отображаются слова переведенные в транслит, а не те, что я писал в поле алиаса, когда добавлял материал. Может быть надо какой-то другой event использовать?
Я поправила код немного, скопируйте из моего поста http://forum.cmsmadesimple.org/index.php/topic,12132.msg109141.html#msg109141 .
Код делает транслит автоматически при создании новых страниц, если страница уже существует и нужно поменять alias на транслит тайтла, то в поле alias нужно задать translit. Если Вы задаете в поле alias значение вручную, то именно оно сохраняется.
« Last Edit: 08 Sep 2008, 04:02 by Sonya » Logged

jjoss
New Member


Karma: 0
Offline Offline

Posts: 7


« Reply #28 on: 08 Sep 2008, 07:23 »

Хочется совсем не переключаться на страницу Options даже при заведении новой страницы.

Попробовал сделать
Code:
if (empty($params['content']->mOldAlias) # new page
|| empty($params['content']->mAlias))

То есть, если хочешь задать руками - задай. Не хочешь - оставь пустым.

Странное дело, срабатывает только если menu text содержит цифры! С цифрами нормально конвертит "проверка1" в "proverka1". А вот на "проверка" ругается, что нету алиаса.
Logged
Sonya
Power Poster
***

Karma: 24
Offline Offline

Posts: 825


Russian minded, German located


WWW
« Reply #29 on: 08 Sep 2008, 07:27 »

Хочется совсем не переключаться на страницу Options даже при заведении новой страницы.
И не надо, я использую этот тег и при создании новой страницы транслит делается автоматически из меню текста.

Попробовал сделать
Code:
if (empty($params['content']->mOldAlias) # new page
|| empty($params['content']->mAlias))

То есть, если хочешь задать руками - задай. Не хочешь - оставь пустым.
Это не работает, потому что $params['content']->mAlias проверяется еще до отправки события и если он пустой, то системой автоматически подставляется $params['content']->mOldAlias, поэтому я подставляю проверку на "translit" в этом поле.

Странное дело, срабатывает только если menu text содержит цифры! С цифрами нормально конвертит "проверка1" в "proverka1". А вот на "проверка" ругается, что нету алиаса.
Вообще необъяснимо для меня  Grin
Logged

Pages: 1 [2] 3
  Print  
 
Jump to: