Автоматическая генерация пути (path) для ноды (node) в drupal

Ещё одна типовая задача при создании сайтов — это формирование «человекопонятных путей» для ваших публикаций. Можно прописывать их вручную, но удобнее, если такая механическая работа будет выполняться самим сайтом.

Я подразумеваю, что штатный модуль 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);
    }

Оставьте ваш комментарий

*