adaptivetheme-8.x-3.x-dev/at_core/forms/layout/layouts_submit.php
at_core/forms/layout/layouts_submit.php
<?php
/**
* @file
* Submit layouts.
*/
use Drupal\Component\Utility\Unicode;
use Drupal\at_core\Theme\ThemeSettingsConfig;
use Drupal\at_core\Layout\LayoutSubmit;
use Drupal\Core\Extension\ThemeExtensionList;
/**
* Form submit handler for the Layout settings.
*
* @param $form
* @param $form_state
*/
function at_core_submit_layouts(&$form, &$form_state) {
$build_info = $form_state->getBuildInfo();
$values = $form_state->getValues();
$theme = $build_info['args'][0];
// Don't let this timeout easily.
set_time_limit(60);
// Generate and save a new layout.
if (isset($values['settings_layouts_enable']) && $values['settings_layouts_enable'] == 1) {
$generateLayout = new LayoutSubmit($theme, $values);
// Update the themes info file with new regions.
$generateLayout->saveLayoutRegions();
// Build and save the suggestions layout css files.
$generateLayout->saveLayoutSuggestionsCSS();
// Build and save the suggestions twig templates.
$generateLayout->saveLayoutSuggestionsMarkup();
// Merge in row order (weight) settings.
$converted_layout_settings = $generateLayout->convertLayoutSettings();
if (!empty($converted_layout_settings)) {
$values = array_merge($converted_layout_settings, $values);
}
// Add a new suggestion to the page suggestions array in config.
if (!empty($values['ts_name'])) {
$suggestion = trim($values['ts_name']);
$clean_suggestion = str_replace('-', '_', $suggestion);
$values["settings_suggestion_page__$clean_suggestion"] = $clean_suggestion;
}
// Delete suggestion files.
$templates_directory = \Drupal::service('extension.list.theme')->getPath($theme) . '/templates/generated';
$css_directory = $values['settings_generated_files_path'];
foreach ($values as $values_key => $values_value) {
if (substr($values_key, 0, 18) === 'delete_suggestion_') {
if ($values_value === 1) {
/*$delete_suggestion_keys[] = Unicode::substr($values_key, 18);*/
$delete_suggestion_keys[] = mb_substr($values_key, 18);
}
}
}
if (isset($delete_suggestion_keys)) {
foreach ($delete_suggestion_keys as $suggestion_to_remove) {
$formatted_suggestion = str_replace('_', '-', $suggestion_to_remove);
$template_file_name = $formatted_suggestion . '.html.twig';
$css_file_name = $theme . '.layout.' . $formatted_suggestion . '.css';
$template_file_path = "$templates_directory/$template_file_name";
$css_file_path = "$css_directory/$css_file_name";
$files_to_delete[] = $template_file_name;
$files_to_delete[] = $css_file_name;
if (file_exists($template_file_path)) {
unlink($template_file_path);
}
if (file_exists($css_file_path)) {
unlink($css_file_path);
}
}
}
}
if (isset($files_to_delete)) {
$deleted_files_message_list = [
'#theme' => 'item_list',
'#items' => $files_to_delete,
];
\Drupal::messenger()->addMessage(t('The following <b>files</b> were removed: @removed_files', [
'@removed_files' => \Drupal::service('renderer')->renderPlain($deleted_files_message_list)
]
), 'status');
}
// Flush caches. I really, really tried to avoid this, but if you know a better
// way of always clearing twig, CSS and the registry?
drupal_flush_all_caches();
// Manage settings and configuration.
$config = \Drupal::configFactory()->getEditable($theme . '.settings');
$convertToConfig = new ThemeSettingsConfig();
$convertToConfig->settingsLayoutConvertToConfig($values, $config);
}
