0

カスタム モジュールでは、特定のコンテンツ タイプの追加フォームを表示する hook_menu でページを定義し、フォームにいくつかの変更を加えたいと考えています。

これまでのところ、機能しており、新しいノードを保存していますが、コードで設定しているデフォルト値のみを使用しています。つまり、ユーザーがフォームに入力したものは何も取得されていません。$form_state['input']入力された値をチェックして含めましたが、含まれて$form_state['values']いないため、新しいノードが間違って保存されます。

関連するコードは次のとおりです。

function mymodule_menu() {
  return array(
    'admin/content/myadd/%' => array(
      'title' => 'my custom add page',
      'page callback' => 'mymodule_node_add',
      'page arguments' => array(3),
      'access callback' => TRUE,
      'type' => MENU_CALLBACK,
    ),
  );
}

function mymodule_node_add() {
  module_load_include('inc', 'node', 'node.pages');

  //I'm doing a print here instead of returning because I'm calling this page
  //in an AJAX popup, so I don't want the whole page to output, only the form.
  print render(drupal_get_form('mymodule_node_add_form'));
}

function mymodule_node_add_form($form, &$form_state) {
  if (!isset($form_state['node']) {
    global $user;
    $node = (object) array(
      'uid' => $user->uid,
      'type' => 'mycontenttype',
      'language' => LANGUAGE_NONE,
    );

    //this is setting a default value
    $node->myfield = array(LANGUAGE_NONE => array(array('value' => arg(3))));

    $form_state['build_info']['args'] = array($node);

    $form = drupal_build_form('mycontenttype_node_form', $form_state);
    $form['actions']['submit']['#submit'][0] = 'mymodule_node_add_form_submit';
    //there's a lot more customization of the form here, like adding fields, etc.
  }

  return $form;
}

function mymodule_node_add_form_submit($form, &$form_state) {
  //here's where $form_state['input'] is correct but $form_state['values'] isn't.

  $node = node_form_submit_build_node($form, $form_state);
  node_save($node);
  $form_state['values']['nid'] = $node->nid;
  $form_state['nid'] = $node->nid;
  $form_state['redirect'] = 'some/other/page';
}

それで、私はここで何か間違ったことをしていますか?フォーム ID が間違っていることを心配する必要がありますか? (私のフォームの ID はmymodule_node_add_formですが、実際のフォームは を出力する可能性がありますmycontenttype_node_form)、これは私に影響しますか?

4

1 に答える 1

0

必要ですhook_form_alter()( api.drupal.orgを参照)。既存のコンテンツ タイプのフォームを使用して、単純に hook_form_alter() で変更してみます。また、最初に、標準の非 AJAX ページとして機能するようにします。そうすれば、dpm() やその他のデバッグ手法のすべての利点を得ることができます。しっかりと理解できたら、AJAX 技術を利用するように変更します。

mymodule_form_alter(&$form, &$form_state, $form_id) {
  // use this with your devel module turned on to verify
  // your $form_id and contents of all forms that load on a given page
  dpm($form);
  // once you verify your $form_id, you can begin accessing your form and altering it
  switch( $form_id ) {
    case 'my_target_form_id' :
      // this part is just pseudocode, I haven't memorized the $form structure, 
      // you can get it from your dpm().
      if( $form['node']->type == 'my_target_content_type' ) {
        $form['actions']['submit']['#submit'][0] = 'mymodule_node_add_form_submit';
      }
      break;
  }
}
于 2013-09-06T23:55:59.630 に答える