Как хакнуть path, чтобы заменял ЧАСТЬ url?

Главные вкладки

Аватар пользователя Dimm Dimm 22 ноября 2008 в 15:18

Задача:
Преобразовать пути вида taxonomy/term/10/nodetype в путь nazvanie_razdela/nodetype
(taxonomy/term/10/* -> nazvanie_razdela/*)

Проблема:
Модуль path может преобразовывать только явно указанные пути
taxonomy/term/10 -> nazvanie_razdela

Подскажите, пожалуйста куда копать?
path.module - смотрел, функцию замены url не нашел.

custom_url_rewrite_outbound, custom_url_rewrite_inbound использовать не хочется, т.к. в них придется обращаться в базу к таблице алиасов (а path это итак уже делает).

Комментарии

Аватар пользователя Dimm Dimm 23 ноября 2008 в 19:24

У pathauto все пути должны быть полностью прописаны в базе и он ищет в базе точное совпадение синонимов и путей.
А мне надо подставить синоним в часть пути.
Нашел я эту функцию в path.inc и исправил как мне надо Smile
<?php
/**
* Given an alias, return its Drupal system URL if one exists. Given a Drupal
* system URL return one of its aliases if such a one exists. Otherwise,
* return FALSE.
*
* param $action
* One of the following values:
* - wipe: delete the alias cache.
* - alias: return an alias for a given Drupal system path (if one exists).
* - source: return the Drupal system URL for a path alias (if one exists).
* param $path
* The path to investigate for corresponding aliases or system URLs.
* param $path_language
* Optional language code to search the path with. Defaults to the page language.
* If there's no path defined for that language it will search paths without
* language.
*
* return
* Either a Drupal system path, an aliased path, or FALSE if no path was
* found.
*/
function drupal_lookup_path($action, $path = '', $path_language = '') {
global $language;
// $map is an array with language keys, holding arrays of Drupal paths to alias relations
static $map = array(), $no_src = array(), $count;

$path_language = $path_language ? $path_language : $language->language;

// Use $count to avoid looking up paths in subsequent calls if there simply are no aliases
if (!isset($count)) {
$count = db_result(db_query('SELECT COUNT(pid) FROM {url_alias}'));
}

if ($action == 'wipe') {
$map = array();
$no_src = array();
$count = NULL;
}
elseif ($count > 0 && $path != '') {
if ($action == 'alias') {
if (isset($map[$path_language][$path])) {
return $map[$path_language][$path];
}
// Get the most fitting result falling back with alias without language
// $alias = db_result(db_query("SELECT dst FROM {url_alias} WHERE src = '%s' AND language IN('%s', '') ORDER BY language DESC", $path, $path_language));
$alias = db_result(db_query("SELECT dst FROM {url_alias} WHERE LOCATE(src, '%s') AND language IN('%s', '') ORDER BY language DESC", $path, $path_language));
$map[$path_language][$path] = $alias;
return $alias;
}
// Check $no_src for this $path in case we've already determined that there
// isn't a path that has this alias
elseif ($action == 'source' && !isset($no_src[$path_language][$path])) {
// Look for the value $path within the cached $map
$src = '';
if (!isset($map[$path_language]) || !($src = array_search($path, $map[$path_language]))) {
// Get the most fitting result falling back with alias without language
// if ($src = db_result(db_query("SELECT src FROM {url_alias} WHERE dst = '%s' AND language IN('%s', '') ORDER BY language DESC", $path, $path_language))) {
if ($src = db_result(db_query("SELECT src FROM {url_alias} WHERE LOCATE(dst, '%s') AND language IN('%s', '') ORDER BY language DESC", $path, $path_language))) {
$map[$path_language][$src] = $path;
}
else {
// We can't record anything into $map because we do not have a valid
// index and there is no need because we have not learned anything
// about any Drupal path. Thus cache to $no_src.
$no_src[$path_language][$path] = TRUE;
}
}
return $src;
}
}

return FALSE;
}
?>