web-dev-qa-db-ja.com

custom_module.infoからの「files []」はフォーム送信に含まれていませんか?

Drupal 7(具体的には、 Taxonomy Views Integrator )に移植するモジュールがあり、モジュールの.infoを介してインクルードされた2つのインクルードファイルtvi.admin.incwasが含まれていますファイル:

files[] = includes/tvi.admin.inc

tvi.admin.incには、tvi.modulehook_form_alter()が使用する関数が格納されており、validationsubmit functions

hook_form_alter()を使用して行われた変更は正しく機能しますが、submitの後のtvi.admin.incの検証および送信関数は使用できず、宣言されていない関数エラーをスローします。

p.s.

http://drupal.org/node/224333#registry を介して拡張.infoモジュールレジストリの最初の問題を確認しましたが、次のように記載されていますかもしれません回答を提供します:

関数のみを含むファイルは、.infoファイルにリストする必要はありません。

回避策として、

module_load_include()を使用して、tvi.admin.inctvi.moduleの先頭にロードします。これには、フォーム送信時に、incが含まれているため、検証/送信関数が含まれます。

6
electblake

。infoファイルにリストされているファイルは、モジュールのロード時に自動的には含まれません。 PHPが見つからないクラスのオブジェクトをモジュールが作成しようとしたときにロードされます。その場合、 spl_autoload_register() で登録されたコールバックは、 Drupalレジストリの内容により、オブジェクトの作成を可能にするためにロードする必要があるファイルが見つかります。

関数を含むファイルをロードする唯一の方法は、module_load_include()を使用することです。
特定の場合、ロードする関数は、hook_form_alter()(またはhook_form_FORM_ID_alter())で変更されたフォームに追加されるフォーム検証ハンドラー(またはフォーム送信ハンドラー)です。 、フォームハンドラーをフックの実装を含む同じファイルに保持したい。フォームハンドラーはフォームが送信された後に使用されるため、技術的には、ファイルは必要のないときにhook_form_alter()によってロードされます。これまでのところコードは機能しましたが、Drupalの将来のバージョンでは機能しないとは言われていません。

Drupal 7では、モジュールが hook_hook_info() を実装できるようになっています。これは、Drupalから使用され、フック実装が定義されているファイルを認識します。Systemモジュールは独自の実装を定義します。次のコードが含まれています:

function system_hook_info() {
  $hooks['token_info'] = array(
    'group' => 'tokens',
  );
  $hooks['token_info_alter'] = array(
    'group' => 'tokens',
  );
  $hooks['tokens'] = array(
    'group' => 'tokens',
  );
  $hooks['tokens_alter'] = array(
    'group' => 'tokens',
  );

  return $hooks;
}

このフックの実装では、Drupalがモジュールcustom.moduleのhook_tokens()の実装を含むファイルを探しているとき、ファイルcustom.tokensを探します。モジュールcustom.moduleがインストールされているディレクトリに含まれるinc。
サードパーティモジュールは独自のhook_hook_info()を実装できますが、Drupalが他のモジュールによって実装されているフックも探す場所を変更していることを忘れないでください。つまり、hook_token_alter()のグループを変更すると、ファイルが変更され、Drupalはhook_token_alter()の実装を探します。

hook_hook_info()を使用して、次のような実装を使用して、モジュールファイルとは異なるファイルにいくつかのフックを保持することができます。

function custom_hook_info() {
  return array(
    'form_alter' => array(
      'group' => 'form',
    ),
  );
}

以前に報告したことはまだ有効です。 Drupalの将来のバージョンでは、hook_form_alter()の実装の場所がわかっていても、フォームハンドラの場所が見つからないため、機能しなくなる可能性があります。
これが、hook_form_alter()(またはhook_form_FORM_ID_alter())の実装と関連するすべてのフォームハンドラーをモジュールファイルに配置し続ける理由です。

16
kiamlaluno

クラスのみが追跡され、自動的に含まれます。それ以外はすべて手動で含める必要があります。

また、私はあなたがここで何をしているのか本当にわかりません、あなた自身のフォームを変更する必要はありません。次に、_submit()/ _ validate()コールバックは、フォーム関数自体と同じファイルにある必要があります。手動で含める必要はありません。

2
Berdir