web-dev-qa-db-ja.com

モーダルでWebフォームを表示する

Webフォームをモーダルで表示しようとしています(モーダル内のエラー/検証メッセージを含む)。私はこれに従っています カスタムのアプローチdrupal form これはWebフォームではありません。これがWebフォームでまったく可能かどうか、そしてそれが可能な場合、実行するために考慮する必要がありますか?

私が持っている最初の問題は、例のTeacherContactController.phpからの次のコード行です

$modal_form = $this->formBuilder->getForm('Drupal\tl_session\Form\TeacherForm');

これを自分のコントローラーで使用しようとすると、Webフォームの適切な名前空間+ IDを取得できません。私がdevelで私のウェブフォームをチェックすると、それは言う:

[__CLASS__] => Drupal\webform\Entity\Webform
  [id] => add_news_webform

しかし、「フォーム引数Drupal\webform\Entity\Webform\webform-submission-add_news_webform-form is not a valid form」エラーが発生します。多くのことを試しましたが、成功しませんでした。

どのようにしてformBuilderでwebformを取得できますか(webform固有のajax設定などのように)他に何が不足していますか?

3
theuni

思ったよりずっとシンプル

次の方法でリンクを作成できるよりも、WebフォームにURL /contactがあるとしましょう

<a class="use-ajax" data-dialog-type="modal" href="/contact>Contact US</a>

そのリンクを押すと、フォームがモーダルで開かれ、モーダル内にエラー検証とメッセージが表示されます

私の場合、hook_preprocess_pageファイルに次の.themeも追加する必要がありました

function THEMENAME_preprocess_page(&$vars) {
    //custom logic of when to include the library
    // ....
    $vars['#attached']['library'][] =  'core/drupal.dialog.ajax';  
}

一部の人々はこれは必要ないと報告しましたが、他のいくつかのモジュールがこのライブラリを含んでいると思います...

10
GiorgosK

最終的に私のために機能したformBuilderでWebフォームをロードする唯一の解決策は、Webフォームを埋め込む方法の次の documentation に基づいています。これが私のコードです:

/**
* Callback for opening the modal form to create an article.
*
* @return Drupal\Core\Ajax\AjaxResponse
*   A responseObject for Ajax.
*/
public function addArticle() {
  // Get the currently logged in user account.
  $user = $this->currentUser();
  if ($user->hasPermission('create article content')) {
    $response = new AjaxResponse();
    // Load the webform as indicated here:
    // https://www.drupal.org/docs/8/modules/webform/webform-cookbook/how-to-embed-a-webform
    $output['add_form'] = [
      '#type' => 'webform',
      '#webform' => 'add_news_webform',
    ];
    // Add a modal dialog command to the $response object.
    $response->addCommand(new OpenModalDialogCommand(t('Create Article'), $output, ['width' => '500']));
    return $response;
  }
}
2
theuni