私のカスタムプリプロセス関数は、キャッシュがクリアされるとすぐに機能し、動作を停止します
質問
カスタムテーマ機能を備えたカスタムDrupal 6モジュールがあります。次のように、mymodule.module(メインモジュールファイル)にhook_themeを実装しました。
function mymodule_theme() {
return array(
'mymodule_template_regions' => array(
'arguments' => array('template' => array()),
'file' => 'mymodule.theme.inc',
'path' => drupal_get_path('module', 'mymodule') . '/templates',
'template' => 'mymodule-template-regions',
),
);
}
mymodule_mymodule_template_regions()をmymodule.theme.incというファイルに、メインモジュールフォルダーに実装しました。
MyModule-Template-Regions.tpl.phpをメインモジュールフォルダー内のテンプレートサブフォルダーに配置しました。
これはすべて、キャッシュがクリアされたときに正常に機能します。最初のキャッシュがクリアされた後にページが更新されるとすぐに、動作が停止します。
問題の行は、Drupal Coreバージョン6.19のTheme.incのライン696です。
if (function_exists($preprocess_function)) {
call_user_func_array($preprocess_function, $args);
}
キャッシュがクリアされると、mymodule_preprocess_mymodule_template_regions関数が存在するため、「if」ステートメントが真であるために呼び出されます。ただし、後続の各ページリクエストでは、関数は存在しません。これは、何らかの理由でmymodule.theme.incが含まれていないためだと思います。
これは、Drupalの私の知識が崩壊する場所です。私はここで他に何が起こっているのか、そして関数が含まれていない理由を追跡する方法を知らないからです。テーマレジストリはまだmymodule_preprocess_mymodule_template_regionsを認識しているように見えますが、含まれていないために呼ばれていないだけです。
解決
Drupalは、次のファイルを含めることを検討しています。
drupal_get_path('module', 'mymodule') . '/templates' . '/mymodule.theme.inc'
しかし、あなたはそれをメインモジュールフォルダーに入れたと言います。
drupal_get_path('module', 'mymodule') . '/mymodule.theme.inc'
したがって、Drupalは、テーマ関数への後続の呼び出しにファイルを含めることはありません。したがって、あなたはあなたのインクルードを移動したいかもしれません。
これは、hook_themeがどのように処理されるかから見ることができます。 _theme_process_registry