2009-08-17 43 views
0

我在寫一個與Google Base連接的模塊。它需要插入鏈接到該項目所在的頁面,但是,該項目在pathauto運行之前沒有路徑。我怎麼能確保pathauto在我的模塊執行之前運行它的鉤子,或者獲得pathauto產生的路徑?獲取Drupal路徑在啓用Pathauto的節點「插入」操作期間?

該解決方案需要具有足夠的通用性,可以與管理員概述的具有不同pathauto設置的任何種類的節點一起使用。

的問題是,對於$節點可變的[路徑]值如下所示,當我調用函數:[路徑] => [pathauto_perform_alias] => 1

該節點路徑的值來空白,並且給予Google Base的價值僅僅是網站的基本網址。

有沒有辦法改變hook_nodeapi函數運行的權重,以便它們稍後運行而不是更早運行?

我遇到了類似的問題,沒有將分類術語添加到我試圖訪問的節點中。我通過使用taxonomy_node_get_terms()

得到解決,在此先感謝。

回答

1

有沒有辦法來改變體重在 這hook_nodeapi功能運行,因此 他們會運行,而不是後來越早 ?

Yes.這是否解決了您的問題?

+0

不,它不能解決問題。即使在設置權重高於系統表中的所有其他權重之後,$ node對象的路徑設置仍顯示[path] => [pathauto_perform_alias] => 1 ...這在語義上沒有多大意義無論如何,對我來說。 – msumme 2009-08-18 21:37:43

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是不直接使用它在hook_nodeapi()插入/更新操作上設置的路徑更新$ node對象,因此要獲取創建的路徑,您需要通過drupal_get_path_alias()明確詢問它。請注意,您仍然需要確保在pathauto完成其工作後進行此調用,不過! (會把這個評論添加到Jeremy的回答中,但我還沒有足夠的積分來這樣做) – 2009-08-21 11:43:08

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); 
     } 

如果你只是想知道的網址,你可以童牀這些到您的模塊中查看代碼。值得注意的是,這段代碼只運行於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)); 

我意識到它是一個總的黑客,但它的作品,並沒有什麼人在這裏做了。