web-dev-qa-db-ja.com

単純なAJAXフォーム送信ボタンのクリック時に呼び出されるコールバック

AJAXコールバックを起動しようとしています。これはとても簡単なことですが、DrupalのフォームをデバッグしようとしていますAJAX APIが駆動しています私の頭がおかしいです。この時点で、見直すために新しい目が必要です。現在、ボタンを押すと、ページが更新され、AJAXコールバックが呼び出されることはありません。次のコードでビルドされているフォーム:

class OnlineRevenueForm extends FormBase {
  public function buildForm(array $form, FormStateInterface $form_state) {
    $form['resetbutton'] = array(
        '#type' => 'submit',
        '#value' => $this->t('Submit'),
        '#prefix' => '<div class="buttons">',
        '#suffix' => '</div>',
        '#ajax' => array(
            'callback' => 'Drupal\revenue_projection_model\Controller\RPMController::ResetFields',
            'event' => 'click',
            'progress' => array(
                'type' => 'throbber',
                'message' => NULL,
            ),
        )
    );
    return $form;
  }

  public function submitForm(array &$form, FormStateInterface $form_state) {
    $form_state->setRebuild(FALSE);
  }
}

コントローラ内で、次のコードを使用してこのフォームをロードします。

class RPMController extends ControllerBase implements ContainerInjectionInterface {
 public function rpm() {
    // Load the module's template file
    $TemplateFilePath = drupal_get_path('module', 'revenue_projection_model') . "/templates/revenue_projection_model.html.twig";
    $template = $this->twig->loadTemplate($TemplateFilePath);
    //Load Forms
    $OnlineRevForm = \Drupal::formBuilder()->getForm('Drupal\revenue_projection_model\Form\OnlineRevenueForm');
        $markup = [
         '#type' => 'inline_template',
         '#template' => $template->render(
            ['online_rev_form' => $OnlineRevForm]
         )
        ];
   return $markup;
 }

次に、このフォームはtwigテンプレートファイルを介して表示されます。私が呼び出そうとしているコールバックもコントローラーの内部にあります。

public static function ResetFields(array &$form, FormStateInterface $form_state) {
     $ajax_response = new AjaxResponse();
     $ajax_response -> addCommand(new AlertCommand("Testing"));
     return $ajax_response;
}

pdate 1:コントローラーでフォームが返される方法を更新しました。現在はレンダリングされていないフォームとしてレンダー配列に返されます。

public function rpm() {
  $OnlineRevForm = \Drupal::formBuilder()->getForm('Drupal\revenue_projection_model\Form\OnlineRevenueForm');
  return [
        '#theme' => 'rpm_page',
        '#online_rev_form' => $OnlineRevForm
  ];
}

また、このコードを.moduleファイルに追加しました。

function revenue_projection_model_theme() {
  $theme['rpm_page'] = [
    'variables' => ['online_rev_form' => NULL],
    'template' => 'revenue_projection_model',
  ];

  return $theme;
}
1
iWig

また、送信機能も必要です。

ご覧になれます こちら 。これは、送信ハンドラとコールバックを備えた完全な例です。この場合、フォームを作成していないので変更しましたが、非常によく似ています。また、本当に素晴らしい投稿は here です

1
Ismini