Browse Source

Merge branch 'core_features'

Conflicts:
	Themes/default/Admin.template.php
	Themes/default/css/index.css
	Themes/default/languages/Help.english.php
emanuele 12 years ago
parent
commit
e2d1b594c2

+ 4 - 2
Sources/Errors.php

@@ -175,7 +175,7 @@ function fatal_lang_error($error, $log = 'general', $sprintf = array())
 		$error_message = empty($sprintf) ? $txt[$error] : vsprintf($txt[$error], $sprintf);
 	}
 
-	setup_fatal_error_context($error_message);
+	setup_fatal_error_context($error_message, $error);
 }
 
 /**
@@ -261,7 +261,7 @@ function error_handler($error_level, $error_string, $file, $line)
  * error sub template.
  * @param string $error_message
  */
-function setup_fatal_error_context($error_message)
+function setup_fatal_error_context($error_message, $error_code)
 {
 	global $context, $txt, $ssi_on_error_method;
 	static $level = 0;
@@ -282,6 +282,8 @@ function setup_fatal_error_context($error_message)
 		$context['error_title'] = $txt['error_occured'];
 	$context['error_message'] = isset($context['error_message']) ? $context['error_message'] : $error_message;
 
+	$context['error_code'] = isset($error_code) ? 'id="' . $error_code . '" ' : '';
+
 	if (empty($context['page_title']))
 		$context['page_title'] = $context['error_title'];
 

+ 22 - 10
Sources/ManageSettings.php

@@ -187,7 +187,6 @@ function ModifyCoreFeatures($return_config = false)
 	/* This is an array of all the features that can be enabled/disabled - each option can have the following:
 		title		- Text title of this item (If standard string does not exist).
 		desc		- Description of this feature (If standard string does not exist).
-		image		- Custom image to show next to feature.
 		settings	- Array of settings to change (For each name => value) on enable - reverse is done for disable. If > 1 will not change value if set.
 		setting_callback- Function that returns an array of settings to save - takes one parameter which is value for this feature.
 		save_callback	- Function called on save, takes state as parameter.
@@ -354,18 +353,24 @@ function ModifyCoreFeatures($return_config = false)
 	if (isset($_POST['save']))
 	{
 		checkSession();
+
+	if (isset($_GET['xml']))
+	{
+		$tokenValidation = validateToken('admin-core', 'post', false);
+
+		if (empty($tokenValidation))
+			return 'token_verify_fail';
+	}
+	else
 		validateToken('admin-core');
 
 		$setting_changes = array('admin_features' => array());
 
-		// Are we using the javascript stuff or radios to submit?
-		$post_var_prefix = empty($_POST['js_worked']) ? 'feature_plain_' : 'feature_';
-
 		// Cycle each feature and change things as required!
 		foreach ($core_features as $id => $feature)
 		{
 			// Enabled?
-			if (!empty($_POST[$post_var_prefix . $id]))
+			if (!empty($_POST['feature_' . $id]))
 				$setting_changes['admin_features'][] = $id;
 
 			// Setting values to change?
@@ -373,14 +378,14 @@ function ModifyCoreFeatures($return_config = false)
 			{
 				foreach ($feature['settings'] as $key => $value)
 				{
-					if (empty($_POST[$post_var_prefix . $id]) || (!empty($_POST[$post_var_prefix . $id]) && ($value < 2 || empty($modSettings[$key]))))
-						$setting_changes[$key] = !empty($_POST[$post_var_prefix . $id]) ? $value : !$value;
+					if (empty($_POST['feature_' . $id]) || (!empty($_POST['feature_' . $id]) && ($value < 2 || empty($modSettings[$key]))))
+						$setting_changes[$key] = !empty($_POST['feature_' . $id]) ? $value : !$value;
 				}
 			}
 			// Is there a call back for settings?
 			if (isset($feature['setting_callback']))
 			{
-				$returned_settings = $feature['setting_callback'](!empty($_POST[$post_var_prefix . $id]));
+				$returned_settings = $feature['setting_callback'](!empty($_POST['feature_' . $id]));
 				if (!empty($returned_settings))
 					$setting_changes = array_merge($setting_changes, $returned_settings);
 			}
@@ -404,10 +409,11 @@ function ModifyCoreFeatures($return_config = false)
 		{
 			// Standard save callback?
 			if (isset($feature['save_callback']))
-				$feature['save_callback'](!empty($_POST[$post_var_prefix . $id]));
+				$feature['save_callback'](!empty($_POST['feature_' . $id]));
 		}
 
-		redirectexit('action=admin;area=corefeatures;' . $context['session_var'] . '=' . $context['session_id']);
+		if (!isset($_REQUEST['xml']))
+			redirectexit('action=admin;area=corefeatures;' . $context['session_var'] . '=' . $context['session_id']);
 	}
 
 	// Put them in context.
@@ -417,7 +423,9 @@ function ModifyCoreFeatures($return_config = false)
 			'title' => isset($feature['title']) ? $feature['title'] : $txt['core_settings_item_' . $id],
 			'desc' => isset($feature['desc']) ? $feature['desc'] : $txt['core_settings_item_' . $id . '_desc'],
 			'enabled' => in_array($id, $context['admin_features']),
+			'state' => in_array($id, $context['admin_features']) ? 'on' : 'off',
 			'url' => !empty($feature['url']) ? $scripturl . '?' . $feature['url'] . ';' . $context['session_var'] . '=' . $context['session_id'] : '',
+			'image' => (file_exists($settings['theme_dir'] . '/images/admin/feature_' . $id . '.png') ? $settings['images_url'] : $settings['default_images_url']) . '/admin/feature_' . $id . '.png',
 		);
 
 	// Are they a new user?
@@ -427,6 +435,10 @@ function ModifyCoreFeatures($return_config = false)
 	if ($context['is_new_install'])
 		updateSettings(array('admin_features' => ''));
 
+	// sub_template is already generic_xml and the token is created somewhere else
+	if (isset($_REQUEST['xml']))
+		return;
+
 	$context['sub_template'] = 'core_features';
 	$context['page_title'] = $txt['core_settings_title'];
 

+ 4 - 1
Sources/Security.php

@@ -83,7 +83,10 @@ function validateSession($type = 'admin')
 	}
 
 	// Need to type in a password for that, man.
-	adminLogin($type);
+	if (!isset($_GET['xml']))
+		adminLogin($type);
+	else
+		return 'session_verify_fail';
 }
 
 /**

+ 90 - 0
Sources/Xml.php

@@ -28,6 +28,9 @@ function XMLhttpMain()
 		'messageicons' => array(
 			'function' => 'ListMessageIcons',
 		),
+		'corefeatures' => array(
+			'function' => 'EnableCoreFeatures',
+		),
 	);
 	if (!isset($_REQUEST['sa'], $sub_actions[$_REQUEST['sa']]))
 		fatal_lang_error('no_access', false);
@@ -71,4 +74,91 @@ function ListMessageIcons()
 	$context['sub_template'] = 'message_icons';
 }
 
+function EnableCoreFeatures()
+{
+	global $context, $smcFunc, $sourcedir, $modSettings, $txt;
+
+	$context['xml_data'] = array();
+	// Just in case, maybe we don't need it
+	loadLanguage('Errors');
+
+	$errors = array();
+	$returns = array();
+	$tokens = array();
+	if (allowedTo('admin_forum'))
+	{
+		$validation = validateSession();
+		if (empty($validation))
+		{
+			require_once($sourcedir . '/ManageSettings.php');
+			$result = ModifyCoreFeatures();
+
+			if (empty($result))
+			{
+				$id = isset($_POST['feature_id']) ? $_POST['feature_id'] : '';
+
+				if (!empty($id) && isset($context['features'][$id]))
+				{
+					$feature = $context['features'][$id];
+
+					$returns[] = array(
+						'value' => (!empty($_POST['feature_' . $id]) && $feature['url'] ? '<a href="' . $feature['url'] . '">' . $feature['title'] . '</a>' : $feature['title']),
+					);
+
+					createToken('admin-core', 'post');
+					$tokens = array(
+						array(
+							'value' => $context['admin-core_token'],
+							'attributes' => array('type' => 'token_var'),
+						),
+						array(
+							'value' => $context['admin-core_token_var'],
+							'attributes' => array('type' => 'token'),
+						),
+					);
+				}
+				else
+				{
+					$errors[] = array(
+						'value' => $txt['feature_no_exists'],
+					);
+				}
+			}
+			else
+			{
+				$errors[] = array(
+					'value' => $txt[$result],
+				);
+			}
+		}
+		else
+		{
+			$errors[] = array(
+				'value' => $txt[$validation],
+			);
+		}
+	}
+	else
+	{
+		$errors[] = array(
+			'value' => $txt['cannot_admin_forum']
+		);
+	}
+
+	$context['sub_template'] = 'generic_xml';
+	$context['xml_data'] = array (
+		'corefeatures' => array (
+			'identifier' => 'corefeature',
+			'children' => $returns,
+		),
+		'tokens' => array (
+			'identifier' => 'token',
+			'children' => $tokens,
+		),
+		'errors' => array (
+			'identifier' => 'error',
+			'children' => $errors,
+		),
+	);
+}
 ?>

+ 2 - 2
Themes/core/css/index.css

@@ -2757,7 +2757,7 @@ dl
 }
 
 /* Simple feedback messages */
-div#profile_error, div#profile_success
+div#profile_error, div#profile_success, div.successbox
 {
 	margin: 0 0 1em 0;
 	padding: 1em 2em;
@@ -2775,7 +2775,7 @@ div#profile_error span
 	text-decoration: underline;
 }
 
-div#profile_success
+div#profile_success, div.successbox
 {
 	border-color: green;
 	color: green;

+ 79 - 51
Themes/default/Admin.template.php

@@ -1326,20 +1326,71 @@ function template_core_features()
 
 	echo '
 	<script type="text/javascript"><!-- // --><![CDATA[
-		function toggleItem(itemID)
-		{
-			// Toggle the hidden item.
-			var itemValueHandle = document.getElementById("feature_" + itemID);
-			itemValueHandle.value = itemValueHandle.value == 1 ? 0 : 1;
-
-			// Change the image, alternative text and the title.
-			document.getElementById("switch_" + itemID).src = \'', $settings['images_url'], '/admin/switch_\' + (itemValueHandle.value == 1 ? \'on\' : \'off\') + \'.png\';
-			document.getElementById("switch_" + itemID).alt = itemValueHandle.value == 1 ? \'', $txt['core_settings_switch_off'], '\' : \'', $txt['core_settings_switch_on'], '\';
-			document.getElementById("switch_" + itemID).title = itemValueHandle.value == 1 ? \'', $txt['core_settings_switch_off'], '\' : \'', $txt['core_settings_switch_on'], '\';
-
-			// Don\'t reload.
-			return false;
-		}
+		var token_name;
+		var token_value;
+		$(document).ready(function() {
+			$(".core_features_hide").css(\'display\', \'none\');
+			$(".core_features_img").css({\'cursor\': \'pointer\', \'display\': \'\'});
+			$("#core_features_submit").css(\'display\', \'none\');
+			if (token_name == undefined)
+				token_name = $("#core_features_token").attr("name")
+			if (token_value == undefined)
+				token_value = $("#core_features_token").attr("value")
+			$(".core_features_img").click(function(){
+				var cc = $(this);
+				var cf = $(this).attr("id").substring(7);
+				var imgs = new Array("', $settings['images_url'], '/admin/switch_off.png", "', $settings['images_url'], '/admin/switch_on.png");
+				var new_state = !$("#feature_" + cf).attr("checked");
+				$("#feature_" + cf).attr("checked", new_state);
+
+				data = {save: "save", feature_id: cf};
+				data[$("#core_features_session").attr("name")] = $("#core_features_session").attr("value");
+				data[token_name] = token_value;
+				$(".core_features_status_box").each(function(){
+					data[$(this).attr("name")] = !$(this).attr("checked") ? 0 : 1;
+				});
+
+				// Launch AJAX request.
+				$.ajax({
+					// The link we are accessing.
+					url: "', $scripturl, '?action=xmlhttp;sa=corefeatures;xml",
+					// The type of request.
+					type: "post",
+					// The type of data that is getting returned.
+					data: data,
+					error: function(error){
+							$("#activation_message").html(error).slideDown(\'fast\');
+					},
+
+					success: function(request){
+						if ($(request).find("errors").find("error").length != 0)
+						{
+							$("#activation_message").html($(request).find("errors").find("error").text()).slideDown(\'fast\');
+						}
+						else if ($(request).find("smf").length != 0)
+						{
+							$("#feature_link_" + cf).html($(request).find("corefeatures").find("corefeature").text());
+							cc.attr("src", imgs[new_state ? 1 : 0]);
+							$("#feature_link_" + cf).fadeOut().fadeIn();
+							$("#activation_message").attr(\'class\', \'successbox\');
+							var message = new_state ? ' . JavaScriptEscape($txt['core_settings_activation_message']) . ' : ' . JavaScriptEscape($txt['core_settings_deactivation_message']) . ';
+							$("#activation_message").html(message.replace(\'{core_feature}\', $(request).find("corefeatures").find("corefeature").text())).slideDown(\'fast\');
+							setTimeout(function() {
+								$("#activation_message").slideUp();
+							}, 5000);
+
+							token_name = $(request).find("tokens").find(\'[type="token"]\').text();
+							token_value = $(request).find("tokens").find(\'[type="token_var"]\').text();
+						}
+						else
+						{
+							$("#activation_message").html(' . JavaScriptEscape($txt['core_settings_generic_error']) . ').slideDown(\'fast\');
+							
+						}
+					}
+				});
+			});
+		});
 	// ]]></script>
 	<div id="admincenter">';
 	if ($context['is_new_install'])
@@ -1356,12 +1407,13 @@ function template_core_features()
 	}
 
 	echo '
-		<form action="', $scripturl, '?action=admin;area=corefeatures;" method="post" accept-charset="', $context['character_set'], '">
+		<form id="core_features" action="', $scripturl, '?action=admin;area=corefeatures" method="post" accept-charset="', $context['character_set'], '">
 			<div class="cat_bar">
 				<h3 class="catbg">
 					', $txt['core_settings_title'], '
 				</h3>
-			</div>';
+			</div>
+			<div style="display:none" id="activation_message" class="errorbox"></div>';
 
 	$alternate = true;
 	$num = 0;
@@ -1373,32 +1425,14 @@ function template_core_features()
 			<div class="windowbg', $alternate ? '2' : '', '">
 				<span class="topslice"><span></span></span>
 				<div class="content features">
-					<img class="features_image" src="', $settings['images_url'], '/admin/feature_', $id, '.png" alt="', $feature['title'], '" />
-					<div class="features_switch" id="js_feature_', $id, '" style="display: none;">
-						<a href="', $scripturl, '?action=admin;area=featuresettings;sa=core;', $context['session_var'], '=', $context['session_id'], ';toggle=', $id, ';state=', $feature['enabled'] ? 0 : 1, '" onclick="return toggleItem(\'', $id, '\');">
-							<input type="hidden" name="feature_', $id, '" id="feature_', $id, '" value="', $feature['enabled'] ? 1 : 0, '" /><img src="', $settings['images_url'], '/admin/switch_', $feature['enabled'] ? 'on' : 'off', '.png" id="switch_', $id, '" style="margin-top: 1.3em;" alt="', $txt['core_settings_switch_' . ($feature['enabled'] ? 'off' : 'on')], '" title="', $txt['core_settings_switch_' . ($feature['enabled'] ? 'off' : 'on')], '" />
-						</a>
+					<img class="features_image" src="', $feature['image'], '" alt="', $feature['title'], '" />
+					<div class="features_switch" id="js_feature_', $id, '">
+							<label class="core_features_hide" for="feature_', $id, '">', $txt['core_settings_enabled'], '<input class="core_features_status_box" type="checkbox" name="feature_', $id, '" id="feature_', $id, '"', $feature['enabled'] ? ' checked="checked"' : '', ' /></label>
+							<img class="core_features_img ', $feature['state'], '" src="', $settings['images_url'], '/admin/switch_', $feature['state'], '.png" id="switch_', $id, '" style="margin-top: 1.3em;display:none" alt="', $txt['core_settings_switch_' . $feature['state']], '" title="', $txt['core_settings_switch_' . $feature['state']], '" />
 					</div>
-					<h4>', ($feature['enabled'] && $feature['url'] ? '<a href="' . $feature['url'] . '">' . $feature['title'] . '</a>' : $feature['title']), '</h4>
+					<h4 id="feature_link_' . $id . '">', ($feature['enabled'] && $feature['url'] ? '<a href="' . $feature['url'] . '">' . $feature['title'] . '</a>' : $feature['title']), '</h4>
 					<p>', $feature['desc'], '</p>
-					<div id="plain_feature_', $id, '">
-						<label for="plain_feature_', $id, '_radio_on"><input type="radio" name="feature_plain_', $id, '" id="plain_feature_', $id, '_radio_on" value="1"', $feature['enabled'] ? ' checked="checked"' : '', ' class="input_radio" />', $txt['core_settings_enabled'], '</label>
-						<label for="plain_feature_', $id, '_radio_off"><input type="radio" name="feature_plain_', $id, '" id="plain_feature_', $id, '_radio_off" value="0"', !$feature['enabled'] ? ' checked="checked"' : '', ' class="input_radio" />', $txt['core_settings_disabled'], '</label>
-					</div>
-				</div>';
-				
-		// last feature, show the save button
-		if ($num == $num_features)
-			echo '
-				<div class="content">
-					<hr class="color clear" />
-					<input type="hidden" name="', $context['session_var'], '" value="', $context['session_id'], '" />
-					<input type="hidden" name="', $context['admin-core_token_var'], '" value="', $context['admin-core_token'], '" />
-					<input type="hidden" value="0" name="js_worked" id="js_worked" />
-					<input type="submit" value="', $txt['save'], '" name="save" class="button_submit" />
-				</div>';
-	
-		echo '
+				</div>
 				<span class="botslice clear_right"><span></span></span>
 			</div>';
 
@@ -1406,20 +1440,14 @@ function template_core_features()
 	}
 
 	echo '
+			<div class="righttext">
+				<input id="core_features_session" type="hidden" name="', $context['session_var'], '" value="', $context['session_id'], '" />
+				<input id="core_features_token" type="hidden" name="', $context['admin-core_token_var'], '" value="', $context['admin-core_token'], '" />
+				<input id="core_features_submit" type="submit" value="', $txt['save'], '" name="save" class="button_submit" />
+			</div>
 		</form>
 	</div>
 	<br class="clear" />';
-
-	// Turn on the pretty javascript if we can!
-	echo '
-	<script type="text/javascript"><!-- // --><![CDATA[
-		document.getElementById(\'js_worked\').value = "1";';
-		foreach ($context['features'] as $id => $feature)
-			echo '
-		document.getElementById(\'js_feature_', $id, '\').style.display = "";
-		document.getElementById(\'plain_feature_', $id, '\').style.display = "none";';
-	echo '
-	// ]]></script>';
 }
 
 

+ 1 - 1
Themes/default/Errors.template.php

@@ -30,7 +30,7 @@ function template_fatal_error()
 		</div>
 		<div class="windowbg">
 			<span class="topslice"><span></span></span>
-			<div class="padding">', $context['error_message'], '</div>
+			<div ', $context['error_code'], 'class="padding">', $context['error_message'], '</div>
 			<span class="botslice"><span></span></span>
 		</div>
 	</div>';

+ 2 - 2
Themes/default/css/compat.css

@@ -1697,7 +1697,7 @@ dl
 }
 
 /* Simple feedback messages */
-div#profile_error, div#profile_success
+div#profile_error, div#profile_success, div.successbox
 {
 	margin: 0 0 1em 0;
 	padding: 1em 2em;
@@ -1715,7 +1715,7 @@ div#profile_error span
 	text-decoration: underline;
 }
 
-div#profile_success
+div#profile_success, div.successbox
 {
 	border-color: green;
 	color: green;

+ 4 - 0
Themes/default/languages/Admin.english.php

@@ -586,6 +586,10 @@ $txt['signature_settings_short'] = 'Signatures';
 $txt['custom_profile_shorttitle'] = 'Profile Fields';
 $txt['pruning_title'] = 'Log Pruning';
 
+$txt['core_settings_activation_message'] = 'The Feature {core_feature} has been activated, click on the title to configure it';
+$txt['core_settings_deactivation_message'] = 'The Feature {core_feature} has been deactivated';
+$txt['core_settings_generic_error'] = 'An unforeseen error occurred, please relod the page and try again';
+
 $txt['boardsEdit'] = 'Modify Boards';
 $txt['mboards_new_cat'] = 'Create New Category';
 $txt['manage_holidays'] = 'Manage Holidays';

+ 1 - 0
Themes/default/languages/Errors.english.php

@@ -34,6 +34,7 @@ $txt['not_enough_posts_karma'] = 'Sorry, you don\'t have enough posts to modify
 $txt['cant_change_own_karma'] = 'Sorry, you are not permitted to modify your own karma.';
 $txt['karma_wait_time'] = 'Sorry, you can\'t repeat a karma action without waiting %1$s %2$s.';
 $txt['feature_disabled'] = 'Sorry, this feature is disabled.';
+$txt['feature_no_exists'] = 'Sorry, this feature doesn\'t exists.';
 $txt['cant_access_upload_path'] = 'Cannot access attachments upload path!';
 $txt['file_too_big'] = 'Your file is too large. The maximum attachment size allowed is %1$d kB.';
 $txt['attach_timeout'] = 'Your attachment couldn\'t be saved. This might happen because it took too long to upload or the file is bigger than the server will allow.<br /><br />Please consult your server administrator for more information.';