2009-08-17 4 views
0

私はGoogle Baseとインターフェースするモジュールを作成しています。アイテムがあるページへのリンクを挿入する必要がありますが、pathautoが実行されるまでこのアイテムにはパスがありません。どうすれば私のモジュールの前にpathautoがフックを実行するか、またはpathautoから生じるパスを得ることができますか?Pathautoを有効にしてノード '挿入'操作中にDrupalパスを取得しますか?

解決策は、管理者が概説したパスアウト設定が異なる任意の種類のノードで動作するように十分に一般的である必要があります。

問題は、私は関数を呼び出すとき$ノード変数の[パス]値は、以下のようになっていることである:[パス] => [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

のデフォルトの重みを取得、例えば自動エイリアス設定モジュールあなたが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); 

に注意:モジュールの重量は、フックの実装は他のすべての関係で呼び出されるモジュールの中すべて順序に影響を与えますモジュール!

私は単一のフックの実装の呼び出し順序に影響する方法を知らないので、特別な順序で実行する単一のフックの実装が必要な場合や、別の順序で実行する必要がある場合は終了しました異なるフック実装で異なる重み設定を可能にする1つまたは複数のサブモジュールを作成する。私はあなただけ、あなたがあなたのモジュールにこれらをベビーベッド可能性のURLを知りたい場合

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

に有用であり得る次の行を参照してください自動エイリアス設定モジュールモジュール内のコードを見てみると

+0

Jeremy Frenchの答えをhttp://stackoverflow.com/questions/1286107/get-drupal-paths-during-node-insert-operation-with-pathautautenen/1299189#1299189で明確にする: pathautoのようです$ nodeオブジェクトをhook_nodeapi()の挿入/更新操作で設定したパスで直接更新しないため、作成されたパスを取得するには、drupal_get_path_alias()を介して明示的に要求する必要があります。ただし、pathautoが動作した後もこの呼び出しを行う必要があります。 (このコメントはJeremyの回答に追加されていましたが、まだそうするには十分ではありません) –

1

。このコードは、op == 'insert'とop == 'update'に対してのみ実行されることにも注意してください。

これは、url_aliasテーブルに値を格納するpath_set_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)); 

私はその合計ハックを実現し、それが動作し、ここでは他に何もなかったです。

関連する問題