0

私は、Google Base と連携するモジュールを作成しています。アイテムがあるページへのリンクを挿入する必要がありますが、このアイテムには pathauto が実行されるまでパスがありません。モジュールが実行する前に pathauto がそのフックを実行するようにするか、pathauto から生成されるパスを取得するにはどうすればよいですか?

ソリューションは、管理者によって概説されているように、さまざまな pathauto 設定を持つあらゆる種類のノードで動作するように十分に汎用的である必要があります。

問題は、関数を呼び出すと、$node 変数の [path] 値が次のようになることです。 [path] => [pathauto_perform_alias] => 1

ノード パスの値は空になり、Google Base に与えられる値は単にウェブサイトのベース URL になります。

hook_nodeapi 関数が実行される重みを変更して、すぐにではなく後で実行する方法はありますか?

アクセスしようとしていたノードに用語を添付していない分類法で同様の問題に遭遇しました。taxonomy_node_get_terms() を使用して回避しました

前もって感謝します。

4

5 に答える 5

2

hook_nodeapi 関数が実行される重みを変更して、後で実行する方法はありますか?

モジュール自体には、フック実装の呼び出しのために呼び出される順序を決定する重みがあります。同じ重みを持つモジュールは、アルファベット順に呼び出されます。

インストール時に (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);

注意: モジュールの重みは、すべてのモジュールフック実装が他のすべてのモジュールに対して呼び出される順序に影響します!

単一のフック実装の呼び出し順序に影響を与える方法を知らないため、単一のフック実装を特別な順序で実行する必要があり、他の実装を別の順序で実行する必要がある場合は、最終的に 1 つ以上を作成しました。異なるフック実装で異なる重み設定を可能にするサブモジュール。

于 2009-08-17T23:19:33.583 に答える
1

hook_nodeapi 関数が実行される重みを変更して、すぐにではなく後で実行する方法はありますか?

はい。それはあなたの問題を解決しますか?

于 2009-08-17T11:08:32.250 に答える
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' に対してのみ実行されることにも注意してください。

これに関するもう 1 つの注意点は、値を url_alias テーブルに入れる path_set_alias() を呼び出すことです。drupal_get_path_aliasを呼び出すと、あなたが望むことができると思います。

$path = 'node/'. $node->nid;
$alias = drupal_get_path_alias($path);
于 2009-08-19T11:05:22.360 に答える
0

私も最近この問題に遭遇しましたが、上記の答えはどれもあまり役に立ちませんでした。私はこれを使用することになりました:

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

私はそれが完全なハックであることを認識していますが、それは機能し、ここでは他に何もしませんでした。

于 2011-12-15T02:16:44.767 に答える
0

フックの実装は、モジュールの重みに基づいて実行されます。hook_form_alter()特定のケースでは、フォーム フィールドがまたはで変更されている可能性があるため、重みを変更しても機能しませんでしたhook_form_FORM_ID_alter()

于 2009-12-16T23:07:50.663 に答える