diff --git a/core/includes/form.inc b/core/includes/form.inc index 5c67dfff02c8..838a156d53cb 100644 --- a/core/includes/form.inc +++ b/core/includes/form.inc @@ -41,55 +41,6 @@ function form_set_cache($form_build_id, $form, FormStateInterface $form_state) { \Drupal::formBuilder()->setCache($form_build_id, $form, $form_state); } -/** - * Ensures an include file is loaded whenever the form is processed. - * - * Example: - * @code - * // Load node.admin.inc from Node module. - * form_load_include($form_state, 'inc', 'node', 'node.admin'); - * @endcode - * - * Use this function instead of module_load_include() from inside a form - * constructor or any form processing logic as it ensures that the include file - * is loaded whenever the form is processed. In contrast to using - * module_load_include() directly, form_load_include() makes sure the include - * file is correctly loaded also if the form is cached. - * - * @param $form_state - * The current state of the form. - * @param $type - * The include file's type (file extension). - * @param $module - * The module to which the include file belongs. - * @param $name - * (optional) The base file name (without the $type extension). If omitted, - * $module is used; i.e., resulting in "$module.$type" by default. - * - * @return - * The filepath of the loaded include file, or FALSE if the include file was - * not found or has been loaded already. - * - * @see module_load_include() - */ -function form_load_include(FormStateInterface $form_state, $type, $module, $name = NULL) { - if (!isset($name)) { - $name = $module; - } - if (!isset($form_state['build_info']['files']["$module:$name.$type"])) { - // Only add successfully included files to the form state. - if ($result = module_load_include($type, $module, $name)) { - $form_state['build_info']['files']["$module:$name.$type"] = array( - 'type' => $type, - 'module' => $module, - 'name' => $name, - ); - return $result; - } - } - return FALSE; -} - /** * Retrieves, populates, and processes a form. * diff --git a/core/lib/Drupal/Core/Form/FormCache.php b/core/lib/Drupal/Core/Form/FormCache.php index d62782821ad6..9ba893de278a 100644 --- a/core/lib/Drupal/Core/Form/FormCache.php +++ b/core/lib/Drupal/Core/Form/FormCache.php @@ -94,7 +94,7 @@ class FormCache implements FormCacheInterface { $form_state->setFormState($stored_form_state); // If the original form is contained in include files, load the files. - // @see form_load_include() + // @see \Drupal\Core\Form\FormStateInterface::loadInclude() $form_state['build_info'] += array('files' => array()); foreach ($form_state['build_info']['files'] as $file) { if (is_array($file)) { diff --git a/core/lib/Drupal/Core/Form/FormState.php b/core/lib/Drupal/Core/Form/FormState.php index d4c29e2e9e93..5bed64a8070d 100644 --- a/core/lib/Drupal/Core/Form/FormState.php +++ b/core/lib/Drupal/Core/Form/FormState.php @@ -61,7 +61,7 @@ class FormState implements FormStateInterface, \ArrayAccess { * 'name' as needed by module_load_include(). The files listed here are * automatically loaded by form_get_cache(). By default the current menu * router item's 'file' definition is added, if any. Use - * form_load_include() to add include files from a form constructor. + * self::loadInclude() to add include files from a form constructor. * - form_id: Identification of the primary form being constructed and * processed. * - base_form_id: Identification for a base form, as declared in the form @@ -429,6 +429,29 @@ class FormState implements FormStateInterface, \ArrayAccess { return $this; } + /** + * {@inheritdoc} + */ + public function loadInclude($module, $type, $name = NULL) { + if (!isset($name)) { + $name = $module; + } + $build_info = $this->get('build_info'); + if (!isset($build_info['files']["$module:$name.$type"])) { + // Only add successfully included files to the form state. + if ($result = $this->moduleLoadInclude($module, $type, $name)) { + $build_info['files']["$module:$name.$type"] = array( + 'type' => $type, + 'module' => $module, + 'name' => $name, + ); + $this->set('build_info', $build_info); + return $result; + } + } + return FALSE; + } + /** * {@inheritdoc} */ @@ -824,4 +847,11 @@ class FormState implements FormStateInterface, \ArrayAccess { return drupal_set_message($message, $type, $repeat); } + /** + * Wraps ModuleHandler::loadInclude(). + */ + protected function moduleLoadInclude($module, $type, $name = NULL) { + return \Drupal::moduleHandler()->loadInclude($module, $type, $name); + } + } diff --git a/core/lib/Drupal/Core/Form/FormStateInterface.php b/core/lib/Drupal/Core/Form/FormStateInterface.php index a154f3b3f183..53511330e11d 100644 --- a/core/lib/Drupal/Core/Form/FormStateInterface.php +++ b/core/lib/Drupal/Core/Form/FormStateInterface.php @@ -46,6 +46,37 @@ interface FormStateInterface { */ public function setCompleteForm(array &$complete_form); + /** + * Ensures an include file is loaded whenever the form is processed. + * + * Example: + * @code + * // Load node.admin.inc from Node module. + * $form_state->loadInclude('inc', 'node', 'node.admin'); + * @endcode + * + * Use this function instead of module_load_include() from inside a form + * constructor or any form processing logic as it ensures that the include file + * is loaded whenever the form is processed. In contrast to using + * module_load_include() directly, this method makes sure the include file is + * correctly loaded also if the form is cached. + * + * @param string $module + * The module to which the include file belongs. + * @param string $type + * The include file's type (file extension). + * @param string|null $name + * (optional) The base file name (without the $type extension). If omitted, + * $module is used; i.e., resulting in "$module.$type" by default. + * + * @return string|false + * The filepath of the loaded include file, or FALSE if the include file was + * not found or has been loaded already. + * + * @see module_load_include() + */ + public function loadInclude($module, $type, $name = NULL); + /** * Returns an array representation of the cacheable portion of the form state. * diff --git a/core/modules/ckeditor/src/Plugin/CKEditorPlugin/DrupalImage.php b/core/modules/ckeditor/src/Plugin/CKEditorPlugin/DrupalImage.php index 23f9c1c86098..e6e54b810861 100644 --- a/core/modules/ckeditor/src/Plugin/CKEditorPlugin/DrupalImage.php +++ b/core/modules/ckeditor/src/Plugin/CKEditorPlugin/DrupalImage.php @@ -68,7 +68,7 @@ class DrupalImage extends CKEditorPluginBase implements CKEditorPluginConfigurab * @see editor_image_upload_settings_form() */ public function settingsForm(array $form, FormStateInterface $form_state, Editor $editor) { - form_load_include($form_state, 'inc', 'editor', 'editor.admin'); + $form_state->loadInclude('editor', 'admin.inc'); $form['image_upload'] = editor_image_upload_settings_form($editor); $form['image_upload']['#attached']['library'][] = 'ckeditor/drupal.ckeditor.drupalimage.admin'; $form['image_upload']['#element_validate'][] = array($this, 'validateImageUploadSettings'); diff --git a/core/modules/views_ui/src/ViewEditForm.php b/core/modules/views_ui/src/ViewEditForm.php index 1c9522eaf1ca..fd669c41b49b 100644 --- a/core/modules/views_ui/src/ViewEditForm.php +++ b/core/modules/views_ui/src/ViewEditForm.php @@ -89,7 +89,7 @@ class ViewEditForm extends ViewFormBase { // - Change $form_state['view'] to $form_state['temporary']['view']. // - Add a #process function to initialize $form_state['temporary']['view'] // on cached form submissions. - // - Use form_load_include(). + // - Use \Drupal\Core\Form\FormStateInterface::loadInclude(). $form_state['no_cache'] = TRUE; if ($display_id) { diff --git a/core/modules/views_ui/src/ViewFormBase.php b/core/modules/views_ui/src/ViewFormBase.php index e9841b78d7d4..9544040eff35 100644 --- a/core/modules/views_ui/src/ViewFormBase.php +++ b/core/modules/views_ui/src/ViewFormBase.php @@ -35,7 +35,7 @@ abstract class ViewFormBase extends EntityForm { } // @todo Remove the need for this. - form_load_include($form_state, 'inc', 'views_ui', 'admin'); + $form_state->loadInclude('views_ui', 'inc', 'admin'); $form_state->set('view', $this->entity); } diff --git a/core/tests/Drupal/Tests/Core/Form/FormStateTest.php b/core/tests/Drupal/Tests/Core/Form/FormStateTest.php index 3f391dd65a55..0697b2da79e3 100644 --- a/core/tests/Drupal/Tests/Core/Form/FormStateTest.php +++ b/core/tests/Drupal/Tests/Core/Form/FormStateTest.php @@ -348,6 +348,79 @@ class FormStateTest extends UnitTestCase { return $data; } + /** + * @covers ::loadInclude + */ + public function testLoadInclude() { + $type = 'some_type'; + $module = 'some_module'; + $name = 'some_name'; + $form_state = $this->getMockBuilder('Drupal\Core\Form\FormState') + ->setMethods(array('moduleLoadInclude')) + ->getMock(); + $form_state->expects($this->once()) + ->method('moduleLoadInclude') + ->with($module, $type, $name) + ->willReturn(TRUE); + $this->assertTrue($form_state->loadInclude($module, $type, $name)); + } + + /** + * @covers ::loadInclude + */ + public function testLoadIncludeNoName() { + $type = 'some_type'; + $module = 'some_module'; + $form_state = $this->getMockBuilder('Drupal\Core\Form\FormState') + ->setMethods(array('moduleLoadInclude')) + ->getMock(); + $form_state->expects($this->once()) + ->method('moduleLoadInclude') + ->with($module, $type, $module) + ->willReturn(TRUE); + $this->assertTrue($form_state->loadInclude($module, $type)); + } + + /** + * @covers ::loadInclude + */ + public function testLoadIncludeNotFound() { + $type = 'some_type'; + $module = 'some_module'; + $form_state = $this->getMockBuilder('Drupal\Core\Form\FormState') + ->setMethods(array('moduleLoadInclude')) + ->getMock(); + $form_state->expects($this->once()) + ->method('moduleLoadInclude') + ->with($module, $type, $module) + ->willReturn(FALSE); + $this->assertFalse($form_state->loadInclude($module, $type)); + } + + /** + * @covers ::loadInclude + */ + public function testLoadIncludeAlreadyLoaded() { + $type = 'some_type'; + $module = 'some_module'; + $name = 'some_name'; + $form_state = $this->getMockBuilder('Drupal\Core\Form\FormState') + ->setConstructorArgs([['build_info' => ['files' => [ + 'some_module:some_name.some_type' => [ + 'type' => $type, + 'module' => $module, + 'name' => $name, + ], + ]]]]) + ->setMethods(array('moduleLoadInclude')) + ->getMock(); + + $form_state->expects($this->never()) + ->method('moduleLoadInclude'); + + $this->assertFalse($form_state->loadInclude($module, $type, $name)); + } + } /**