Ещё одна типовая задача при создании сайтов — это формирование «человекопонятных путей» для ваших публикаций. Можно прописывать их вручную, но удобнее, если такая механическая работа будет выполняться самим сайтом.
Я подразумеваю, что штатный модуль path включен, и вы не хотите по каким то причинам использовать готовые решения по автоматизации. Мне лично кажется, что более правильно включить 30-40 строк в собственный модуль, чем устанавливать дополнительно сторонний модуль.
Для начала зацепимся за hook nodeapi. В путь можно включить значение node id, что позволит сделать его гарантированно уникальным. Ещё я обычно добавляю в путь тип публикации (node type). А основа для составления пути — название публикации, которое мы будем подвергать транслитерации.
function mymodule_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
if ($op == 'update' || $op == 'presave')
//создание пути для ноды
if (empty($node->path)) {
if (empty($node->nid)) {
//для новой публикации вычислим id таким незамысловатым способом
$nid = db_result(db_query("SELECT MAX(nid) FROM node")) + 1;
} else {
$nid = $node->nid;
}
switch ($node->type) {
default:
//cобираем путь = тип ноды + айди ноды + транслитерация названия + ".html"
$node->path = $node->type . '/' . $nid . '-' . translite($node->title) . '.html';
break;
}
}
}
Вы можете для каждого типа (node->type) создать собственные правила генерации пути, исходя из соображений SEO или личных предпочтений.
А вот пример функции транслитерации. Она работает с кириллицей UTF-8, преобразуя символы в аналоги на латинице. Кроме кириллицы, она ставит соответствие для ряда прочих символов (скобок, знаков препинания и т.п.). Остальные символы пропускаются.
function translite($title) {
$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","«"=>"",
"»"=>"","—"=>"-", " " => "-", ',' => '-', '(' => '-',
')' => '-', '&' => '-',
);
$n = '';
$len = mb_strlen($title);
for ($k = 0; $k < $len; $k++) {
$v = mb_substr($title, $k, 1);
if ($v >= '0' && $v <= '9')
$n .= $v;
else if ($v >= 'a' && $v <= 'z')
$n .= $v;
else if ($v >= 'A' && $v <= 'Z')
$n .= $v;
else if (isset($iso[$v])) $n .= $iso[$v];
}
return strtolower($n);
}