/** * {@inheritdoc} */ public function buildForm(array $form, FormStateInterface $form_state) { if ($form_state->isRebuilding()) { $form_state->setUserInput(array()); } // Initialize $storage = $form_state->getStorage(); if (empty($storage)) { $user_input = $form_state->getUserInput(); if (empty($user_input)) { $_SESSION['constructions'] = 0; } // Put the initial thing into the storage $storage = ['thing' => ['title' => 'none', 'value' => '']]; $form_state->setStorage($storage); } // Count how often the form is constructed. $_SESSION['constructions']++; drupal_set_message("Form constructions: " . $_SESSION['constructions']); $form['title'] = array('#type' => 'textfield', '#title' => 'Title', '#default_value' => $storage['thing']['title'], '#required' => TRUE); $form['value'] = array('#type' => 'textfield', '#title' => 'Value', '#default_value' => $storage['thing']['value'], '#element_validate' => array('::elementValidateValueCached')); $form['continue_button'] = array('#type' => 'button', '#value' => 'Reset'); $form['continue_submit'] = array('#type' => 'submit', '#value' => 'Continue submit', '#submit' => array('::continueSubmitForm')); $form['submit'] = array('#type' => 'submit', '#value' => 'Save'); if (\Drupal::request()->get('cache')) { // Manually activate caching, so we can test that the storage keeps working // when it's enabled. $form_state->setCached(); } if ($this->getRequest()->get('immutable')) { $form_state->addBuildInfo('immutable', TRUE); } return $form; }
/** * {@inheritdoc} */ public function buildForm(array $form, FormStateInterface $form_state) { if ($form_state->isRebuilding()) { $form_state->setUserInput(array()); } // Initialize $storage = $form_state->getStorage(); if (empty($storage)) { $user_input = $form_state->getUserInput(); if (empty($user_input)) { $_SESSION['constructions'] = 0; } // Put the initial thing into the storage $storage = ['thing' => ['title' => 'none', 'value' => '']]; $form_state->setStorage($storage); } // Count how often the form is constructed. $_SESSION['constructions']++; drupal_set_message("Form constructions: " . $_SESSION['constructions']); $form['title'] = array('#type' => 'textfield', '#title' => 'Title', '#default_value' => $storage['thing']['title'], '#required' => TRUE); $form['value'] = array('#type' => 'textfield', '#title' => 'Value', '#default_value' => $storage['thing']['value'], '#element_validate' => array('::elementValidateValueCached')); $form['continue_button'] = array('#type' => 'button', '#value' => 'Reset'); $form['continue_submit'] = array('#type' => 'submit', '#value' => 'Continue submit', '#submit' => array('::continueSubmitForm')); $form['submit'] = array('#type' => 'submit', '#value' => 'Save'); // @todo Remove this in https://www.drupal.org/node/2524408, because form // cache immutability is no longer necessary, because we no longer cache // forms during safe HTTP methods. In the meantime, because // Drupal\system\Tests\Form still has test coverage for a poisoned form // cache following a GET request, trick $form_state into caching the form // to keep that test working until we either remove it or change it in // that issue. if ($this->getRequest()->get('immutable')) { $form_state->addBuildInfo('immutable', TRUE); if ($this->getRequest()->get('cache') && $this->getRequest()->isMethodSafe()) { $form_state->setRequestMethod('FAKE'); $form_state->setCached(); } } return $form; }
/** * @param $form_state */ protected function automaticStartSubmit(FormStateInterface &$form_state) { $config = $this->config('acquia_connector.settings'); $storage = $form_state->getStorage(); if (empty($storage['response']['subscription'])) { drupal_set_message($this->t('No subscriptions were found for your account.'), 'error'); } elseif (count($storage['response']['subscription']) > 1) { // Multistep form for choosing from available subscriptions. $storage['choose'] = TRUE; // Force rebuild with next step. $form_state->setRebuild(TRUE); $form_state->setStorage($storage); } else { // One subscription so set id/key pair. $sub = $storage['response']['subscription'][0]; $config->set('key', $sub['key'])->set('identifier', $sub['identifier'])->set('subscription_name', $sub['name'])->save(); } }
/** * {@inheritdoc} */ public function buildForm(array $form, FormStateInterface $form_state) { // Honeypot Configuration. $form['configuration'] = ['#type' => 'fieldset', '#title' => t('Honeypot Configuration'), '#collapsible' => TRUE, '#collapsed' => FALSE]; $form['configuration']['protect_all_forms'] = ['#type' => 'checkbox', '#title' => t('Protect all forms with Honeypot'), '#description' => t('Enable Honeypot protection for ALL forms on this site (it is best to only enable Honeypot for the forms you need below).'), '#default_value' => $this->config('honeypot.settings')->get('protect_all_forms')]; $form['configuration']['protect_all_forms']['#description'] .= '<br />' . t('<strong>Page caching will be disabled on any page where a form is present if the Honeypot time limit is not set to 0.</strong>'); $form['configuration']['log'] = ['#type' => 'checkbox', '#title' => t('Log blocked form submissions'), '#description' => t('Log submissions that are blocked due to Honeypot protection.'), '#default_value' => $this->config('honeypot.settings')->get('log')]; $form['configuration']['element_name'] = ['#type' => 'textfield', '#title' => t('Honeypot element name'), '#description' => t("The name of the Honeypot form field. It's usually most effective to use a generic name like email, homepage, or link, but this should be changed if it interferes with fields that are already in your forms. Must not contain spaces or special characters."), '#default_value' => $this->config('honeypot.settings')->get('element_name'), '#required' => TRUE, '#size' => 30]; $form['configuration']['time_limit'] = ['#type' => 'textfield', '#title' => t('Honeypot time limit'), '#description' => t('Minimum time required before form should be considered entered by a human instead of a bot. Set to 0 to disable.'), '#default_value' => $this->config('honeypot.settings')->get('time_limit'), '#required' => TRUE, '#size' => 5, '#field_suffix' => t('seconds')]; $form['configuration']['time_limit']['#description'] .= '<br />' . t('<strong>Page caching will be disabled if there is a form protected by time limit on the page.</strong>'); // Honeypot Enabled forms. $form_settings = $this->config('honeypot.settings')->get('form_settings'); $form['form_settings'] = ['#type' => 'fieldset', '#title' => t('Honeypot Enabled Forms'), '#description' => t("Check the boxes next to individual forms on which you'd like Honeypot protection enabled."), '#collapsible' => TRUE, '#collapsed' => FALSE, '#tree' => TRUE, '#states' => ['invisible' => ['input[name="protect_all_forms"]' => ['checked' => TRUE]]]]; // Generic forms. $form['form_settings']['general_forms'] = ['#markup' => '<h5>' . t('General Forms') . '</h5>']; // User register form. $form['form_settings']['user_register_form'] = ['#type' => 'checkbox', '#title' => t('User Registration form'), '#default_value' => $this->getFormSettingsValue($form_settings, 'user_register_form')]; // User password form. $form['form_settings']['user_pass'] = ['#type' => 'checkbox', '#title' => t('User Password Reset form'), '#default_value' => $this->getFormSettingsValue($form_settings, 'user_pass')]; // If webform.module enabled, add webforms. // TODO D8 - See if D8 version of Webform.module still uses this form ID. if (\Drupal::moduleHandler()->moduleExists('webform')) { $form['form_settings']['webforms'] = ['#type' => 'checkbox', '#title' => t('Webforms (all)'), '#default_value' => $this->getFormSettingsValue($form_settings, 'webforms')]; } // If contact.module enabled, add contact forms. if (\Drupal::moduleHandler()->moduleExists('contact')) { $form['form_settings']['contact_forms'] = ['#markup' => '<h5>' . t('Contact Forms') . '</h5>']; $bundles = \Drupal::entityManager()->getBundleInfo('contact_message'); $formController = \Drupal::entityManager()->getFormObject('contact_message', 'default'); foreach ($bundles as $bundle_key => $bundle) { $stub = entity_create('contact_message', ['contact_form' => $bundle_key]); $formController->setEntity($stub); $form_id = $formController->getFormId(); $form['form_settings'][$form_id] = ['#type' => 'checkbox', '#title' => SafeMarkup::checkPlain($bundle['label']), '#default_value' => $this->getFormSettingsValue($form_settings, $form_id)]; } } // Node types for node forms. if (\Drupal::moduleHandler()->moduleExists('node')) { $types = NodeType::loadMultiple(); if (!empty($types)) { // Node forms. $form['form_settings']['node_forms'] = ['#markup' => '<h5>' . t('Node Forms') . '</h5>']; foreach ($types as $type) { $id = $type->getEntityTypeId() . '_node_form'; $form['form_settings'][$id] = ['#type' => 'checkbox', '#title' => t('@name node form', ['@name' => $type->label()]), '#default_value' => $this->getFormSettingsValue($form_settings, $id)]; } } } // Comment types for comment forms. if (\Drupal::moduleHandler()->moduleExists('comment')) { $types = CommentType::loadMultiple(); if (!empty($types)) { $form['form_settings']['comment_forms'] = ['#markup' => '<h5>' . t('Comment Forms') . '</h5>']; foreach ($types as $type) { $id = 'comment_' . $type->id() . '_form'; $form['form_settings'][$id] = ['#type' => 'checkbox', '#title' => t('@name comment form', ['@name' => $type->label()]), '#default_value' => $this->getFormSettingsValue($form_settings, $id)]; } } } // Store the keys we want to save in configuration when form is submitted. $keys_to_save = array_keys($form['configuration']); foreach ($keys_to_save as $key => $key_to_save) { if (strpos($key_to_save, '#') !== FALSE) { unset($keys_to_save[$key]); } } $form_state->setStorage(['keys' => $keys_to_save]); // For now, manually add submit button. Hopefully, by the time D8 is // released, there will be something like system_settings_form() in D7. $form['actions']['#type'] = 'container'; $form['actions']['submit'] = ['#type' => 'submit', '#value' => t('Save configuration')]; return $form; }
/** * Build the form gathering database credential and file location information. * * @param array $form * An associative array containing the structure of the form. * @param \Drupal\Core\Form\FormStateInterface $form_state * The current state of the form. * * @return array * The form structure. */ public function buildConfirmForm(array $form, FormStateInterface $form_state) { $rollback = $form_state->getValue('upgrade_option') == static::MIGRATE_UPGRADE_ROLLBACK; if ($rollback) { $form_state->setStorage(['upgrade_option' => static::MIGRATE_UPGRADE_ROLLBACK]); } $form['#title'] = $this->getQuestion(); $form['#attributes']['class'][] = 'confirmation'; $form[$this->getFormName()] = ['#type' => 'hidden', '#value' => 1]; if ($rollback) { $form['rollback'] = ['#markup' => $this->t('All previously-imported content, as well as configuration such as field definitions, will be removed.')]; } else { $table_data = []; $system_data = []; foreach ($form_state->get('migration_ids') as $migration_id) { /** @var MigrationInterface $migration */ $migration = Migration::load($migration_id); // Fetch the system data at the first opportunity. if (empty($system_data) && is_a($migration->getSourcePlugin(), '\\Drupal\\migrate_drupal\\Plugin\\migrate\\source\\DrupalSqlBase')) { $system_data = $migration->getSourcePlugin()->getSystemData(); } $template_id = $migration->get('template'); $source_module = $this->moduleUpgradePaths[$template_id]['source_module']; $destination_module = $this->moduleUpgradePaths[$template_id]['destination_module']; $table_data[$source_module][$destination_module][$migration_id] = $migration->label(); } ksort($table_data); foreach ($table_data as $source_module => $destination_module_info) { ksort($table_data[$source_module]); } $unmigrated_source_modules = array_diff_key($system_data['module'], $table_data); // Missing migrations. $desc = "The following items will not be upgraded. " . 'For more information see <a href="https://www.drupal.org/upgrade/migrate"> Upgrading from Drupal 6 or 7 to Drupal 8</a>.'; $form['missing_module_list_title'] = ['#type' => 'item', '#title' => t('Missing upgrade paths'), '#description' => $this->t($desc)]; $form['missing_module_list'] = ['#type' => 'table', '#header' => [$this->t('Source'), $this->t('Destination')]]; $missing_count = 0; ksort($unmigrated_source_modules); foreach ($unmigrated_source_modules as $source_module => $module_data) { if ($module_data['status']) { $missing_count++; $form['missing_module_list'][$source_module] = ['source_module' => ['#plain_text' => $source_module], 'destination_module' => ['#plain_text' => 'Missing']]; } } // Available migrations. $form['available_module_list'] = ['#tree' => TRUE, '#type' => 'details', '#title' => t('Available upgrade paths')]; $form['available_module_list']['module_list'] = ['#type' => 'table', '#header' => [$this->t('Source'), $this->t('Destination')]]; $available_count = 0; foreach ($table_data as $source_module => $destination_module_info) { $available_count++; $destination_details = []; foreach ($destination_module_info as $destination_module => $migration_ids) { $destination_details[$destination_module] = ['#type' => 'item', '#plain_text' => t($destination_module)]; } $form['available_module_list']['module_list'][$source_module] = ['source_module' => ['#plain_text' => $source_module], 'destination_module' => $destination_details]; } $form['counts'] = ['#type' => 'item', '#title' => "<ul><li>" . t($available_count . ' available upgrade paths') . "</li><li>" . t($missing_count . ' missing upgrade paths') . "</li></ul>", '#weight' => -15]; } if ($rollback) { $confirm_text = $this->t('Perform rollback'); } else { $confirm_text = $this->t('Perform upgrade'); } $form['actions'] = ['#type' => 'actions']; $form['actions']['submit'] = ['#type' => 'submit', '#value' => $confirm_text, '#button_type' => 'primary', '#validate' => [], '#submit' => ['::submitConfirmForm']]; $form['actions']['cancel'] = ConfirmFormHelper::buildCancelLink($this, $this->getRequest()); // By default, render the form using theme_confirm_form(). if (!isset($form['#theme'])) { $form['#theme'] = 'confirm_form'; } return $form; }
/** * {@inheritdoc} */ public function buildForm(array $form, FormStateInterface $form_state) { $account = \Drupal::currentUser(); $form = ['#attached' => ['library' => ['webform/webform']]]; $form_state->loadInclude('webform', 'inc', 'includes/webform.components'); $form_state->loadInclude('webform', 'inc', 'includes/webform.submissions'); // For ajax requests, $form_state->getValue('details') is missing. Restore // from storage, if available, for multi-page forms. if (empty($form_state->getValue('details')) && !empty($form_state->getValue(['storage', 'details']))) { $form_state->setValue('details', $form_state->getValue(['storage', 'details'])); } $node = $this->node; $submission = $this->node; $resume_draft = $this->resume_draft; $filter = $this->filter; // If in a multi-step form, a submission ID may be specified in form state. // Load this submission. This allows anonymous users to use auto-save. if (empty($submission) && !empty($form_state->getValue(['details', 'sid']))) { $submission = webform_get_submission($node->id(), $form_state->getValue(['details', 'sid'])); } $finished = isset($submission->is_draft) ? !$submission->is_draft : 0; $submit_button_text = $finished ? $this->t('Save') : (empty($node->webform['submit_text']) ? $this->t('Submit') : $node->webform['submit_text']); // Bind arguments to $form to make them available in theming and form_alter. $form['#node'] = $node; $form['#submission'] = $submission; $form['#filter'] = $filter; // Add a theme function for this form. $form['#theme'] = ['webform_form_' . $node->id(), 'webform_form']; // Add a CSS class for all client forms. $form['#attributes']['class'][] = 'webform-client-form'; $form['#attributes']['class'][] = 'webform-client-form-' . $node->id(); // Set the encoding type (necessary for file uploads). $form['#attributes']['enctype'] = 'multipart/form-data'; // Sometimes when displaying a webform as a teaser or block, a custom action // property is set to direct the user to the node page. if (!empty($node->webform['action'])) { $form['#action'] = $node->webform['action']; } // @todo Convert these to methods. $form['#submit'] = ['webform_client_form_pages', 'webform_client_form_submit']; $form['#validate'] = ['webform_client_form_validate']; // Add includes for used component types and pre/post validation handlers $form['#process'] = ['webform_client_form_process']; if (is_array($node->webform['components']) && !empty($node->webform['components'])) { // Prepare a new form array. $form['submitted'] = ['#tree' => TRUE]; $form['details'] = ['#tree' => TRUE]; // Put the components into a tree structure. if (!isset($form_state->getStorage()['component_tree'])) { $form_state->set(['webform', 'component_tree'], []); $form_state->set(['webform', 'page_count'], 1); $form_state->set(['webform', 'page_num'], 1); _webform_components_tree_build($node->webform['components'], $form_state->get(['webform', 'component_tree']), 0, $form_state->get(['webform', 'page_count'])); // If preview is enabled, increase the page count by one. if ($node->webform['preview']) { $form_state->set(['webform', 'page_count'], $form_state->get(['webform', 'page_count']) + 1); } $form_state->set(['webform', 'preview'], $node->webform['preview']); // If this is the first time this draft has been restore and presented // to the user, let them know that they are looking at a draft, rather // than a new form. This applies to the node view page, but not to a // submission edit page (where they presumably know what submission they // are editing). if ($resume_draft && empty($form_state->getUserInput())) { drupal_set_message($this->t('A partially-completed form was found. Please complete the remaining portions.')); } } else { $form_state->set(['webform', 'component_tree'], $form_state->getStorage()['component_tree']); $form_state->set(['webform', 'page_count'], $form_state->getStorage()['page_count']); $form_state->set(['webform', 'page_num'], $form_state->getStorage()['page_num']); $form_state->set(['webform', 'preview'], $form_state->getStorage()['preview']); } // Set the input values based on whether we're editing an existing // submission or not. $input_values = isset($submission->data) ? $submission->data : []; // Form state storage override any default submission information. Convert // the value structure to always be an array, matching $submission->data. if (isset($form_state->getStorage()['submitted'])) { foreach ($form_state->getStorage()['submitted'] as $cid => $data) { $input_values[$cid] = is_array($data) ? $data : [$data]; } } // Form state values override any default submission information. Convert // the value structure to always be an array, matching $submission->data. if ($form_state->getValue('submitted')) { foreach ($form_state->getValue('submitted') as $cid => $data) { $input_values[$cid] = is_array($data) ? $data : [$data]; } } // Generate conditional topological order & report any errors. $sorter = webform_get_conditional_sorter($node); $sorter->reportErrors(); // Execute the conditionals on the current input values $input_values = $sorter->executeConditionals($input_values); // Allow values from other pages to be sent to browser for conditionals. $form['#conditional_values'] = $input_values; // Allow components access to most up-to-date values. $form_state['#conditional_values'] = $input_values; // For resuming a previous draft, find the next page after the last // validated page. if (!isset($form_state->getStorage()['page_num']) && $submission && $submission->is_draft && $submission->highest_valid_page) { // Find the // 1) previous/next non-empty page, or // 2) the preview page, or // 3) the preview page, forcing its display if the form would // unexpectedly submit, or // 4) page 1 even if empty, if no other previous page would be shown $form_state->set(['webform', 'page_num'], $submission->highest_valid_page); do { $form_state->set(['webform', 'page_num'], $form_state->get(['webform', 'page_num']) + 1); } while (!webform_get_conditional_sorter($node)->pageVisibility($form_state->get(['webform', 'page_num']))); if (!$form_state->get(['webform', 'preview']) && $form_state->get(['webform', 'page_num']) == $form_state->get(['webform', 'page_count']) + (int) (!$form_state->get(['webform', 'preview']))) { // Force a preview to avert an unintended submission via Next. $form_state->set(['webform', 'preview'], TRUE); $form_state->set(['webform', 'page_count'], $form_state->get(['webform', 'page_count']) + 1); } // The form hasn't been submitted (ever) and the preview code will // expect $form_state['values']['submitted'] to be set from a previous // submission, so provide these values here. $form_state->setValue('submitted', $input_values); $form_state->setStorage(['submitted' => $input_values]); } // Shorten up our variable names. $component_tree = $form_state->get(['webform', 'component_tree']); $page_count = $form_state->get(['webform', 'page_count']); $page_num = $form_state->get(['webform', 'page_num']); $preview = $form_state->get(['webform', 'preview']); if ($page_count > 1) { $page_labels = webform_page_labels($node, $form_state); $form['progressbar'] = ['#theme' => 'webform_progressbar', '#node' => $node, '#page_num' => $page_num, '#page_count' => count($page_labels), '#page_labels' => $page_labels, '#weight' => -100]; } // Check whether a previous submission was truncated. The length of the // client form is not estimated before submission because a) the // determination may not be accurate for some webform components and b) // the error will be apparent upon submission. webform_input_vars_check($form, $form_state, 'submitted'); // Recursively add components to the form. The unfiltered version of the // form (typically used in Form Builder), includes all components. foreach ($component_tree['children'] as $cid => $component) { if ($component['type'] == 'pagebreak') { $next_page_labels[$component['page_num'] - 1] = !empty($component['extra']['next_page_label']) ? $component['extra']['next_page_label'] : $this->t('Next Page >'); $prev_page_labels[$component['page_num']] = !empty($component['extra']['prev_page_label']) ? $component['extra']['prev_page_label'] : $this->t('< Previous Page'); } if (!$filter || $sorter->componentVisibility($cid, $page_num)) { $component_value = isset($input_values[$cid]) ? $input_values[$cid] : NULL; _webform_client_form_add_component($node, $component, $component_value, $form['submitted'], $form, $input_values, 'form', $page_num, $filter); } } if ($preview) { $next_page_labels[$page_count - 1] = $node->webform['preview_next_button_label'] ? $node->webform['preview_next_button_label'] : $this->t('Preview'); $prev_page_labels[$page_count] = $node->webform['preview_prev_button_label'] ? $node->webform['preview_prev_button_label'] : $this->t('< Previous'); } // Add the preview if needed. if ($preview && $page_num === $page_count) { $preview_submission = webform_submission_create($node, $account, $form_state, TRUE, $submission); $preview_message = $node->webform['preview_message']; if (strlen(trim(strip_tags($preview_message))) === 0) { $preview_message = $this->t('Please review your submission. Your submission is not complete until you press the "!button" button!', ['!button' => $submit_button_text]); } $form['preview_message'] = ['#type' => 'markup', '#markup' => webform_replace_tokens($preview_message, $node, $preview_submission, NULL, $node->webform['preview_message_format'])]; $form['preview'] = webform_submission_render($node, $preview_submission, NULL, 'html', $node->webform['preview_excluded_components']); $form['#attributes']['class'][] = 'preview'; } // These form details help managing data upon submission. $form['details']['nid'] = ['#type' => 'value', '#value' => $node->id()]; $form['details']['sid'] = ['#type' => 'hidden', '#value' => isset($submission->sid) ? $submission->sid : NULL]; $form['details']['uid'] = ['#type' => 'value', '#value' => isset($submission->uid) ? $submission->uid : $account->id()]; $form['details']['page_num'] = ['#type' => 'hidden', '#value' => $page_num]; $form['details']['page_count'] = ['#type' => 'hidden', '#value' => $page_count]; $form['details']['finished'] = ['#type' => 'hidden', '#value' => $finished]; // Add process functions to remove the IDs forced upon buttons and wrappers. $actions_pre_render = array_merge(element_info_property('actions', '#pre_render', []), ['webform_pre_render_remove_id']); $buttons_pre_render = array_merge(element_info_property('submit', '#pre_render', []), ['webform_pre_render_remove_id']); // Add buttons for pages, drafts, and submissions. $form['actions'] = ['#type' => 'actions', '#weight' => 1000, '#pre_render' => $actions_pre_render]; // Add the draft button. if ($node->webform['allow_draft'] && (empty($submission) || $submission->is_draft) && $account->id() != 0) { $form['actions']['draft'] = ['#type' => 'submit', '#value' => $this->t('Save Draft'), '#weight' => -2, '#validate' => ['webform_client_form_prevalidate'], '#attributes' => ['formnovalidate' => 'formnovalidate', 'class' => ['webform-draft']], '#pre_render' => $buttons_pre_render]; } // Add the submit button(s). if ($page_num > 1) { $form['actions']['previous'] = ['#type' => 'submit', '#value' => $prev_page_labels[$page_num], '#weight' => 5, '#validate' => [], '#attributes' => ['formnovalidate' => 'formnovalidate', 'class' => ['webform-previous']], '#pre_render' => $buttons_pre_render]; } if ($page_num == $page_count) { $form['actions']['submit'] = ['#type' => 'submit', '#value' => $submit_button_text, '#weight' => 10, '#attributes' => ['class' => ['webform-submit', 'button-primary']], '#pre_render' => $buttons_pre_render]; } elseif ($page_num < $page_count) { $form['actions']['next'] = ['#type' => 'submit', '#value' => $next_page_labels[$page_num], '#weight' => 10, '#attributes' => ['class' => ['webform-next', 'button-primary']], '#pre_render' => $buttons_pre_render]; } } return $form; }
/** * {@inheritdoc} */ public function setStorage(array $storage) { $this->decoratedFormState->setStorage($storage); return $this; }
/** * @covers ::setStorage */ public function testSetStorage() { $storage = ['FOO' => 'BAR']; $this->decoratedFormState->setStorage($storage)->shouldBeCalled(); $this->assertSame($this->formStateDecoratorBase, $this->formStateDecoratorBase->setStorage($storage)); }