Получить пути Drupal Во время операции вставки узла с включенным Pathauto?
Я пишу модуль, который взаимодействует с Google Base. Нужно вставить ссылку на страницу, на которой находится элемент, однако этот элемент не имеет пути до запуска pathauto. Как я могу убедиться, что pathauto запускает свои хуки раньше, чем мой модуль, или получить путь, который будет получен от pathauto?.
Решение должно быть достаточно универсальным, чтобы работать с любым типом узлов, имеющих различные настройки pathauto, как указано администратором.
Проблема в том, что при вызове функции значение [path] для переменной $node выглядит следующим образом: [path] => [pathauto_perform_alias] => 1
Значение для пути к узлу выходит пустым, а значение, данное Google Base, является просто базовым URL-адресом для веб-сайта.
Есть ли способ изменить вес, при котором выполняются функции hook_nodeapi, чтобы они запускались позже, а не раньше?
я столкнулся с подобной проблемой с таксономией, не привязав условия к узлу, к которому я пытался получить доступ. Я обошел это с помощью taxonomy_node_get_terms()
Заранее спасибо.
5 ответов
Есть ли способ изменить вес, при котором выполняются функции hook_nodeapi, чтобы они запускались позже, а не раньше?
Сами модули имеют вес, который определяет порядок, в котором их вызывают для вызовов их реализаций хуков. Модули с одинаковым весом вызываются в алфавитном порядке AFAIK.
Если вы не установили явно вес вашего модуля при установке (через hook_install), он получит значение по умолчанию 0.
Если вам нужно, чтобы реализации ловушек ваших модулей запускались после других специфических модулей, как, например, pathauto, вы должны сделать что-то подобное в реализации ваших модулей hook_install:
// Get the weight of the module you need to run after/before
$pathauto_weight = db_result(db_query("SELECT weight FROM {system} WHERE name = 'pathauto'"));
// Define your modules weight relative to that
$yourModule_weight = $pathauto_weight + 1;
// Set your modules weight
db_query("UPDATE {system} SET weight = %d WHERE name = 'yourModule'", $yourModule_weight);
Осторожно: вес модулей влияет на порядок, в котором все реализации ловушек модулей вызываются относительно всех других модулей!
Я не знаю, как повлиять на порядок вызовов реализаций с одной ловушкой, поэтому в тех случаях, когда мне нужно, чтобы реализация с одной ловушкой работала в особом порядке, в то время как другим нужно было работать в другом порядке, я в итоге создал один или несколько субмодули, чтобы учесть различные настройки веса в разных реализациях крючков.
Есть ли способ изменить вес, при котором выполняются функции hook_nodeapi, чтобы они запускались позже, а не раньше?
Да. Это решает вашу проблему?
Глядя на код в модуле pathauto, я вижу следующие строки, которые могут быть вам полезны
if (!isset($node->pathauto_perform_alias) || $node->pathauto_perform_alias) {
$placeholders = pathauto_get_placeholders('node', $node);
$src = "node/$node->nid";
$alias = pathauto_create_alias('node', $op, $placeholders, $src, $node->nid, $node->type, $node->language);
}
Если вы просто хотите узнать URL, вы можете добавить их в свой модуль. Также стоит отметить, что этот код запускается только для op=='insert' и op=='update'.
Еще одна вещь, на которую следует обратить внимание, это то, что она вызывает path_set_alias(), которая помещает значение в таблицу url_alias. Я думаю, что вызов drupal_get_path_alias будет делать то, что вы хотите.
$path = 'node/'. $node->nid;
$alias = drupal_get_path_alias($path);
Недавно я тоже столкнулся с этой проблемой, и ни один из приведенных выше ответов не очень помог. Я закончил тем, что использовал это:
$alias = str_replace(' ', '-', strtolower($node->title));
Я понимаю, что это полный взлом, но он работает, и больше ничего здесь не делал.
Реализации крюка выполняются в зависимости от веса модулей. В конкретном случае изменение веса не может работать, потому что поля формы, вероятно, изменяются в hook_form_alter()
или же hook_form_FORM_ID_alter()
,