Created
March 10, 2017 16:07
-
-
Save edwardchan/2c2d4f8b340f1425a4902c05afa7ecc6 to your computer and use it in GitHub Desktop.
Drupal 8 Modal Form Example
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Modal Form Example | |
type: module | |
description: 'Modal Form Example module' | |
package: Example | |
version: VERSION | |
core: 8.x |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
modal_form_example.form: | |
path: '/admin/config/example_form' | |
defaults: | |
_form: 'Drupal\modal_form_example\Form\ExampleForm' | |
_title: 'Example Form' | |
requirements: | |
_permission: 'administer site configuration' | |
modal_form_example.open_modal_form: | |
path: '/admin/config/modal_form' | |
defaults: | |
_title: 'Modal Form' | |
_controller: '\Drupal\modal_form_example\Controller\ModalFormExampleController::openModalForm' | |
requirements: | |
_permission: 'administer site configuration' | |
options: | |
_admin_route: TRUE |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace Drupal\modal_form_example\Controller; | |
use Symfony\Component\DependencyInjection\ContainerInterface; | |
use Drupal\Core\Ajax\AjaxResponse; | |
use Drupal\Core\Ajax\OpenModalDialogCommand; | |
use Drupal\Core\Controller\ControllerBase; | |
use Drupal\Core\Form\FormBuilder; | |
/** | |
* ModalFormExampleController class. | |
*/ | |
class ModalFormExampleController extends ControllerBase { | |
/** | |
* The form builder. | |
* | |
* @var \Drupal\Core\Form\FormBuilder | |
*/ | |
protected $formBuilder; | |
/** | |
* The ModalFormExampleController constructor. | |
* | |
* @param \Drupal\Core\Form\FormBuilder $formBuilder | |
* The form builder. | |
*/ | |
public function __construct(FormBuilder $formBuilder) { | |
$this->formBuilder = $formBuilder; | |
} | |
/** | |
* {@inheritdoc} | |
* | |
* @param \Symfony\Component\DependencyInjection\ContainerInterface $container | |
* The Drupal service container. | |
* | |
* @return static | |
*/ | |
public static function create(ContainerInterface $container) { | |
return new static( | |
$container->get('form_builder') | |
); | |
} | |
/** | |
* Callback for opening the modal form. | |
*/ | |
public function openModalForm() { | |
$response = new AjaxResponse(); | |
// Get the modal form using the form builder. | |
$modal_form = $this->formBuilder->getForm('Drupal\modal_form_example\Form\ModalForm'); | |
// Add an AJAX command to open a modal dialog with the form as the content. | |
$response->addCommand(new OpenModalDialogCommand('My Modal Form', $modal_form, ['width' => '800'])); | |
return $response; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace Drupal\modal_form_example\Form; | |
use Drupal\Core\Form\FormBase; | |
use Drupal\Core\Form\FormStateInterface; | |
use Drupal\Core\Url; | |
/** | |
* ExampleForm class. | |
*/ | |
class ExampleForm extends FormBase { | |
/** | |
* {@inheritdoc} | |
*/ | |
public function buildForm(array $form, FormStateInterface $form_state, $options = NULL) { | |
$form['open_modal'] = [ | |
'#type' => 'link', | |
'#title' => $this->t('Open Modal'), | |
'#url' => Url::fromRoute('modal_form_example.open_modal_form'), | |
'#attributes' => [ | |
'class' => [ | |
'use-ajax', | |
'button', | |
], | |
], | |
]; | |
// Attach the library for pop-up dialogs/modals. | |
$form['#attached']['library'][] = 'core/drupal.dialog.ajax'; | |
return $form; | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function submitForm(array &$form, FormStateInterface $form_state) {} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function getFormId() { | |
return 'modal_form_example_form'; | |
} | |
/** | |
* Gets the configuration names that will be editable. | |
* | |
* @return array | |
* An array of configuration object names that are editable if called in | |
* conjunction with the trait's config() method. | |
*/ | |
protected function getEditableConfigNames() { | |
return ['config.modal_form_example_form']; | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace Drupal\modal_form_example\Form; | |
use Drupal\Core\Form\FormBase; | |
use Drupal\Core\Form\FormStateInterface; | |
use Drupal\Core\Ajax\AjaxResponse; | |
use Drupal\Core\Ajax\OpenModalDialogCommand; | |
use Drupal\Core\Ajax\HtmlCommand; | |
use Drupal\Core\Ajax\ReplaceCommand; | |
/** | |
* SendToDestinationsForm class. | |
*/ | |
class ModalForm extends FormBase { | |
/** | |
* {@inheritdoc} | |
*/ | |
public function getFormId() { | |
return 'modal_form_example_modal_form'; | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function buildForm(array $form, FormStateInterface $form_state, $options = NULL) { | |
$form['#prefix'] = '<div id="modal_example_form">'; | |
$form['#suffix'] = '</div>'; | |
// The status messages that will contain any form errors. | |
$form['status_messages'] = [ | |
'#type' => 'status_messages', | |
'#weight' => -10, | |
]; | |
// A required checkboxes field. | |
$form['select'] = [ | |
'#type' => 'checkboxes', | |
'#title' => $this->t('Select Destination(s)'), | |
'#options' => ['random_value' => 'Some random value'], | |
'#required' => TRUE, | |
]; | |
$form['actions'] = array('#type' => 'actions'); | |
$form['actions']['send'] = [ | |
'#type' => 'submit', | |
'#value' => $this->t('Submit modal form'), | |
'#attributes' => [ | |
'class' => [ | |
'use-ajax', | |
], | |
], | |
'#ajax' => [ | |
'callback' => [$this, 'submitModalFormAjax'], | |
'event' => 'click', | |
], | |
]; | |
$form['#attached']['library'][] = 'core/drupal.dialog.ajax'; | |
return $form; | |
} | |
/** | |
* AJAX callback handler that displays any errors or a success message. | |
*/ | |
public function submitModalFormAjax(array $form, FormStateInterface $form_state) { | |
$response = new AjaxResponse(); | |
// If there are any form errors, AJAX replace the form. | |
if ($form_state->hasAnyErrors()) { | |
$response->addCommand(new ReplaceCommand('#modal_example_form', $form)); | |
} | |
else { | |
$response->addCommand(new OpenModalDialogCommand("Success!", 'The modal form has been submitted.', ['width' => 700])); | |
} | |
return $response; | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function validateForm(array &$form, FormStateInterface $form_state) {} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function submitForm(array &$form, FormStateInterface $form_state) {} | |
/** | |
* Gets the configuration names that will be editable. | |
* | |
* @return array | |
* An array of configuration object names that are editable if called in | |
* conjunction with the trait's config() method. | |
*/ | |
protected function getEditableConfigNames() { | |
return ['config.modal_form_example_modal_form']; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment