Получить пути 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(),

Другие вопросы по тегам