Добро пожаловать на сайт <БагБД>, где вы можете задавать вопросы о программировании и разработке на Битрикс и Битрикс24, и получать быстрые и квалифицированные ответы от профессионалов!

Символьный код из названия элемента

00 голосов
6
Добрый день,

Подскажите пож-та как можно сделать чтобы символьный код автоматически брался из навания элемента.

Скачал последнюю демо версию в ней это уже реализовано достаточно просто активировать линк. На сайте установлена более старая версия и этого линка нет.

Возможно достаточно добавить часть кода на сайт чтобы добавить это функционал. Подскажите где копать?
спросил 03 Июнь, 13 от nonameXXX (260 баллов)

6 Ответы

+11 голос
Вот пример для всех инфоблоков.
Этот код нужно добавить в /bitrix/php_interface/init.php
Код
AddEventHandler("iblock", "OnBeforeIBlockElementAdd",      array("MyEventHandlerClass", "IBlockElementAddCodeFromName"));
AddEventHandler("iblock", "OnBeforeIBlockElementUpdate",   array("MyEventHandlerClass", "IBlockElementAddCodeFromName"));


class MyEventHandlerClass
{
   function IBlockElementAddCodeFromName(&$arFields)
   {
      if (strlen($arFields["NAME"])>0)
      {
         $arFields["CODE"]=Translit::UrlTranslit($arFields["NAME"]);
      }
   }
}

class Translit
{
    function Transliterate($string)
    {
      $cyr=array(
         "Щ",  "Ш", "Ч", "Ц","Ю", "Я", "Ж", "А","Б","В","Г","Д","Е","Ё","З","И","Й","К","Л","М","Н","О","П","Р","С","Т","У","Ф","Х", "Ь","Ы","Ъ","Э","Є","Ї",
         "щ",  "ш", "ч", "ц","ю", "я", "ж", "а","б","в","г","д","е","ё","з","и","й","к","л","м","н","о","п","р","с","т","у","ф","х", "ь","ы","ъ","э","є","ї"
      );
      $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"
      );
      for($i=0; $i<count($cyr); $i++)
      {
         $c_cyr = $cyr[$i];
         $c_lat = $lat[$i];
         $string = str_replace($c_cyr, $c_lat, $string);
      }
      $string = preg_replace("/([qwrtpsdfghklzxcvbnmQWRTPSDFGHKLZXCVBNM]+)[jJ]e/", "\${1}e", $string);
      $string = preg_replace("/([qwrtpsdfghklzxcvbnmQWRTPSDFGHKLZXCVBNM]+)[jJ]/", "\${1}'", $string);
      $string = preg_replace("/([eyuioaEYUIOA]+)[Kk]h/", "\${1}h", $string);
      $string = preg_replace("/^kh/", "h", $string);
      $string = preg_replace("/^Kh/", "H", $string);
      return $string;
   }

   function UrlTranslit($string)
   {
      $string = preg_replace("/[_\s\.,?!\[\](){}]+/", "_", $string);
      $string = preg_replace("/-{2,}/", "--", $string);
      $string = preg_replace("/_-+_/", "--", $string);
      $string = preg_replace("/[_\-]+$/", "", $string);
      $string = Translit::Transliterate($string);
      $string = ToLower($string);
      $string = preg_replace("/j{2,}/", "j", $string);
      $string = preg_replace("/[^0-9a-z_\-]+/", "", $string);
      return $string;
   }
}
ответил 03 Июнь, 13 от NitroGeN (2,840 баллов)
00 голосов
Спасибо

Правильно понимаю, что после добавления все символьные коды при сохранении нового элемента или редактирования сторого буду перезаписаны по этому алгоритму,

но как быть если некторые уже прописаны руками и нежелательно их менять
ответил 09 Июнь, 13 от nonameXXX (260 баллов)
+11 голос
Добавить проверку, заполнен ли символьный код

Вместо
if (strlen($arFields["NAME"])>0)

сделать что то типа
if (strlen($arFields["NAME"])>0 && strlen($arFields["CODE"])<=0)
ответил 11 Сен, 13 от EDKA (980 баллов)
00 голосов
Спасибо, все получилось
ответил 09 Дек, 13 от nonameXXX (260 баллов)
+11 голос
Вместо самописного Translit::UrlTranslit можно использовать CUtil::translit. В данном случае:
Код
$params = Array(
   "max_len" => "100", // обрезает символьный код до 100 символов
   "change_case" => "L", // буквы преобразуются к нижнему регистру
   "replace_space" => "_", // меняем пробелы на нижнее подчеркивание
   "replace_other" => "_", // меняем левые символы на нижнее подчеркивание
   "delete_repeat_replace" => "true", // удаляем повторяющиеся нижние подчеркивания
   "use_google" => "false", // отключаем использование google
);
$arFields["CODE"]=CUtil::translit($arFields["NAME"], "ru", $params); 
ответил 23 Март, 14 от An3or (140 баллов)
00 голосов
Цитата
Сергей Нифантов пишет:
if (strlen($arFields["NAME"])>0 && strlen($arFields["CODE"])<=0)
СПАСИБО ЗА КОД !!!
помогло, доходчиво и ясно...
ответил 16 Июль, 14 от Estareo (100 баллов)

Похожие вопросы

0 голосов
8 ответов
0 голосов
3 ответов
0 голосов
4 ответов
спросил 09 Ноя, 13 от XpoHo3aBp (860 баллов)