diff --git a/core/lib/Drupal/Core/Form/FormBuilder.php b/core/lib/Drupal/Core/Form/FormBuilder.php index 5a2bed5..a222677 100644 --- a/core/lib/Drupal/Core/Form/FormBuilder.php +++ b/core/lib/Drupal/Core/Form/FormBuilder.php @@ -650,6 +650,12 @@ public function processForm($form_id, &$form, &$form_state) { // Set a flag to indicate the the form has been processed and executed. $form_state['executed'] = TRUE; + // If there is a response in form_state, respect that instead of doing + // a redirect. + if (isset($form_state['response']) && $form_state['response'] instanceof Response) { + return $form_state['response']; + } + // Redirect the form based on values in $form_state. $redirect = $this->redirectForm($form_state); if (is_object($redirect)) { diff --git a/core/lib/Drupal/Core/Form/FormBuilderInterface.php b/core/lib/Drupal/Core/Form/FormBuilderInterface.php index a7205d1..0311e81 100644 --- a/core/lib/Drupal/Core/Form/FormBuilderInterface.php +++ b/core/lib/Drupal/Core/Form/FormBuilderInterface.php @@ -114,6 +114,12 @@ public function getForm($form_arg); * already set $form_state['rebuild'] to cause the form processing to * bypass submit handlers and rebuild the form instead, even if there are * no validation errors. + * - response: Used when a form needs to return some kind of a + * \Symfony\Component\HttpFoundation\Response object, eg a + * \Symfony\Component\HttpFoundation\BinaryFileResponse when triggering a + * file download. If you need to use a + * \Symfony\Component\HttpFoundation\RedirectResponse please use the + * redirect key instead. * - redirect: Used to redirect the form on submission. It may either be a * string containing the destination URL, or an array of arguments * compatible with url(). See url() for complete information. diff --git a/core/modules/locale/lib/Drupal/locale/Form/ExportForm.php b/core/modules/locale/lib/Drupal/locale/Form/ExportForm.php new file mode 100644 index 0000000..f59097c --- /dev/null +++ b/core/modules/locale/lib/Drupal/locale/Form/ExportForm.php @@ -0,0 +1,150 @@ + $language) { + if ($langcode != 'en' || locale_translate_english()) { + $language_options[$langcode] = $language->name; + } + } + $language_default = language_default(); + + if (empty($language_options)) { + $form['langcode'] = array( + '#type' => 'value', + '#value' => Language::LANGCODE_SYSTEM, + ); + $form['langcode_text'] = array( + '#type' => 'item', + '#title' => $this->t('Language'), + '#markup' => $this->t('No language available. The export will only contain source strings.'), + ); + } + else { + $form['langcode'] = array( + '#type' => 'select', + '#title' => $this->t('Language'), + '#options' => $language_options, + '#default_value' => $language_default->id, + '#empty_option' => $this->t('Source text only, no translations'), + '#empty_value' => Language::LANGCODE_SYSTEM, + ); + $form['content_options'] = array( + '#type' => 'details', + '#title' => $this->t('Export options'), + '#collapsed' => TRUE, + '#tree' => TRUE, + '#states' => array( + 'invisible' => array( + ':input[name="langcode"]' => array('value' => Language::LANGCODE_SYSTEM), + ), + ), + ); + $form['content_options']['not_customized'] = array( + '#type' => 'checkbox', + '#title' => $this->t('Include non-customized translations'), + '#default_value' => TRUE, + ); + $form['content_options']['customized'] = array( + '#type' => 'checkbox', + '#title' => $this->t('Include customized translations'), + '#default_value' => TRUE, + ); + $form['content_options']['not_translated'] = array( + '#type' => 'checkbox', + '#title' => $this->t('Include untranslated text'), + '#default_value' => TRUE, + ); + } + + $form['actions'] = array( + '#type' => 'actions' + ); + $form['actions']['submit'] = array( + '#type' => 'submit', + '#value' => $this->t('Export') + ); + return $form; + } + + /** + * {@inheritdoc} + */ + public function submitForm(array &$form, array &$form_state) { + // If template is required, language code is not given. + if ($form_state['values']['langcode'] != Language::LANGCODE_SYSTEM) { + $language = language_load($form_state['values']['langcode']); + } + else { + $language = NULL; + } + $content_options = isset($form_state['values']['content_options']) ? $form_state['values']['content_options'] : array(); + $reader = new PoDatabaseReader(); + $languageName = ''; + if ($language != NULL) { + $reader->setLangcode($language->id); + $reader->setOptions($content_options); + $languages = language_list(); + $languageName = isset($languages[$language->id]) ? $languages[$language->id]->name : ''; + $filename = $language->id .'.po'; + } + else { + // Template required. + $filename = 'drupal.pot'; + } + + $item = $reader->readItem(); + if (!empty($item)) { + $uri = tempnam('temporary://', 'po_'); + $header = $reader->getHeader(); + $header->setProjectName($this->config('system.site')->get('name')); + $header->setLanguageName($languageName); + + $writer = new PoStreamWriter; + $writer->setUri($uri); + $writer->setHeader($header); + + $writer->open(); + $writer->writeItem($item); + $writer->writeItems($reader); + $writer->close(); + + $response = new BinaryFileResponse($uri); + $response->setContentDisposition('attachment', $filename); + $form_state['response'] = $response; + } + else { + drupal_set_message('Nothing to export.'); + } + } + +} diff --git a/core/modules/locale/lib/Drupal/locale/Form/LocaleForm.php b/core/modules/locale/lib/Drupal/locale/Form/LocaleForm.php index c06a4aa..aaa0bfa 100644 --- a/core/modules/locale/lib/Drupal/locale/Form/LocaleForm.php +++ b/core/modules/locale/lib/Drupal/locale/Form/LocaleForm.php @@ -22,16 +22,6 @@ public function import() { } /** - * Wraps locale_translate_export_form(). - * - * @todo Remove locale_translate_export_form(). - */ - public function export() { - module_load_include('bulk.inc', 'locale'); - return drupal_get_form('locale_translate_export_form'); - } - - /** * Wraps locale_translation_status_form(). * * @todo Remove locale_translation_status_form(). diff --git a/core/modules/locale/locale.bulk.inc b/core/modules/locale/locale.bulk.inc index 5256244..51fe631 100644 --- a/core/modules/locale/locale.bulk.inc +++ b/core/modules/locale/locale.bulk.inc @@ -5,9 +5,7 @@ * Mass import-export and batch import functionality for Gettext .po files. */ -use Drupal\Component\Gettext\PoStreamWriter; use Drupal\locale\Gettext; -use Drupal\locale\PoDatabaseReader; use Drupal\Core\Language\Language; use Symfony\Component\HttpFoundation\BinaryFileResponse; use Drupal\file\FileInterface; @@ -142,135 +140,6 @@ function locale_translate_import_form_submit($form, &$form_state) { } /** - * Form constructor for the Gettext translation files export form. - * - * @see locale_translate_export_form_submit() - * @ingroup forms - * - * @deprecated Use \Drupal\locale\Form\LocaleForm::export() - */ -function locale_translate_export_form($form, &$form_state) { - $languages = language_list(); - $language_options = array(); - foreach ($languages as $langcode => $language) { - if ($langcode != 'en' || locale_translate_english()) { - $language_options[$langcode] = $language->name; - } - } - $language_default = language_default(); - - if (empty($language_options)) { - $form['langcode'] = array( - '#type' => 'value', - '#value' => Language::LANGCODE_SYSTEM, - ); - $form['langcode_text'] = array( - '#type' => 'item', - '#title' => t('Language'), - '#markup' => t('No language available. The export will only contain source strings.'), - ); - } - else { - $form['langcode'] = array( - '#type' => 'select', - '#title' => t('Language'), - '#options' => $language_options, - '#default_value' => $language_default->id, - '#empty_option' => t('Source text only, no translations'), - '#empty_value' => Language::LANGCODE_SYSTEM, - ); - $form['content_options'] = array( - '#type' => 'details', - '#title' => t('Export options'), - '#collapsed' => TRUE, - '#tree' => TRUE, - '#states' => array( - 'invisible' => array( - ':input[name="langcode"]' => array('value' => Language::LANGCODE_SYSTEM), - ), - ), - ); - $form['content_options']['not_customized'] = array( - '#type' => 'checkbox', - '#title' => t('Include non-customized translations'), - '#default_value' => TRUE, - ); - $form['content_options']['customized'] = array( - '#type' => 'checkbox', - '#title' => t('Include customized translations'), - '#default_value' => TRUE, - ); - $form['content_options']['not_translated'] = array( - '#type' => 'checkbox', - '#title' => t('Include untranslated text'), - '#default_value' => TRUE, - ); - } - - $form['actions'] = array( - '#type' => 'actions' - ); - $form['actions']['submit'] = array( - '#type' => 'submit', - '#value' => t('Export') - ); - return $form; -} - -/** - * Form submission handler for locale_translate_export_form(). - */ -function locale_translate_export_form_submit($form, &$form_state) { - // If template is required, language code is not given. - if ($form_state['values']['langcode'] != Language::LANGCODE_SYSTEM) { - $language = language_load($form_state['values']['langcode']); - } - else { - $language = NULL; - } - $content_options = isset($form_state['values']['content_options']) ? $form_state['values']['content_options'] : array(); - $reader = new PoDatabaseReader(); - $languageName = ''; - if ($language != NULL) { - $reader->setLangcode($language->id); - $reader->setOptions($content_options); - $languages = language_list(); - $languageName = isset($languages[$language->id]) ? $languages[$language->id]->name : ''; - $filename = $language->id .'.po'; - } - else { - // Template required. - $filename = 'drupal.pot'; - } - - $item = $reader->readItem(); - if (!empty($item)) { - $uri = tempnam('temporary://', 'po_'); - $header = $reader->getHeader(); - $header->setProjectName(\Drupal::config('system.site')->get('name')); - $header->setLanguageName($languageName); - - $writer = new PoStreamWriter; - $writer->setUri($uri); - $writer->setHeader($header); - - $writer->open(); - $writer->writeItem($item); - $writer->writeItems($reader); - $writer->close(); - - $response = new BinaryFileResponse($uri); - $response->setContentDisposition('attachment', $filename); - // @todo remove lines below once converted to new routing system. - $response->prepare(\Drupal::request()) - ->send(); - } - else { - drupal_set_message('Nothing to export.'); - } -} - -/** * Prepare a batch to import all translations. * * @param array $options diff --git a/core/modules/locale/locale.routing.yml b/core/modules/locale/locale.routing.yml index 190ddf7..4f060e9 100644 --- a/core/modules/locale/locale.routing.yml +++ b/core/modules/locale/locale.routing.yml @@ -32,7 +32,7 @@ locale.translate_import: locale.translate_export: path: '/admin/config/regional/translate/export' defaults: - _content: '\Drupal\locale\Form\LocaleForm::export' + _form: '\Drupal\locale\Form\ExportForm' _title: 'Export' requirements: _permission: 'translate interface' @@ -43,4 +43,4 @@ locale.translate_status: _content: '\Drupal\locale\Form\LocaleForm::status' _title: 'Available translation updates' requirements: - _permission: 'translate interface' + _permission: 'translate interface' \ No newline at end of file