Ещё одна типовая задача при создании сайтов — это формирование «человекопонятных путей» для ваших публикаций. Можно прописывать их вручную, но удобнее, если такая механическая работа будет выполняться самим сайтом.
Я подразумеваю, что штатный модуль path включен, и вы не хотите по каким то причинам использовать готовые решения по автоматизации. Мне лично кажется, что более правильно включить 30-40 строк в собственный модуль, чем устанавливать дополнительно сторонний модуль.
Для начала зацепимся за hook nodeapi. В путь можно включить значение node id, что позволит сделать его гарантированно уникальным. Ещё я обычно добавляю в путь тип публикации (node type). А основа для составления пути — название публикации, которое мы будем подвергать транслитерации.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
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, преобразуя символы в аналоги на латинице. Кроме кириллицы, она ставит соответствие для ряда прочих символов (скобок, знаков препинания и т.п.). Остальные символы пропускаются.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
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); } |