web-dev-qa-db-ja.com

キャッシュがクリアされるとすぐにカスタム前処理関数が機能し、機能しなくなります

カスタム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.theme.incというファイルにmymodule_preprocess_mymodule_template_regions()を実装しました。

メインモジュールフォルダー内のテンプレートサブフォルダーにmymodule-template-regions.tpl.phpを配置しました。

キャッシュがクリアされると、これはすべて正常に機能します。最初のキャッシュがクリアされた後、ページが更新されるとすぐに、ページは機能しなくなります。

問題のある行は、Drupal Core version 6.19のtheme.incの696行目で、次のように記述されています。


if (function_exists($preprocess_function)) {
  call_user_func_array($preprocess_function, $args);
}

キャッシュがクリアされると、mymodule_preprocess_mymodule_template_regions関数が存在するため、ifステートメントがTRUEになるため、この関数が呼び出されます。ただし、後続の各ページ要求では、関数は存在しません。これは、何らかの理由でmymodule.theme.incが含まれていないためだと思います。

ここで私がDrupalに関する私の知識が壊れるのは、ここで他に何が起こっているのか、そして関数が含まれていない理由を追跡する方法を知らないからです。テーマレジストリのように見えますはまだmymodule_preprocess_mymodule_template_regionsを認識していますが、含まれていないため、呼び出されていません。

1
Chris Cohen

Drupalは次のファイルを含めることを検討しています:

drupal_get_path('module', 'mymodule') . '/templates' . '/mymodule.theme.inc'

しかし、あなたはそれをメインモジュールフォルダー、ここに置いたと言います:

drupal_get_path('module', 'mymodule') . '/mymodule.theme.inc'

したがって、Drupalは、theme関数への後続の呼び出しでファイルをインクルードしません。そのため、インクルードを移動することができます。

これは、hook_themeの処理方法から確認できます。 _ theme_process_registry

2
Steven Jones