We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 785
    • 2,113 Posts
    При использовании ЧПУ иногда утомительно придумывать уникальные псевдонимы для каждого документа. Русские названия из заголовка MODx не преобразует в псевдонимы, так что я написал небольшой плагин, которые в случае пустого псевдонима вставляет транслитерированный текст из заголовка. Привязать его надо к событию OnBeforeDocFormSave. Может такой плагин уже есть, но я не нашел.
    global $alias;
    $e = &$modx->Event;
    if ($e->name == "OnBeforeDocFormSave") {
    	if (!strlen($_POST['alias'])) {
    		$trans = array("а"=>"a", "б"=>"b", "в"=>"v", "г"=>"g", "д"=>"d", "е"=>"e",
    		"ё"=>"jo", "ж"=>"zh", "з"=>"z", "и"=>"i", "й"=>"jj", "к"=>"k", "л"=>"l",
    		"м"=>"m", "н"=>"n", "о"=>"o", "п"=>"p", "р"=>"r", "с"=>"s", "т"=>"t", "у"=>"u",
    		"ф"=>"f", "х"=>"kh", "ц"=>"c", "ч"=>"ch", "ш"=>"sh", "щ"=>"shh", "ы"=>"y",
    		"э"=>"eh", "ю"=>"yu", "я"=>"ya", "А"=>"a", "Б"=>"b", "В"=>"v", "Г"=>"g",
    		"Д"=>"d", "Е"=>"e", "Ё"=>"jo", "Ж"=>"zh", "З"=>"z", "И"=>"i", "Й"=>"jj",
    		"К"=>"k", "Л"=>"l", "М"=>"m", "Н"=>"n", "О"=>"o", "П"=>"p", "Р"=>"r", "С"=>"s",
    		"Т"=>"t", "У"=>"u", "Ф"=>"f", "Х"=>"kh", "Ц"=>"c", "Ч"=>"ch", "Ш"=>"sh",
    		"Щ"=>"shh", "Ы"=>"y", "Э"=>"eh", "Ю"=>"yu", "Я"=>"ya", " "=>"-", "."=>"-",
    		","=>"-", "_"=>"-", "+"=>"-", ":"=>"-", ";"=>"-", "!"=>"-", "?"=>"-");
    		$alias = mysql_escape_string($_POST['pagetitle']);
    		$alias = strip_tags(strtr($alias,$trans));
    		$alias = preg_replace('/&.+?;/', '', $alias);
    		$alias = preg_replace("/[^a-zA-Z0-9-]/","",$alias);
    		$alias = preg_replace('/([-]){2,}/', '\1',$alias);
    		$alias = trim($alias, '-');
    		$tblsc = $modx->getFullTableName('site_content');
    		if (strlen($alias)) {
    			$cnt = $modx->db->getValue("SELECT count(*) FROM " . $tblsc . " WHERE id<>'$id' AND alias='$alias'");
    			if ($cnt) $alias .= "-".$id;
    		}
     	}
     }

    Если у кого-то есть рекомендации по улучшению плагина, рад был бы их услышать. Правда некоторые исправления не вношу сознательно, например, проверку на разрешение неуникальных псевдонимов – в моем конкретном случае она не нужна.

    ---- Исправил ошибку.
      Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
      Статьи о MODx, регулярно новые публикации
      • 26564
      • 162 Posts
      /*==============================================================================
        Title: AutoAliasRus2Lat
        Category: Plugin
        Author: Predvoditelev Sergey
        Author URI: http://predvoditelev.ru/blog/
        Version: 1.0.0
        Last Update: 07.12.2007 19:30
      ==============================================================================*/
      
      /*==============================================================================
      Описание:
      Данный плагин при сохранении страницы автоматически создает псевдоним (Alias)
      для страницы на основе её заголовка (Page Title), при этом символы кирилицы
      заменяются на транслит.
      ==============================================================================*/
      
      /*==============================================================================
      Данный плагин основан на популярном плагине для WordPress - RusToLat.
      Побробнее об RusToLat:
      Plugin Name: RusToLat
      Plugin URI: http://mywordpress.ru/plugins/rustolat/
      Description: This plugin convert cyrillic characters in post title to latin characters. Very usefull for russian-speaking users of Wordpress. You can use this plugin for creating human-readable links. Thanks to Alexander Shilyaev for idea. Send your suggestions and critics to <a href="mailto:[email protected]">[email protected]</a>.
      Author: Anton Skorobogatov <[email protected]>
      Contributor: Andrey Serebryakov <[email protected]>
      Author URI: http://skorobogatov.ru/
      Version: 0.3
      ==============================================================================*/
      
      // Вы можете выбрать стандарт, по которому будет производится транслитерация заголовков.
      // off - Отключена
      // iso - ISO 9-95
      // gost - ГОСТ 16876-71
      // По-умолчанию используется ISO 9-95
      $rtl_standard = 'iso';
      
      global $alias;
      global $pagetitle;
        
      $gost = array(
         "Є"=>"EH","І"=>"I","і"=>"i","№"=>"#","є"=>"eh",
         "А"=>"A","Б"=>"B","В"=>"V","Г"=>"G","Д"=>"D",
         "Е"=>"E","Ё"=>"JO","Ж"=>"ZH",
         "З"=>"Z","И"=>"I","Й"=>"JJ","К"=>"K","Л"=>"L",
         "М"=>"M","Н"=>"N","О"=>"O","П"=>"P","Р"=>"R",
         "С"=>"S","Т"=>"T","У"=>"U","Ф"=>"F","Х"=>"KH",
         "Ц"=>"C","Ч"=>"CH","Ш"=>"SH","Щ"=>"SHH","Ъ"=>"'",
         "Ы"=>"Y","Ь"=>"","Э"=>"EH","Ю"=>"YU","Я"=>"YA",
         "а"=>"a","б"=>"b","в"=>"v","г"=>"g","д"=>"d",
         "е"=>"e","ё"=>"jo","ж"=>"zh",
         "з"=>"z","и"=>"i","й"=>"jj","к"=>"k","л"=>"l",
         "м"=>"m","н"=>"n","о"=>"o","п"=>"p","р"=>"r",
         "с"=>"s","т"=>"t","у"=>"u","ф"=>"f","х"=>"kh",
         "ц"=>"c","ч"=>"ch","ш"=>"sh","щ"=>"shh","ъ"=>"",
         "ы"=>"y","ь"=>"","э"=>"eh","ю"=>"yu","я"=>"ya"
        );
      
      $iso = array(
         "Є"=>"YE","І"=>"I","Ѓ"=>"G","і"=>"i","№"=>"#","є"=>"ye","ѓ"=>"g",
         "А"=>"A","Б"=>"B","В"=>"V","Г"=>"G","Д"=>"D",
         "Е"=>"E","Ё"=>"YO","Ж"=>"ZH",
         "З"=>"Z","И"=>"I","Й"=>"J","К"=>"K","Л"=>"L",
         "М"=>"M","Н"=>"N","О"=>"O","П"=>"P","Р"=>"R",
         "С"=>"S","Т"=>"T","У"=>"U","Ф"=>"F","Х"=>"X",
         "Ц"=>"C","Ч"=>"CH","Ш"=>"SH","Щ"=>"SHH","Ъ"=>"'",
         "Ы"=>"Y","Ь"=>"","Э"=>"E","Ю"=>"YU","Я"=>"YA",
         "а"=>"a","б"=>"b","в"=>"v","г"=>"g","д"=>"d",
         "е"=>"e","ё"=>"yo","ж"=>"zh",
         "з"=>"z","и"=>"i","й"=>"j","к"=>"k","л"=>"l",
         "м"=>"m","н"=>"n","о"=>"o","п"=>"p","р"=>"r",
         "с"=>"s","т"=>"t","у"=>"u","ф"=>"f","х"=>"x",
         "ц"=>"c","ч"=>"ch","ш"=>"sh","щ"=>"shh","ъ"=>"",
         "ы"=>"y","ь"=>"","э"=>"e","ю"=>"yu","я"=>"ya"
        );
      
      switch ($rtl_standard) {
      	case 'off':
      	    $alias = $pagetitle;
      		break;		
      	case 'gost':
      	    $alias = strtr($pagetitle, $gost);
         		break;
      	default: 
      	    $alias = strtr($pagetitle, $iso);
      		break;
      }
      
      $alias = strtolower( $alias );
      $alias = preg_replace('/&.+?;/', '', $alias); // kill entities
      $alias = str_replace( '_', '-', $alias );
      $alias = preg_replace('/[^a-z0-9\s-.]/', '', $alias);
      $alias = preg_replace('/\s+/', '-', $alias);
      $alias = preg_replace('|-+|', '-', $alias);
      $alias = trim($alias, '-'); 


      http://mywordpress.ru/plugins/rustolat/ Висит на событии OnBeforeDocFormSave.
        • 1788
        • 1,103 Posts
        Quote from: security at May 12, 2008, 09:53 AM

        http://mywordpress.ru/plugins/rustolat/ Висит на событии OnBeforeDocFormSave.
        В нем недостаток. Если поле уже заполнено, плагин всеравно изменяет поле по правилу.
          • 24531
          • 213 Posts
          AKots, спасибо! давно надо было, но лениво как всегда )
            • 1611
            • 591 Posts
            я заметил, что если в названии присутствуют заглавные английские буквы, то они выкусываются из алиаса. Строчные остаются.

            Изучая код, так и не понял почему. Может быть дело в функции strstr?
            Или нужно прописать соответствие еще и для заглавных букв, переводя их, например, в строчные.

            Я не ас в ПХП так что не бейте ногами если решение лежит на поверхности...
              • 785
              • 2,113 Posts
              Quote from: andrnag at May 17, 2008, 05:41 AM

              я заметил, что если в названии присутствуют заглавные английские буквы, то они выкусываются из алиаса.
              Ошибочка вышла rolleyes – вместо
              $alias = preg_replace("/[^a-z0-9-]/","",$alias);
              надо
              $alias = preg_replace("/[^a-zA-Z0-9-]/","",$alias);
              Исправил в первом сообщении. Спасибо, что обнаружили grin.
                Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
                Статьи о MODx, регулярно новые публикации
                • 1611
                • 591 Posts
                Всегда рад помочь!
                  • 7094
                  • 11 Posts
                  Я себе на неделе тоже писал такую штуку smiley Сравниваю ход мысли - практически один в один smiley Тоже, кстати, для генерации алиасов при созданиии пользователей (их страниц). Только я разрешил большие буквы (Я => Ya). Вообще, штука очень полезная и найдет применение во многих местах. В частности - при закачке файлов в визуальнике и в файлменеджере.
                    • 785
                    • 2,113 Posts
                    Quote from: denvor at Nov 10, 2008, 12:37 AM

                    Только я разрешил большие буквы (Я => Ya)
                    Вообще-nо именно в URL (в которые и подставляются псевдонимы) большие буквы вроде бы неуместны.
                      Создание сайтов на MODx, поддержка сайтов, поисковая оптимизация, программирование, копирайтинг
                      Статьи о MODx, регулярно новые публикации
                      • 6272
                      • 95 Posts
                      Отличная вещь! Может кто-то найдет время написать простой плагин вида:
                      если в аннотации что-то есть - ни чего не делаем
                      если в аннотации ни чего нет - копируем туда первые 255 символов из основного текста страницы

                      Привязать так же к OnBeforeDocFormSave. Может, у кого-то будет криво работать, но у многих, думаю, в основном тексте именно текст smiley без скриптов и наворотов, ибо их пишут в шаблон. И функция весьма пригодилась бы тем, кто имеет дело с большим кол-вом документов и все равно не будет писать в аннотацию краткое содержание своими словами (как по сути положено), а тупо скопипастит начало текста страницы.