Доработка поиска по артикулу в интернет-магазине



Задача:
Сделать поиск более вариантивным, потому что кто-то артикул пишет не целиком, кто-то с пробелами, кто-то с тире, чтобы поиск норм подбирал товары.

Решение:
Добавить тегов в товар
обработчик в init.php
AddEventHandler("iblock", "OnBeforeIBlockElementAdd", "MyOnBeforeIBlockElementAdd");
AddEventHandler("iblock", "OnBeforeIBlockElementUpdate", "MyOnBeforeIBlockElementUpdate"); 


function MyOnBeforeIBlockElementAdd(&$arFields){   
    AddTags($arFields);
}
function MyOnBeforeIBlockElementUpdate(&$arFields){   
   AddTags($arFields);
}
function AddTags(&$arFields){
   if(($arFields["IBLOCK_ID"] == IBLOCK_ID)&&($arFields["ACTIVE"]=="Y")){   
      $name = $arFields["NAME"];
      $alph = 'abcdefghijklmnopqrstuvwxyzабвгдеёжзийклмнопрстуфхцчшщъыьюэя';
      $alph1 = str_split($alph);
      $numbers = '1234567890';
      
      $name = str_replace(array("(",")",",","/",";")," ", $name);
      $name = str_replace("  "," ",$name);
      $name = str_replace("  "," ",$name);
      $name = str_replace("  "," ",$name);

      $arS1 = explode(" ", strtolower($name));   
      

      $arS = array();
      foreach ($arS1  as $s) {
         // echo $s;
         $s = trim($s);
         $s2 = str_split($s);
         $flA = false;
         $flN = false;
         foreach ($s2 as $w) {            
            if(in_array($w, $alph1)){
               $flA = true; 
            }            
            elseif(stripos($numbers, $w)!==false){
               $flN = true; 
            }
            if($flN && $flA){            
               $arS[] = $s;
               break;
            }
         }
         
      }
      

      $arS1 = array();
      foreach ($arS as $s) {
         //echo $s."<br>";
         $s1 = str_split($s);
         $s2 = '';
         $flA = false;
         $flN = false;
         $i = 0;
         foreach ($s1 as $w) {            
            if(in_array($w, $alph1)){      
            //if(stripos($alph, $w) !== false){
               if(!$flA){
                  $flA = true;
                  $flN = false;
                  if($s2 != ''){
                     $arS1[] = $s2;
                     $arS1[] = substr($s, 0,$i);
                     $arS1[] = substr($s, $i);                  
                  }
                  $s2 = '';
               }
               $s2 .= $w;   
            }
            elseif(stripos($numbers, $w)  !== false){
               if(!$flN){
                  $flN = true;
                  $flA = false;
                  if($s2 != ''){
                     $arS1[] = $s2;                  
                     $arS1[] = substr($s, 0,$i);
                     $arS1[] = substr($s, $i);                  
                  }
                  $s2 = '';
               }
               $s2 .= $w;
            }
            else{
               $flA = false;
               $flN = false;
               if($s2 != ''){
                  $arS1[] = $s2;   
                  $s2 = '';                     
               }
            }
            $i++;
            
         }
         if($s2 != ''){
            $arS1[] = $s2;   
            $s2 = '';               
         }
         if(stripos($s, "-") !== false){         
            $arS1 = array_merge($arS1, explode("-",$s));
         }
      }
      $s = implode(" ", array_unique($arS1));
      $arFields["TAGS"] = $s;
   }

}
Если блог был полезным, можете угостить меня "чашечкой кофе" :)

Сбер по номеру телефона +7 (953) 585-13-09 Вероника.
Спасибо!