Сделал код, который работает:
[CODE]<?
// регистрируем обработчики
AddEventHandler("iblock", "OnBeforeIBlockElementAdd", Array("MyClass", "OnBeforeIBlockElementAddHandler"));
AddEventHandler("iblock", "OnBeforeIBlockElementUpdate", Array("MyClass", "OnBeforeIBlockElementUpdateHandler"));
class MyClass
{
// создаем обработчик события "OnBeforeIBlockElementAdd"
function OnBeforeIBlockElementAddHandler(&$arFields)
{
if($arFields['IBLOCK_ID'] == 13) // здесь указываем для какого Инфоблока будет применяться данная процедура
{
if(strlen($arFields['CODE'])<=0)
{
// достаем ID свойства Street
$arFilter = Array("ACTIVE"=>"Y", "CODE"=>"Street", "IBLOCK_ID"=>$arFields['IBLOCK_ID']);
$properties = CIBlockProperty::GetList(Array(), $arFilter);
while ($prop_fields = $properties->GetNext())
{
$prop_Street = $prop_fields["ID"];
}
// достаем ID свойства House
$arFilter = Array("ACTIVE"=>"Y", "CODE"=>"House", "IBLOCK_ID"=>$arFields['IBLOCK_ID']);
$properties = CIBlockProperty::GetList(Array(), $arFilter);
while ($prop_fields = $properties->GetNext())
{
$prop_House = $prop_fields["ID"];
}
$arFields["CODE"] = MyClass::imTranslite($arFields["NAME"]); // присваиваем наименование
$arFields["CODE"] .= "-".MyClass::imTranslite($arFields["PROPERTY_VALUES"]["".$prop_Street.""]["".$arFields['ID'].":".$prop_Street.""]['VALUE']); // добавляем улицу
$arFields["CODE"] .= "-".MyClass::imTranslite($arFields["PROPERTY_VALUES"]["".$prop_House.""]["".$arFields['ID'].":".$prop_House.""]['VALUE']); // добавляем дом
$arFields["CODE"] .= "-".date('dmY'); // добавляем дату
}
}
}
// создаем обработчик события "OnBeforeIBlockElementUpdate"
function OnBeforeIBlockElementUpdateHandler(&$arFields)
{
// echo '<pre>'; print_r($arFields); echo '<pre>'; die(); // возможно посмотреть только в НЕ быстром редактировании
if($arFields['IBLOCK_ID'] == 13)
{
if(strlen($arFields['CODE'])<=0)
{
// достаем ID свойства Street
$arFilter = Array("ACTIVE"=>"Y", "CODE"=>"Street", "IBLOCK_ID"=>$arFields['IBLOCK_ID']);
$properties = CIBlockProperty::GetList(Array(), $arFilter);
while ($prop_fields = $properties->GetNext())
{
$prop_Street = $prop_fields["ID"];
}
// достаем ID свойства House
$arFilter = Array("ACTIVE"=>"Y", "CODE"=>"House", "IBLOCK_ID"=>$arFields['IBLOCK_ID']);
$properties = CIBlockProperty::GetList(Array(), $arFilter);
while ($prop_fields = $properties->GetNext())
{
$prop_House = $prop_fields["ID"];
}
$arFields["CODE"] = MyClass::imTranslite($arFields["NAME"]); // присваиваем наименование
$arFields["CODE"] .= "-".MyClass::imTranslite($arFields["PROPERTY_VALUES"]["".$prop_Street.""]["".$arFields['ID'].":".$prop_Street.""]['VALUE']); // добавляем улицу
$arFields["CODE"] .= "-".MyClass::imTranslite($arFields["PROPERTY_VALUES"]["".$prop_House.""]["".$arFields['ID'].":".$prop_House.""]['VALUE']); // добавляем дом
$arFields["CODE"] .= "-".date('dmY'); // добавляем дату
}
}
}
function imTranslite($str)
{
static $tbl= array('а'=>'a','б'=>'b','в'=>'v','г'=>'g','д'=>'d','е'=>'e','ё'=>"yo",'ж'=>'g',
'з'=>'z','и'=>'i','й'=>'y','к'=>'k','л'=>'l','м'=>'m','н'=>'n','о'=>'o','п'=>'p','р'=>'r',
'с'=>'s','т'=>'t','у'=>'u','ф'=>'f','х'=>"h",'ц'=>"ts",'ч'=>"ch",'ш'=>"sh",'щ'=>"shch",
'ъ'=>"",'ы'=>'y','ь'=>"",'э'=>'je','ю'=>"yu",'я'=>"ya",'А'=>'A','Б'=>'B','В'=>'V','Г'=>'G',
'Д'=>'D','Е'=>'E','Ё'=>"YO",'Ж'=>'G','З'=>'Z','И'=>'I','Й'=>'Y','К'=>'K','Л'=>'L','М'=>'M',
'Н'=>'N','О'=>'O','П'=>'P','Р'=>'R','С'=>'S','Т'=>'T','У'=>'U','Ф'=>'F','Х'=>"H",'Ц'=>"TS",
'Ч'=>"CH",'Ш'=>"SH",'Щ'=>"SHCH",'Ъ'=>"",'Ы'=>'Y','Ь'=>"",'Э'=>'JE','Ю'=>"YU",'Я'=>"YA",
'.'=>"",'&'=>"",'"'=>"",' '=>"_",'№'=>"",'«'=>"",'»'=>"",'('=>"",')'=>"",'—'=>"-",','=>""
);
return strtr($str, $tbl);
}
}
?>[/CODE]
Все устраивает, только при быстром редактировании (редактировании в списке) Символьный код не присваивается?
Попробовал применить: OnAfterIBlockElementUpdate и OnAfterIBlockElementAdd безрезультатно...
[B]А как возможно сделать что бы и при быстром редактировании Символьный код вставлялся автоматически?[/B]