From 24892f13085e1e9e629071e5ded13e33b69a056b Mon Sep 17 00:00:00 2001 From: Alexander Ebert Date: Wed, 7 Feb 2018 15:26:19 +0100 Subject: [PATCH] Import new variables when updating styles --- .../lib/data/style/StyleEditor.class.php | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/wcfsetup/install/files/lib/data/style/StyleEditor.class.php b/wcfsetup/install/files/lib/data/style/StyleEditor.class.php index c7d2084e1b..36069197d8 100644 --- a/wcfsetup/install/files/lib/data/style/StyleEditor.class.php +++ b/wcfsetup/install/files/lib/data/style/StyleEditor.class.php @@ -146,6 +146,31 @@ class StyleEditor extends DatabaseObjectEditor implements IEditableCachedObject } } + /** + * Returns the list of variables that exist, but have no explicit values for this style. + * + * @return string[] + */ + public function getImplicitVariables() { + $sql = "SELECT variable.variableName + FROM wcf".WCF_N."_style_variable variable + LEFT JOIN wcf".WCF_N."_style_variable_value variable_value + ON (variable_value.variableID = variable.variableID AND variable_value.styleID = ?) + WHERE variable.variableName LIKE ? + AND variable_value.variableValue IS NULL"; + $statement = WCF::getDB()->prepareStatement($sql); + $statement->execute([ + $this->styleID, + 'wcf%' + ]); + $variableNames = []; + while ($variableName = $statement->fetchColumn()) { + $variableNames[] = $variableName; + } + + return $variableNames; + } + /** * Reads the data of a style exchange format file. * @@ -543,9 +568,19 @@ class StyleEditor extends DatabaseObjectEditor implements IEditableCachedObject $individualScss = Style::splitLessVariables($variables['individualScss']); $variables['individualScss'] = Style::joinLessVariables($styleData['variables']['individualScss'], $individualScss['custom']); + unset($styleData['variables']['individualScss']); $overrideScss = Style::splitLessVariables($variables['overrideScss']); $variables['overrideScss'] = Style::joinLessVariables($styleData['variables']['overrideScss'], $overrideScss['custom']); + unset($styleData['variables']['overrideScss']); + + // import variables that have not been explicitly defined before + $implicitVariables = $style->getImplicitVariables(); + foreach ($styleData['variables'] as $variableName => $variableValue) { + if (in_array($variableName, $implicitVariables)) { + $variables[$variableName] = $variableValue; + } + } $styleData['variables'] = $variables; -- 2.20.1