Skip to content

[4.1] Improve the child template creation #2392

@jgerman-bot

Description

@jgerman-bot

New language relevant PR in upstream repo: joomla/joomla-cms#36250 Here are the upstream changes:

Click to expand the diff!
diff --git a/administrator/components/com_templates/src/Controller/TemplateController.php b/administrator/components/com_templates/src/Controller/TemplateController.php
index 8a4d93d1c0fc..15643a5cfe77 100644
--- a/administrator/components/com_templates/src/Controller/TemplateController.php
+++ b/administrator/components/com_templates/src/Controller/TemplateController.php
@@ -1008,10 +1008,12 @@ public function child()
 
 		$this->input->set('installtype', 'folder');
 		$newNameRaw = $this->input->get('new_name', null, 'string');
+
 		// Only accept letters, numbers and underscore for template name
-		$newName    = preg_replace('/[^a-zA-Z0-9_]/', '', $newNameRaw);
-		$templateID = (int) $this->input->getInt('id', 0);
-		$file       = (string) $this->input->get('file', '', 'cmd');
+		$newName     = preg_replace('/[^a-zA-Z0-9_]/', '', $newNameRaw);
+		$templateID  = (int) $this->input->getInt('id', 0);
+		$file        = (string) $this->input->get('file', '', 'cmd');
+		$extraStyles = (array) $this->input->get('style_ids', [], 'array');
 
 		$this->setRedirect('index.php?option=com_templates&view=template&id=' . $templateID . '&file=' . $file);
 
@@ -1083,6 +1085,12 @@ public function child()
 		$this->setMessage(Text::sprintf('COM_TEMPLATES_CHILD_SUCCESS', $newName));
 		$model->cleanup();
 
+		if (\count($extraStyles) > 0)
+		{
+			$model->setState('stylesToCopy', $extraStyles);
+			$model->copyStyles();
+		}
+
 		return true;
 	}
 }
diff --git a/administrator/components/com_templates/src/Model/TemplateModel.php b/administrator/components/com_templates/src/Model/TemplateModel.php
index bd5f3fd1c354..3c7791f6e110 100644
--- a/administrator/components/com_templates/src/Model/TemplateModel.php
+++ b/administrator/components/com_templates/src/Model/TemplateModel.php
@@ -27,6 +27,7 @@
 use Joomla\Component\Templates\Administrator\Helper\TemplateHelper;
 use Joomla\Component\Templates\Administrator\Helper\TemplatesHelper;
 use Joomla\Database\ParameterType;
+use Joomla\Utilities\ArrayHelper;
 
 /**
  * Template model class.
@@ -2045,7 +2046,6 @@ private function getBasePath()
 			JPATH_ROOT . '/' . ($this->template->client_id === 0 ? '' : 'administrator/') . 'templates/' . $this->template->element;
 	}
 
-
 	/**
 	 * Method to create the templateDetails.xml for the child template
 	 *
@@ -2169,6 +2169,8 @@ public function child()
 		$media->addChild('folder', 'css');
 		$media->addChild('folder', 'js');
 		$media->addChild('folder', 'images');
+		$media->addChild('folder', 'html');
+		$media->addChild('folder', 'scss');
 
 		$xml->name = $template->element . '_' . $newName;
 		$xml->inheritable = 0;
@@ -2189,24 +2191,115 @@ public function child()
 		}
 
 		// Create an empty media folder structure
-		if (!Folder::create($toPath . '/media'))
+		if (!Folder::create($toPath . '/media')
+			|| !Folder::create($toPath . '/media/css')
+			|| !Folder::create($toPath . '/media/js')
+			|| !Folder::create($toPath . '/media/images')
+			|| !Folder::create($toPath . '/media/html/tinymce')
+			|| !Folder::create($toPath . '/media/scss'))
 		{
 			return false;
 		}
 
-		if (!Folder::create($toPath . '/media/css'))
+		return true;
+	}
+
+	/**
+	 * Method to get the parent template existing styles
+	 *
+	 * @return  array   array of id,titles of the styles
+	 *
+	 * @since  __DEPLOY_VERSION__
+	 */
+	public function getAllTemplateStyles()
+	{
+		$template = $this->getTemplate();
+
+		if (!$template->xmldata->inheritable)
 		{
-			return false;
+			return [];
 		}
 
-		if (!Folder::create($toPath . '/media/js'))
+		$db    = $this->getDbo();
+		$query = $db->getQuery(true);
+
+		$query->select($db->quoteName(['id', 'title']))
+			->from($db->quoteName('#__template_styles'))
+			->where($db->quoteName('client_id') . ' = :client_id', 'AND')
+			->where($db->quoteName('template') . ' = :template')
+			->orWhere($db->quoteName('parent') . ' = :parent')
+			->bind(':client_id', $template->client_id, ParameterType::INTEGER)
+			->bind(':template', $template->element)
+			->bind(':parent', $template->element);
+
+		$db->setQuery($query);
+
+		return $db->loadObjectList();
+	}
+
+	/**
+	 * Method to copy selected styles to the child template
+	 *
+	 * @return  boolean   true if name is not used, false otherwise
+	 *
+	 * @since  __DEPLOY_VERSION__
+	 */
+	public function copyStyles()
+	{
+		$app         = Factory::getApplication();
+		$template    = $this->getTemplate();
+		$newName     = strtolower($this->getState('new_name'));
+		$applyStyles = $this->getState('stylesToCopy');
+
+		// Get a db connection.
+		$db = $this->getDbo();
+
+		// Create a new query object.
+		$query = $db->getQuery(true);
+
+		$query->select($db->quoteName(['title', 'params']))
+			->from($db->quoteName('#__template_styles'))
+			->whereIn($db->quoteName('id'), ArrayHelper::toInteger($applyStyles));
+		// Reset the query using our newly populated query object.
+		$db->setQuery($query);
+
+		try
 		{
+			$parentStyle = $db->loadObjectList();
+		}
+		catch (\Exception $e)
+		{
+			$app->enqueueMessage(Text::_('COM_TEMPLATES_ERROR_STYLE_NOT_FOUND'), 'error');
+
 			return false;
 		}
 
-		if (!Folder::create($toPath . '/media/images'))
+		foreach ($parentStyle as $style)
 		{
-			return false;
+			$query = $db->getQuery(true);
+			$styleName = Text::sprintf('COM_TEMPLATES_COPY_CHILD_TEMPLATE_STYLES', ucfirst($template->element . '_' . $newName), $style->title);
+
+			// Insert columns and values
+			$columns = ['id', 'template', 'client_id', 'home', 'title', 'inheritable', 'parent', 'params'];
+			$values = [0, $db->quote($template->element . '_' . $newName), (int) $template->client_id, $db->quote('0'), $db->quote($styleName), 0, $db->quote($template->element), $db->quote($style->params)];
+
+			$query
+				->insert($db->quoteName('#__template_styles'))
+				->columns($db->quoteName($columns))
+				->values(implode(',', $values));
+
+			$db->setQuery($query);
+
+			try
+			{
+				$db->execute();
+			}
+			catch (\Exception $e)
+			{
+				$app->enqueueMessage(Text::_('COM_TEMPLATES_ERROR_COULD_NOT_READ'), 'error');
+
+				return false;
+			}
 		}
 
 		return true;
diff --git a/administrator/components/com_templates/src/View/Template/HtmlView.php b/administrator/components/com_templates/src/View/Template/HtmlView.php
index 124608c1da84..8aa3f7cf0c7f 100644
--- a/administrator/components/com_templates/src/View/Template/HtmlView.php
+++ b/administrator/components/com_templates/src/View/Template/HtmlView.php
@@ -167,6 +167,8 @@ public function display($tpl = null)
 		$this->preview     = $this->get('Preview');
 		$this->pluginState = PluginHelper::isEnabled('installer', 'override');
 		$this->updatedList = $this->get('UpdatedList');
+		$this->styles      = $this->get('AllTemplateStyles');
+		$this->stylesHTML  = '';
 
 		$params       = ComponentHelper::getParams('com_templates');
 		$imageTypes   = explode(',', $params->get('image_formats'));
diff --git a/administrator/components/com_templates/tmpl/template/default_modal_child_body.php b/administrator/components/com_templates/tmpl/template/default_modal_child_body.php
index a689ee470e73..3b9b83e6414a 100644
--- a/administrator/components/com_templates/tmpl/template/default_modal_child_body.php
+++ b/administrator/components/com_templates/tmpl/template/default_modal_child_body.php
@@ -9,8 +9,52 @@
 
 defined('_JEXEC') or die;
 
+use Joomla\CMS\Factory;
+use Joomla\CMS\HTML\HTMLHelper;
 use Joomla\CMS\Language\Text;
+use Joomla\CMS\Layout\LayoutHelper;
 
+Factory::getDocument()->getWebAssetManager()->usePreset('choicesjs');
+
+// Generate a list of styles for the child creation modal
+$options = [];
+
+if (count($this->styles) > 0)
+{
+	foreach ($this->styles as $style)
+	{
+		$options[] = HTMLHelper::_('select.option', $style->id, $style->title, 'value', 'text');
+	}
+}
+
+$fancySelectData = [
+	'autocomplete'   => 'off',
+	'autofocus'      => false,
+	'class'          => '',
+	'description'    => '',
+	'disabled'       => false,
+	'group'          => false,
+	'id'             => 'style_ids',
+	'hidden'         => false,
+	'hint'           => '',
+	'label'          => '',
+	'labelclass'     => '',
+	'onchange'       => '',
+	'onclick'        => '',
+	'multiple'       => true,
+	'pattern'        => '',
+	'readonly'       => false,
+	'repeat'         => false,
+	'required'       => false,
+	'size'           => 4,
+	'spellcheck'     => false,
+	'validate'       => '',
+	'value'          => '0',
+	'options'        => $options,
+	'dataAttributes' => [],
+	'dataAttribute'	 => '',
+	'name'           => 'style_ids[]',
+];
 ?>
 <div id="template-manager-copy" class="container-fluid">
 	<div class="mt-2">
@@ -28,6 +72,19 @@
 					</small>
 				</div>
 			</div>
+			<div class="control-group">
+				<div class="control-label">
+					<label for="style_ids">
+						<?php echo Text::_('COM_TEMPLATES_TEMPLATE_CHILD_STYLE_LABEL'); ?>
+					</label>
+				</div>
+				<div class="controls">
+					<?php echo LayoutHelper::render('joomla.form.field.list-fancy-select', $fancySelectData); ?>
+					<small class="form-text">
+						<?php echo Text::_('COM_TEMPLATES_TEMPLATE_NEW_STYLE_DESC'); ?>
+					</small>
+				</div>
+			</div>
 		</div>
 	</div>
 </div>
diff --git a/administrator/language/en-GB/com_templates.ini b/administrator/language/en-GB/com_templates.ini
index 1b2211b71069..00979d8b018f 100644
--- a/administrator/language/en-GB/com_templates.ini
+++ b/administrator/language/en-GB/com_templates.ini
@@ -36,6 +36,7 @@ COM_TEMPLATES_CONFIG_POSITIONS_LABEL="Preview Module Positions"
 COM_TEMPLATES_CONFIG_SOURCE_LABEL="Valid Source Formats"
 COM_TEMPLATES_CONFIG_UPLOAD_LABEL="Max. Upload Size (MB)"
 COM_TEMPLATES_CONFIGURATION="Template: Options"
+COM_TEMPLATES_COPY_CHILD_TEMPLATE_STYLES="%s, copy of %s"
 COM_TEMPLATES_COPY_SUCCESS="New template called %s was installed."
 COM_TEMPLATES_CROP_AREA_ERROR="Crop area not selected."
 COM_TEMPLATES_DIRECTORY_NOT_WRITABLE="The template folder is not writable. Some features may not work."
@@ -218,6 +219,8 @@ COM_TEMPLATES_TAB_OVERRIDES="Create Overrides"
 COM_TEMPLATES_TAB_UPDATED_FILES="Updated Files"
 COM_TEMPLATES_TEMPLATE_CHILD="Child Template"
 COM_TEMPLATES_TEMPLATE_CHILD_NAME_LABEL="Child Template Name"
+COM_TEMPLATES_TEMPLATE_CHILD_STYLE_LABEL="Additional Template Styles"
+COM_TEMPLATES_TEMPLATE_NEW_STYLE_DESC="Duplicate existing styles for the new child template."
 COM_TEMPLATES_TEMPLATE_CLOSE="Close"
 COM_TEMPLATES_TEMPLATE_COPY="Copy Template"
 COM_TEMPLATES_TEMPLATE_CORE_FILENAME="Original file &quot;%s&quot;."

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions