2009-08-17 5 views
0

Я пишу модуль, который взаимодействует с Google Base. Он должен вставить ссылку на страницу, на которой находится элемент, однако этот элемент не имеет пути до запуска pathauto. Как я могу либо убедиться, что pathauto запускает свои перехваты перед моим модулем, или получить путь, который будет вызван pathauto ?.Получить пути Drupal Во время работы узла «вставить» с включенным Pathauto?

Решение должно быть достаточно общим для работы с любым узлом, имеющим разные настройки pathauto, как описано администратором.

Проблема заключается в том, что [путь] значение переменной $ узла выглядит следующим образом, когда я вызываю функцию: [путь] => [pathauto_perform_alias] => 1

Значение пути узла приходит и значение, данное Google Base, - это просто базовый URL-адрес для веб-сайта.

Есть ли способ изменить вес, с помощью которого выполняются функции hook_nodeapi, чтобы они запускались позже, а не раньше?

У меня возникла аналогичная проблема с таксономией, которая не привязала термины к узлу, к которому я пытался получить доступ. Я обошел это, используя taxonomy_node_get_terms()

Заранее спасибо.

ответ

1

Есть ли способ, чтобы изменить вес на который hook_nodeapi функции запуска, так , что они будут работать позже вместо раньше?

Yes. Решения проблемы решены?

+0

Нет, это не решит проблему. Даже после установки веса выше всех других весов в системной таблице настройка пути объекта $ node по-прежнему показывает [path] => [pathauto_perform_alias] => 1 ... который семантически не имеет большого смысла мне все равно. – msumme

2

Есть ли способ, чтобы изменить вес на который 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); 

Берегись: Вес модулей влияет на порядок, в котором все реализациях модулей крючков дозвонились по отношению ко всем остальным модули!

Я не знаю, как повлиять на порядок вызова одного крючка, поэтому для случаев, когда мне нужна была реализация одного крючка для выполнения в специальном порядке, в то время как другим нужно было работать в другом порядке, я закончил создавая один или несколько вспомогательных модулей, чтобы допускать различные настройки веса для разных реализаций крючка.

+0

Чтобы уточнить ответ Джереми Франца в http://stackoverflow.com/questions/1286107/get-drupal-paths-during-node-insert-operation-with-pathauto-enabled/1299189#1299189: Похоже, что pathauto is не напрямую обновляя объект $ node с помощью пути, который он устанавливает на операции вставки/обновления hook_nodeapi(), поэтому, чтобы получить созданный путь, вам нужно явно запросить его через drupal_get_path_alias(). Обратите внимание, что вам все равно необходимо обеспечить выполнение этого вызова после того, как pathauto выполнил свою работу! (Добавил бы этот комментарий к ответу Джереми, но пока у меня недостаточно очков) –

1

Глядя на код в модуле 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); 
0

Реализации крюка выполняются исходя из веса модулей. В конкретном случае изменение веса не может быть выполнено, потому что поля формы, вероятно, изменены в hook_form_alter() или hook_form_FORM_ID_alter().

0

Я недавно столкнулся с этой проблемой, и ни один из приведенных выше ответов не помог многим. я в конечном итоге с помощью этого:

$alias = str_replace(' ', '-', strtolower($node->title)); 

Я реализовав свой общий хак, но он работает, и ничего здесь сделал.