/** * Compare the theme tables with the local database and check whether there are custom layout sections * * @param array $arrFiles * @param array $arrDbFields * * @return string */ protected function compareThemeFiles($arrFiles, $arrDbFields) { $return = ' <div id="tl_buttons"> <a href="' . ampersand(str_replace('&key=importTheme', '', \Environment::get('request'))) . '" class="header_back" title="' . specialchars($GLOBALS['TL_LANG']['MSC']['backBTTitle']) . '" accesskey="b">' . $GLOBALS['TL_LANG']['MSC']['backBT'] . '</a> </div> ' . \Message::generate() . ' <form action="' . ampersand(\Environment::get('request'), true) . '" id="tl_theme_import" class="tl_form" method="post"> <div class="tl_formbody_edit"> <input type="hidden" name="FORM_SUBMIT" value="tl_theme_import"> <input type="hidden" name="REQUEST_TOKEN" value="' . REQUEST_TOKEN . '"> <input type="hidden" name="confirm" value="1">'; $count = 0; // Check the theme data foreach ($arrFiles as $strFile) { $return .= ' <div class="tl_' . ($count++ < 1 ? 't' : '') . 'box theme_import"> <h3>' . basename($strFile) . '</h3> <h4>' . $GLOBALS['TL_LANG']['tl_theme']['tables_fields'] . '</h4>'; // Find the XML file $objArchive = new \ZipReader($strFile); // Continue if there is no XML file if ($objArchive->getFile('theme.xml') === false) { $return .= "\n " . '<p class="tl_red" style="margin:0">' . sprintf($GLOBALS['TL_LANG']['tl_theme']['missing_xml'], basename($strFile)) . "</p>\n</div>"; continue; } // Open the XML file $xml = new \DOMDocument(); $xml->preserveWhiteSpace = false; $xml->loadXML($objArchive->unzip()); $tables = $xml->getElementsByTagName('table'); $blnHasError = false; // Loop through the tables for ($i = 0; $i < $tables->length; $i++) { $rows = $tables->item($i)->childNodes; $table = $tables->item($i)->getAttribute('name'); // Skip invalid tables if ($table != 'tl_theme' && $table != 'tl_style_sheet' && $table != 'tl_style' && $table != 'tl_module' && $table != 'tl_layout' && $table != 'tl_image_size' && $table != 'tl_image_size_item') { continue; } $arrFieldNames = array(); // Loop through the rows for ($j = 0; $j < $rows->length; $j++) { $fields = $rows->item($j)->childNodes; // Loop through the fields for ($k = 0; $k < $fields->length; $k++) { $arrFieldNames[$fields->item($k)->getAttribute('name')] = true; } } $arrFieldNames = array_keys($arrFieldNames); // Loop through the fields foreach ($arrFieldNames as $name) { // Print a warning if a field is missing if (!in_array($name, $arrDbFields[$table])) { $blnHasError = true; $return .= "\n " . '<p class="tl_red" style="margin:0">' . sprintf($GLOBALS['TL_LANG']['tl_theme']['missing_field'], $table . '.' . $name) . '</p>'; } } } // Confirmation if (!$blnHasError) { $return .= "\n " . '<p class="tl_green" style="margin:0">' . $GLOBALS['TL_LANG']['tl_theme']['tables_ok'] . '</p>'; } // Check the custom templates $return .= ' <h4>' . $GLOBALS['TL_LANG']['tl_theme']['custom_templates'] . '</h4>'; $objArchive->reset(); $blnTplExists = false; // Loop through the archive while ($objArchive->next()) { if (strncmp($objArchive->file_name, 'templates/', 10) !== 0) { continue; } if (file_exists(TL_ROOT . '/' . $objArchive->file_name)) { $blnTplExists = true; $return .= "\n " . '<p class="tl_red" style="margin:0">' . sprintf($GLOBALS['TL_LANG']['tl_theme']['template_exists'], $objArchive->file_name) . '</p>'; } } // Confirmation if (!$blnTplExists) { $return .= "\n " . '<p class="tl_green" style="margin:0">' . $GLOBALS['TL_LANG']['tl_theme']['templates_ok'] . '</p>'; } // HOOK: add custom logic if (isset($GLOBALS['TL_HOOKS']['compareThemeFiles']) && is_array($GLOBALS['TL_HOOKS']['compareThemeFiles'])) { foreach ($GLOBALS['TL_HOOKS']['compareThemeFiles'] as $callback) { $return .= \System::importStatic($callback[0])->{$callback}[1]($xml, $objArchive); } } $return .= ' </div>'; } // Return the form return $return . ' </div> <div class="tl_formbody_submit"> <div class="tl_submit_container"> <input type="submit" name="save" id="save" class="tl_submit" accesskey="s" value="' . specialchars($GLOBALS['TL_LANG']['MSC']['continue']) . '"> </div> </div> </form>'; }
/** * Compare the theme tables with the local database and check * whether there are custom layout sections * @param array * @param array */ protected function compareThemeFiles($arrFiles, $arrDbFields) { $return = ' <div id="tl_buttons"> <a href="'.ampersand(str_replace('&key=importTheme', '', $this->Environment->request)).'" class="header_back" title="'.specialchars($GLOBALS['TL_LANG']['MSC']['backBT']).'" accesskey="b">'.$GLOBALS['TL_LANG']['MSC']['backBT'].'</a> </div> <h2 class="sub_headline">'.$GLOBALS['TL_LANG']['tl_theme']['checking_theme'].'</h2> '.$this->getMessages().' <form action="'.ampersand($this->Environment->request, true).'" id="tl_theme_import" class="tl_form" method="post"> <div class="tl_formbody_edit"> <input type="hidden" name="FORM_SUBMIT" value="tl_theme_import"> <input type="hidden" name="REQUEST_TOKEN" value="'.REQUEST_TOKEN.'"> <input type="hidden" name="confirm" value="1">'; // Add the hidden fields foreach ($arrFiles as $strFile) { $return .= "\n" . '<input type="hidden" name="source[]" value="'.$strFile.'">'; } $count = 0; // Check the theme data foreach ($arrFiles as $strFile) { $return .= ' <div class="tl_'. (($count++ < 1) ? 't' : '') .'box"> <h3>'. basename($strFile) .'</h3> <h4>'.$GLOBALS['TL_LANG']['tl_theme']['tables_fields'].'</h4>'; // Find the XML file $objArchive = new ZipReader($strFile); // Continue if there is no XML file if ($objArchive->getFile('theme.xml') === false) { $blnHasError = true; $return .= "\n " . '<p style="margin:0;color:#c55">'. sprintf($GLOBALS['TL_LANG']['tl_theme']['missing_xml'], basename($strFile)) ."</p>\n</div>"; continue; } // Open the XML file $xml = new DOMDocument(); $xml->preserveWhiteSpace = false; $xml->loadXML($objArchive->unzip()); $tables = $xml->getElementsByTagName('table'); $tl_layout = null; $blnHasError = false; // Loop through the tables for ($i=0; $i<$tables->length; $i++) { $rows = $tables->item($i)->childNodes; $table = $tables->item($i)->getAttribute('name'); // Skip invalid tables if ($table != 'tl_theme' && $table != 'tl_style_sheet' && $table != 'tl_style' && $table != 'tl_module' && $table != 'tl_layout') { continue; } $fields = $rows->item(0)->childNodes; // Store the tl_layout element if ($table == 'tl_layout') { $tl_layout = $tables->item($i)->childNodes; } // Loop through the fields for ($j=0; $j<$fields->length; $j++) { $name = $fields->item($j)->getAttribute('name'); // Print a warning if a field is missing if (!in_array($name, $arrDbFields[$table])) { $blnHasError = true; $return .= "\n " . '<p style="margin:0; color:#c55">'. sprintf($GLOBALS['TL_LANG']['tl_theme']['missing_field'], $table .'.'. $name) .'</p>'; } } } // Confirmation if (!$blnHasError) { $return .= "\n " . '<p style="margin:0;color:#8ab858">'. $GLOBALS['TL_LANG']['tl_theme']['tables_ok'] .'</p>'; } $return .= ' <h4>'.$GLOBALS['TL_LANG']['tl_theme']['custom_sections'].'</h4>'; $blnHasLayout = false; $arrSections = trimsplit(',', $GLOBALS['TL_CONFIG']['customSections']); $arrProcessed = array(); // Loop through tl_layout for ($i=0; $i<$tl_layout->length; $i++) { $fields = $tl_layout->item($i)->childNodes; // Loop through the fields for ($j=0; $j<$fields->length; $j++) { if ($fields->item($j)->getAttribute('name') != 'modules') { continue; } $modules = deserialize($fields->item($j)->nodeValue); // Continue if there are no modules if (!is_array($modules) || empty($modules)) { continue; } // Check all columns foreach ($modules as $mod) { // Default columns if ($mod['col'] == 'header' || $mod['col'] == 'left' || $mod['col'] == 'main' || $mod['col'] == 'right' || $mod['col'] == 'footer') { continue; } // Do not show multiple warnings if (in_array($mod['col'], $arrProcessed) || in_array($mod['col'], $arrSections)) { continue; } $blnHasLayout = true; $arrProcessed[] = $mod['col']; $return .= "\n " . '<p style="margin:0;color:#c55">'. sprintf($GLOBALS['TL_LANG']['tl_theme']['missing_section'], $mod['col']) .'</p>'; } } } // Confirmation if (!$blnHasLayout) { $return .= "\n " . '<p style="margin:0;color:#8ab858">'. $GLOBALS['TL_LANG']['tl_theme']['sections_ok'] .'</p>'; } // Check the custom templates $return .= ' <h4>'.$GLOBALS['TL_LANG']['tl_theme']['custom_templates'].'</h4>'; $objArchive->reset(); $blnTplExists = false; // Loop through the archive while ($objArchive->next()) { if (strncmp($objArchive->file_name, 'templates/', 10) !== 0) { continue; } if (file_exists(TL_ROOT .'/'. $objArchive->file_name)) { $blnTplExists = true; $return .= "\n " . '<p style="margin:0;color:#c55">'. sprintf($GLOBALS['TL_LANG']['tl_theme']['template_exists'], $objArchive->file_name) .'</p>'; } } // Confirmation if (!$blnTplExists) { $return .= "\n " . '<p style="margin:0;color:#8ab858">'. $GLOBALS['TL_LANG']['tl_theme']['templates_ok'] .'</p>'; } $return .= ' </div>'; } // Return the form return $return . ' </div> <div class="tl_formbody_submit"> <div class="tl_submit_container"> <input type="submit" name="save" id="save" class="tl_submit" accesskey="s" value="'.specialchars($GLOBALS['TL_LANG']['MSC']['continue']).'"> </div> </div> </form>'; }