Browse Source

Some more goodies

Signed-off-by: Suki <[email protected]>
Suki 11 years ago
parent
commit
df50b6f4c5
2 changed files with 140 additions and 107 deletions
  1. 122 103
      Sources/Subs-Themes.php
  2. 18 4
      Sources/Themes.php

+ 122 - 103
Sources/Subs-Themes.php

@@ -56,130 +56,149 @@ function get_single_theme($id)
 	return $single;
 }
 
-function theme_install()
+function get_theme_info($path)
 {
+	global $sourcedir, $forum_version;
+
+	if (empty($path))
+		return false;
+
+	$xml_data = array();
+
+	// Parse theme-info.xml into an xmlArray.
+	require_once($sourcedir . '/Class-Package.php');
+	$theme_info_xml = new xmlArray(file_get_contents($path . '/theme_info.xml'));
+
+	// Error message, there isn't any valid info.
+	if (!$theme_info_xml->exists('theme-info[0]'))
+		fatal_lang_error('package_get_error_packageinfo_corrupt', false);
+
+	// Check for compatibility with 2.1 or greater.
+	if (!$theme_info_xml->exists('theme-info/install'))
+		fatal_lang_error('package_get_error_theme_not_compatible', false, $forum_version);
+
+	// So, we have an install tag which is cool and stuff but we also need to check it and match your current SMF version...
+	$the_version = strtr($forum_version, array('SMF ' => ''));
+	$install_versions = $theme_info_xml->path('theme-info/install/@for');
+
+	// The theme isn't compatible with the current SMF version.
+	if (!$install_versions || !matchPackageVersion($the_version, $install_versions))
+		fatal_lang_error('package_get_error_theme_not_compatible', false, $forum_version);
+
+	$theme_info_xml = $theme_info_xml->path('theme-info[0]');
+	$theme_info_xml = $theme_info_xml->to_array();
+
+	$xml_elements = array(
+		'name' => 'name',
+		'theme_layers' => 'layers',
+		'theme_templates' => 'templates',
+		'based_on' => 'based-on',
+		'version' => 'version',
+	);
+
+	// Assign the values to be stored.
+	foreach ($xml_elements as $var => $name)
+		if (!empty($theme_info_xml[$name]))
+			$xml_data[$var] = $theme_info_xml[$name];
+
+	return $xml_data;
+}
+
+function theme_install($to_install = array())
+{
+	global $sourcedir, $txt, $context, $boarddir, $boardurl;
+	global $themedir, $themeurl;
+
+	// External use? no problem!
+	if ($to_install)
+		$context['to_install'] = $to_install;
+
+	// We kinda need this and it should have been previously set.
+	if (empty($context['to_install']))
+		return false;
+
 	// One last check.
-	if ($theme_dir != '' && basename($theme_dir) != 'Themes')
+	if ($context['to_install']['dir'] != '' && basename($context['to_install']['dir']) != 'Themes')
 		return false;
 
 	// Defaults.
 	$context['to_install'] = array(
-		'theme_url' => $boardurl . '/Themes/' . basename($theme_dir),
-		'images_url' => isset($images_url) ? $images_url : $boardurl . '/Themes/' . basename($theme_dir) . '/images',
-		'theme_dir' => $theme_dir,
+		'theme_url' => $boardurl . '/Themes/' . basename($context['to_install']['dir']),
 		'name' => $theme_name
 	);
 
+	// This vars could have been set, it all depends from where are we coming.
+	if (empty($context['to_install']['images_url']))
+		$context['to_install']['images_url'] = $boardurl . '/Themes/' . basename($context['to_install']['dir']) . '/images';
+
 	// Perhaps they are trying to install a mod, lets tell them nicely this is the wrong function.
-	if (file_exists($theme_dir . '/package-info.xml'))
+	if (file_exists($context['to_install']['dir'] . '/package-info.xml'))
 	{
 		$txt['package_get_error_is_mod'] = str_replace('{MANAGEMODURL}', $scripturl . '?action=admin;area=packages;' . $context['session_var'] . '=' . $context['session_id'], $txt['package_get_error_is_mod']);
 		fatal_lang_error('package_theme_upload_error_broken', false, $txt['package_get_error_is_mod']);
 	}
 
-	// Get the theme info.
-	elseif (file_exists($theme_dir . '/theme_info.xml'))
+	// OK, is this a newer version of an already installed theme?
+	if (!empty($context['to_install']['version']))
 	{
-		$theme_info = file_get_contents($theme_dir . '/theme_info.xml');
-
-		// Parse theme-info.xml into an xmlArray.
-		require_once($sourcedir . '/Class-Package.php');
-		$theme_info_xml = new xmlArray($theme_info);
-
-		// Error message, there isn't any valid info.
-		if (!$theme_info_xml->exists('theme-info[0]'))
-			fatal_lang_error('package_get_error_packageinfo_corrupt', false);
-
-		// Check for compatibility with 2.1 or greater.
-		if (!$theme_info_xml->exists('theme-info/install'))
-			fatal_lang_error('package_get_error_theme_not_compatible', false, $forum_version);
-
-		// So, we have an install tag which is cool and stuff but we also need to check it and match your current SMF version...
-		$the_version = strtr($forum_version, array('SMF ' => ''));
-		$install_versions = $theme_info_xml->path('theme-info/install/@for');
-
-		// The theme isn't compatible with the current SMF version.
-		if (!$install_versions || !matchPackageVersion($the_version, $install_versions))
-			fatal_lang_error('package_get_error_theme_not_compatible', false, $forum_version);
-
-		$theme_info_xml = $theme_info_xml->path('theme-info[0]');
-		$theme_info_xml = $theme_info_xml->to_array();
-
-		$xml_elements = array(
-			'name' => 'name',
-			'theme_layers' => 'layers',
-			'theme_templates' => 'templates',
-			'based_on' => 'based-on',
-			'version' => 'version',
+		$to_update = array();
+		$request = $smcFunc['db_query']('', '
+			SELECT th.value AS name, th.id_theme, th2.value AS version
+			FROM {db_prefix}themes AS th
+				INNER JOIN {db_prefix}themes AS th2 ON (th2.id_theme = th.id_theme
+					AND th2.id_member = {int:no_member}
+					AND th2.variable = {string:version})
+			WHERE th.id_member = {int:no_member}
+				AND th.variable = {string:name}
+				AND th.value LIKE {string:name_value}
+			LIMIT 1',
+			array(
+				'no_member' => 0,
+				'name' => 'name',
+				'version' => 'version',
+				'name_value' => '%'. $context['to_install']['name'] .'%',
+			)
 		);
+		$to_update = $smcFunc['db_fetch_assoc']($request);
+		$smcFunc['db_free_result']($request);
 
-		// Assign the values to be stored.
-		foreach ($xml_elements as $var => $name)
-			if (!empty($theme_info_xml[$name]))
-				$context['to_install'][$var] = $theme_info_xml[$name];
-
-		// OK, is this a newer version of an already installed theme?
-		if (!empty($context['to_install']['version']))
-		{
-			$to_update = array();
-			$request = $smcFunc['db_query']('', '
-				SELECT th.value AS name, th.id_theme, th2.value AS version
-				FROM {db_prefix}themes AS th
-					INNER JOIN {db_prefix}themes AS th2 ON (th2.id_theme = th.id_theme
-						AND th2.id_member = {int:no_member}
-						AND th2.variable = {string:version})
-				WHERE th.id_member = {int:no_member}
-					AND th.variable = {string:name}
-					AND th.value LIKE {string:name_value}
-				LIMIT 1',
-				array(
-					'no_member' => 0,
-					'name' => 'name',
-					'version' => 'version',
-					'name_value' => '%'. $context['to_install']['name'] .'%',
-				)
-			);
-			$to_update = $smcFunc['db_fetch_assoc']($request);
-			$smcFunc['db_free_result']($request);
-
-			// Got something, lets figure it out what to do next.
-			if (!empty($to_update) && !empty($to_update['version']))
-				switch (compareVersions($context['to_install']['version'], $to_update['version']))
-				{
-					case 0: // This is exactly the same theme.
-					case -1: // The one being installed is older than the one already installed.
-					default: // Any other possible result.
-						fatal_lang_error('package_get_error_theme_no_new_version', false, array($context['to_install']['version'], $to_update['version']));
-						break;
-					case 1: // Got a newer version, update the old entry.
-						$smcFunc['db_query']('', '
-							UPDATE {db_prefix}themes
-							SET value = {string:new_value}
-							WHERE variable = {string:version}
-								AND id_theme = {int:id_theme}',
-							array(
-								'new_value' => $context['to_install']['version'],
-								'version' => 'version',
-								'id_theme' => $to_update['id_theme'],
-							)
-						);
-
-						// Do a redirect and set a nice updated message.
-						redirectexit('action=admin;area=theme;sa=install;theme_id=' . $to_update['id_theme'] . ';updated;' . $context['session_var'] . '=' . $context['session_id']);
-						break;
-				}
-		}
-
-		if (!empty($theme_info_xml['images']))
-		{
-			$context['to_install']['images_url'] = $context['to_install']['theme_url'] . '/' . $theme_info_xml['images'];
-			$explicit_images = true;
-		}
+		// Got something, lets figure it out what to do next.
+		if (!empty($to_update) && !empty($to_update['version']))
+			switch (compareVersions($context['to_install']['version'], $to_update['version']))
+			{
+				case 0: // This is exactly the same theme.
+				case -1: // The one being installed is older than the one already installed.
+				default: // Any other possible result.
+					fatal_lang_error('package_get_error_theme_no_new_version', false, array($context['to_install']['version'], $to_update['version']));
+					break;
+				case 1: // Got a newer version, update the old entry.
+					$smcFunc['db_query']('', '
+						UPDATE {db_prefix}themes
+						SET value = {string:new_value}
+						WHERE variable = {string:version}
+							AND id_theme = {int:id_theme}',
+						array(
+							'new_value' => $context['to_install']['version'],
+							'version' => 'version',
+							'id_theme' => $to_update['id_theme'],
+						)
+					);
+
+					// Do a redirect and set a nice updated message.
+					redirectexit('action=admin;area=theme;sa=install;theme_id=' . $to_update['id_theme'] . ';updated;' . $context['session_var'] . '=' . $context['session_id']);
+					break;
+			}
+	}
 
-		if (!empty($theme_info_xml['extra']))
-			$context['to_install'] += unserialize($theme_info_xml['extra']);
+	if (!empty($theme_info_xml['images']))
+	{
+		$context['to_install']['images_url'] = $context['to_install']['theme_url'] . '/' . $theme_info_xml['images'];
+		$explicit_images = true;
 	}
 
+	if (!empty($theme_info_xml['extra']))
+		$context['to_install'] += unserialize($theme_info_xml['extra']);
+
 	if (isset($context['to_install']['based_on']))
 	{
 		// No need for elaborated stuff when the theme is based on the default one.

+ 18 - 4
Sources/Themes.php

@@ -1348,11 +1348,21 @@ function InstallFile()
 	// Extract the file on the proper themes dir.
 	$extracted = read_tgz_file($_FILES['theme_gz']['tmp_name'], $context['to_install']['dir'], false, true);
 
-	// Read its info form the XML file.
+	if ($extracted)
+	{
+
+		// Read its info form the XML file.
+		$context['to_install'] += get_theme_info($context['to_install']['dir']);
 
-	// Install the theme.
+		// Install the theme. theme_install() will take care of possible errors.
+		$id = theme_install($context['to_install']);
+
+		// return the ID.
+		return $id;
+	}
 
-	// return the ID.
+	else
+		fatal_lang_error('theme_install_error_title', false);
 }
 
 function InstallDir()
@@ -1367,7 +1377,11 @@ function InstallDir()
 	elseif (!is_dir($_REQUEST['theme_dir']) || !file_exists($_REQUEST['theme_dir'] . '/theme_info.xml'))
 		fatal_lang_error('theme_install_error', false);
 
-	// All good!
+	// All good! set some needed vars.
+		$context['to_install'] = array(
+		'name' => $theme_name,
+		'dir' => $themedir . '/' . $theme_name,
+	);
 }
 
 /**