3

4 つのノード タイプが宣言されたモジュールがあります。私の問題は、hook_load、hook_view が呼び出されないことです。drupal_set_message を使用して、特定のフックが呼び出されているかどうかを確認しました。そして、hook_load、hook_view はそうではないことがわかりました。明確な図を示すために、hook_load の構造を次に示します。

更新されたものはこちら

function mymodule_node_info(){
   return array(
      'nodetype1' => array(
         'name' => t('nodetype1'),
         'module' => 'mymodule_nodetype1',
         'description' => t('....'),
         'has_title' => TRUE,
         'title_label' => t('Title'),
         'has_body' => TRUE,
         'body_label' => t('Body'),
     ),
     'nodetype2' => array(
         ......
         'module' => 'mymodule_nodetype2',
         ......
     ),
     'nodetype3' => array(
         ......
         'module' => 'mymodule_nodetype3',
         ......
     ),
     'nodetype4' => array(
         ......
         'module' => 'mymodule_nodetype4',
         .......
     ),
 );

 }

function mymodule_nodetype1_load($node){    
   $result = db_query('SELECT * from {nodetype1table} WHERE vid = %d'
               $node->vid
           );   
   drupal_set_message("hook_load is provoked.","status");
   return db_fetch_object($result);
}

呼ばれない理由がわかりません。私はこのコードベースを drupal module writing book に書き、その指示に従いました。その本のサンプルコードを試してみましたが、問題なく動作します。私のコードだけが機能していません。おそらく、1 つのモジュールに複数のノード タイプがあるためです。どんな助けでも大歓迎です。

4

2 に答える 2

7

hook_load()と がモジュール フックではないため、コードが機能しませんhook_view()。それらはノード フックです。呼び出しは、モジュール名ではなく、コンテンツ タイプ名に基づいています。

そのため、最初に次を使用してコンテンツ タイプを宣言する必要がありますhook_node_info()

function mymodule_node_info() {
  $items = array();

  $items['nodetype1'] = array(
    'name' => t('Node Type 2'),
    'module' => 'mymodule_nodetype1',
    'description' => t("Nodetype 1 description"),
  );
  $items['nodetype2'] = array(
    'name' => t('Node Type 2'),
    'module' => 'mymodule_nodetype2',
    'description' => t("Nodetype 2 description"),
  );
  $items['nodetype3'] = array(
    'name' => t('Node Type 2'),
    'module' => 'mymodule_nodetype3',
    'description' => t("Nodetype 3 description"),
  );

  return $items;
}

hook_node_info()次に、ノード フック用に宣言されたコンテンツ タイプごとに指定したモジュールの名前を使用する必要があります。つまり、、、mymodule_nodetype1_load()などmymodule_nodetype2_view()です。


編集

ノードが表示またはロードされたときに非ノードベースのモジュールを起動しようとしている場合は、次を使用する必要がありますhook_nodeapi()

function mymodule_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
  switch ($op) {
    case 'view':
      mymodule_view_function($node);
      break;
    case 'load':
      mymodule_load_function($node);
      break;
  }
}

mymodule_load_function()mymodule_load_function()を、オブジェクトに作用するように設計された独自のカスタム関数に置き換え$nodeます。


編集 2

実装の構文エラーに加えて、hook_load()提供しているものの外にコードの一部があり、正しい呼び出しを妨げています。次のコードは機能します (nodetype1 ノードを作成すると、「mymodule_nodetype1_load が呼び出されました」というメッセージがノードに表示されます): おそらく、コード全体を比較して、不足しているものを確認できます。

function mymodule_node_info() {
  return array(
    'mymodule_nodetype1' => array(
      'name' => t('nodetype1'),
      'module' => 'mymodule_nodetype1',
      'description' => t('....'),
      'has_title' => TRUE,
      'title_label' => t('Title'),
      'has_body' => TRUE,
      'body_label' => t('Body'),
    ),
    'mymodule_nodetype2' => array(
      'name' => t('nodetype2'),
      'module' => 'mymodule_nodetype2',
      'description' => t('....'),
      'has_title' => TRUE,
      'title_label' => t('Title'),
      'has_body' => TRUE,
      'body_label' => t('Body'),
    ),
  );
}

function mymodule_nodetype1_form(&$node, $form_state) {
  // nodetype1 form elements go here

  return $form;
}

function mymodule_nodetype2_form(&$node, $form_state) {
  // nodetype2 form elements go here

  return $form;
}

function mymodule_nodetype1_load($node) {
  $additions = new stdClass();

  drupal_set_message('mymodule_nodetype1_load invoked');

  return $additions;
}

function mymodule_nodetype2_load($node) {
  $additions = new stdClass();

  drupal_set_message('mymodule_nodetype2_load invoked');

  return $additions;
}

モジュールの変更後に環境をリセットしていない場合は、キャッシュの問題が発生している可能性があります。クリーンな Drupal インストールにリセットできるサンドボックス環境でコードをテストして、以前の不適切なノード実装の古い問題に集中していないことを確認する必要があります。

さらに、hook_nodeapi()モジュールで定義されていないコンテンツ タイプを操作しようとしている場合にのみ使用する必要があります。コンテンツ タイプは、ノード フック ( 、 など) を使用する必要がありhook_load()ますhook_view()

最後に、設計されていない場所で発火することを期待しているため、間違ったフックを使用している可能性があります。上記のすべてを実行した場合は、達成する予定の機能とフックが発生すると予想される場所で投稿を更新してください。

于 2010-08-29T05:45:39.670 に答える
0

コードが機能しない原因を見つけました。古いコードで作成されたテストデータを使用していたためです。私の古いコードでは、hook_node_info 内のノード宣言が同じモジュール値を使用しているため、hook_form 実装を 1 つだけ作成し、「switch」ステートメントを使用して適切なフォームを返すことができました。私の昔のコードをはっきりとお伝えするために-

function mymodule_node_info(){
   return array(
      'nodetype1' => array(
         .....
         'module' => 'mymodule',
         .....
     ),
     'nodetype2' => array(
         ......
         'module' => 'mymodule',
         ......
     ),
         .......

    );

 }
function mymodule_form(&$node, $form_state){
switch($node->type){
    case 'nodetype1':
        return nodetype1_form();
    break;      

    case 'nodetype2':
        return nodetype2_form();
    break;
    .....

}
}

提供された変更を行った後に新しいデータを作成すると、hook_load が呼び出されます。できます!それが根本的な原因であるかどうかを確認するために、何度かテストしました(以前のコードで作成された古いデータでテストし、それらの変更後に作成された新しいデータでテストします)、同じ結果が得られました.drupalストアのform_idまたはモジュールエントリ値データとともにノード宣言を記述し、hook_load 呼び出しを決定します。これがおそらく、このノードのデータであるとは見なされず、hook_load が呼び出されない理由です。

そして、大変お世話になりました。

于 2010-08-30T13:43:17.640 に答える