Reload the widget form with the ajax response after save, add Close link to the widgets, don't auto-close on save to show possible errors returned from validation

git-svn-id: http://svn.automattic.com/wordpress/trunk@11498 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
azaozz 2009-05-31 11:34:08 +00:00
parent f09eba1776
commit b7bc0faa73
7 changed files with 79 additions and 27 deletions

View File

@ -1289,6 +1289,9 @@ case 'save-widget' :
$id_base = $_POST['id_base']; $id_base = $_POST['id_base'];
$widget_id = $_POST['widget-id']; $widget_id = $_POST['widget-id'];
$sidebar_id = $_POST['sidebar']; $sidebar_id = $_POST['sidebar'];
$multi_number = !empty($_POST['multi_number']) ? (int) $_POST['multi_number'] : 0;
$settings = isset($_POST['widget-' . $id_base]) && is_array($_POST['widget-' . $id_base]) ? $_POST['widget-' . $id_base] : false;
$error = '<p>' . __('An error has occured. Please reload the page and try again.') . '</p>';
$sidebars = wp_get_sidebars_widgets(); $sidebars = wp_get_sidebars_widgets();
$sidebar = isset($sidebars[$sidebar_id]) ? $sidebars[$sidebar_id] : array(); $sidebar = isset($sidebars[$sidebar_id]) ? $sidebars[$sidebar_id] : array();
@ -1297,10 +1300,17 @@ case 'save-widget' :
if ( isset($_POST['delete_widget']) && $_POST['delete_widget'] ) { if ( isset($_POST['delete_widget']) && $_POST['delete_widget'] ) {
if ( !isset($wp_registered_widgets[$widget_id]) ) if ( !isset($wp_registered_widgets[$widget_id]) )
die('-1'); die($error);
$sidebar = array_diff( $sidebar, array($widget_id) ); $sidebar = array_diff( $sidebar, array($widget_id) );
$_POST = array('sidebar' => $sidebar_id, 'widget-' . $id_base => array(), 'the-widget-id' => $widget_id, 'delete_widget' => '1'); $_POST = array('sidebar' => $sidebar_id, 'widget-' . $id_base => array(), 'the-widget-id' => $widget_id, 'delete_widget' => '1');
} elseif ( $settings && preg_match( '/__i__|%i%/', key($settings) ) ) {
if ( !$multi_number )
die($error);
$_POST['widget-' . $id_base] = array( $multi_number => array_shift($settings) );
$widget_id = $id_base . '-' . $multi_number;
$sidebar[] = $widget_id;
} }
$_POST['widget-id'] = $sidebar; $_POST['widget-id'] = $sidebar;
@ -1324,7 +1334,13 @@ case 'save-widget' :
die(); die();
} }
die('1'); if ( !empty($_POST['add_new']) )
die();
if ( $form = $wp_registered_widget_controls[$widget_id] )
call_user_func_array( $form['callback'], $form['params'] );
die();
break; break;
default : default :
do_action( 'wp_ajax_' . $_POST['action'] ); do_action( 'wp_ajax_' . $_POST['action'] );

View File

@ -188,7 +188,7 @@ a.widget-action {
.widget .widget-inside, .widget .widget-inside,
.widget .widget-description { .widget .widget-description {
padding: 15px; padding: 12px 12px 10px;
font-size: 11px; font-size: 11px;
line-height: 16px; line-height: 16px;
} }
@ -226,6 +226,18 @@ a.widget-action {
text-decoration: none; text-decoration: none;
} }
.widget-control-actions a:hover {
text-decoration: underline;
}
.widget-control-actions .ajax-feedback {
padding-bottom: 3px;
}
.widget-control-actions div.alignleft {
margin-top: 6px;
}
div#sidebar-info { div#sidebar-info {
padding: 0 1em; padding: 0 1em;
margin-bottom: 1em; margin-bottom: 1em;

View File

@ -168,12 +168,13 @@ function wp_widget_control( $sidebar_args ) {
<div class="widget-inside"> <div class="widget-inside">
<form action="" method="post"> <form action="" method="post">
<div class="widget-content">
<?php <?php
if ( isset($control['callback']) ) if ( isset($control['callback']) )
$has_form = call_user_func_array( $control['callback'], $control['params'] ); $has_form = call_user_func_array( $control['callback'], $control['params'] );
else else
echo "\t\t<p>" . __('There are no options for this widget.') . "</p>\n"; ?> echo "\t\t<p>" . __('There are no options for this widget.') . "</p>\n"; ?>
</div>
<input type="hidden" name="widget-id" class="widget-id" value="<?php echo esc_attr($id_format); ?>" /> <input type="hidden" name="widget-id" class="widget-id" value="<?php echo esc_attr($id_format); ?>" />
<input type="hidden" name="id_base" class="id_base" value="<?php echo esc_attr($id_base); ?>" /> <input type="hidden" name="id_base" class="id_base" value="<?php echo esc_attr($id_base); ?>" />
<input type="hidden" name="widget-width" class="widget-width" value="<?php echo esc_attr($control['width']); ?>" /> <input type="hidden" name="widget-width" class="widget-width" value="<?php echo esc_attr($control['width']); ?>" />
@ -183,9 +184,15 @@ function wp_widget_control( $sidebar_args ) {
<input type="hidden" name="add_new" class="add_new" value="<?php echo esc_attr($add_new); ?>" /> <input type="hidden" name="add_new" class="add_new" value="<?php echo esc_attr($add_new); ?>" />
<div class="widget-control-actions"> <div class="widget-control-actions">
<a class="button widget-control-remove alignleft" href="#remove"><?php _e('Remove'); ?></a> <div class="alignleft">
<a class="widget-control-remove" href="#remove"><?php _e('Remove'); ?></a> |
<a class="widget-control-close" href="#close"><?php _e('Close'); ?></a>
</div>
<?php if ( 'noform' !== $has_form ) { ?> <?php if ( 'noform' !== $has_form ) { ?>
<input type="submit" name="savewidget" class="button-primary widget-control-save alignright" value="<?php esc_attr_e('Save'); ?>" /> <div class="alignright">
<img src="images/wpspin_light.gif" class="ajax-feedback " title="" alt="" />
<input type="submit" name="savewidget" class="button-primary widget-control-save" value="<?php esc_attr_e('Save'); ?>" />
</div>
<?php } ?> <?php } ?>
<br class="clear" /> <br class="clear" />
</div> </div>

View File

@ -92,7 +92,7 @@ wpWidgets = {
ui.item.draggable('destroy'); ui.item.draggable('destroy');
if ( ui.item.hasClass('deleting') ) { if ( ui.item.hasClass('deleting') ) {
wpWidgets.save( ui.item, 1, 0, 0, 1 ); // delete widget wpWidgets.save( ui.item, 1, 0, 1 ); // delete widget
ui.item.remove(); ui.item.remove();
return; return;
} }
@ -112,7 +112,7 @@ wpWidgets = {
rem = 'div#' + id; rem = 'div#' + id;
} }
wpWidgets.addEvents(ui.item); wpWidgets.addEvents(ui.item);
wpWidgets.save( ui.item, 0, 0, 0, 1 ); wpWidgets.save( ui.item, 0, 0, 1 );
ui.item.find('input.add_new').val(''); ui.item.find('input.add_new').val('');
ui.item.find('a.widget-action').click(); ui.item.find('a.widget-action').click();
return; return;
@ -125,12 +125,7 @@ wpWidgets = {
} }
}).not(':visible').sortable('disable'); }).not(':visible').sortable('disable');
wpWidgets.resize(); wpWidgets.resize();
wpWidgets.fixLabels();
$('.widget-inside label').each(function(){
var f = $(this).attr('for');
if ( f && f == $('input', this).attr('id') )
$(this).removeAttr('for');
});
}, },
saveOrder : function(sb) { saveOrder : function(sb) {
@ -153,10 +148,10 @@ wpWidgets = {
this.resize(); this.resize();
}, },
save : function(widget, del, close, animate, order) { save : function(widget, del, animate, order) {
var sb = widget.parents('.widgets-sortables').attr('id'), data = widget.find('form').serialize(), a; var sb = widget.parents('.widgets-sortables').attr('id'), data = widget.find('form').serialize(), a;
widget = $(widget); widget = $(widget);
$('#' + sb).parents('.widgets-holder-wrap').find('.ajax-feedback').css('visibility', 'visible'); widget.find('.ajax-feedback').css('visibility', 'visible');
a = { a = {
action: 'save-widget', action: 'save-widget',
@ -191,12 +186,13 @@ wpWidgets = {
widget.remove(); widget.remove();
wpWidgets.resize(); wpWidgets.resize();
} }
} else if ( close ) { } else {
widget.find('.widget-inside').slideUp('fast', function(){ $('.ajax-feedback').css('visibility', 'hidden');
widget.css({'width':'','marginLeft':''}); if ( r && r.length > 2 ) {
$('.widget-content', widget).html(r);
wpWidgets.appendTitle(widget); wpWidgets.appendTitle(widget);
$('.ajax-feedback').css('visibility', 'hidden'); wpWidgets.fixLabels(widget);
}); }
} }
if ( order ) if ( order )
wpWidgets.saveOrder(); wpWidgets.saveOrder();
@ -230,6 +226,23 @@ wpWidgets = {
KhtmlUserSelect: n KhtmlUserSelect: n
}); });
}, },
fixLabels : function(sc) {
sc = sc || document;
$('.widget-inside label', sc).each(function(){
var f = $(this).attr('for');
if ( f && f == $('input', this).attr('id') )
$(this).removeAttr('for');
});
},
close : function(widget) {
widget.find('.widget-inside').slideUp('fast', function(){
widget.css({'width':'','marginLeft':''});
});
},
addEvents : function(sc) { addEvents : function(sc) {
sc = sc || document; sc = sc || document;
@ -249,11 +262,15 @@ wpWidgets = {
return false; return false;
}); });
$('.widget-control-save', sc).click(function(){ $('.widget-control-save', sc).click(function(){
wpWidgets.save( $(this).parents('.widget'), 0, 1, 1, 0 ); wpWidgets.save( $(this).parents('.widget'), 0, 1, 0 );
return false; return false;
}); });
$('.widget-control-remove', sc).click(function(){ $('.widget-control-remove', sc).click(function(){
wpWidgets.save( $(this).parents('.widget'), 1, 1, 1, 0 ); wpWidgets.save( $(this).parents('.widget'), 1, 1, 0 );
return false;
});
$('.widget-control-close', sc).click(function(){
wpWidgets.close( $(this).parents('.widget') );
return false; return false;
}); });
} }

File diff suppressed because one or more lines are too long

View File

@ -332,7 +332,7 @@ function wp_default_scripts( &$scripts ) {
$scripts->add( 'media-upload', "/wp-admin/js/media-upload$suffix.js", array( 'thickbox' ), '20090114' ); $scripts->add( 'media-upload', "/wp-admin/js/media-upload$suffix.js", array( 'thickbox' ), '20090114' );
$scripts->add_data( 'media-upload', 'group', 1 ); $scripts->add_data( 'media-upload', 'group', 1 );
$scripts->add( 'admin-widgets', "/wp-admin/js/widgets$suffix.js", array( 'jquery-ui-sortable', 'jquery-ui-draggable', 'jquery-ui-droppable' ), '20090524' ); $scripts->add( 'admin-widgets', "/wp-admin/js/widgets$suffix.js", array( 'jquery-ui-sortable', 'jquery-ui-draggable', 'jquery-ui-droppable' ), '20090530' );
$scripts->add_data( 'admin-widgets', 'group', 1 ); $scripts->add_data( 'admin-widgets', 'group', 1 );
$scripts->add( 'word-count', "/wp-admin/js/word-count$suffix.js", array( 'jquery' ), '20090422' ); $scripts->add( 'word-count', "/wp-admin/js/word-count$suffix.js", array( 'jquery' ), '20090422' );
@ -438,7 +438,7 @@ function wp_default_styles( &$styles ) {
$styles->add( 'global', '/wp-admin/css/global.css', array(), '20090514' ); $styles->add( 'global', '/wp-admin/css/global.css', array(), '20090514' );
$styles->add( 'media', '/wp-admin/css/media.css', array(), '20090516' ); $styles->add( 'media', '/wp-admin/css/media.css', array(), '20090516' );
$styles->add( 'widgets', '/wp-admin/css/widgets.css', array(), '20090514' ); $styles->add( 'widgets', '/wp-admin/css/widgets.css', array(), '20090530' );
$styles->add( 'dashboard', '/wp-admin/css/dashboard.css', array(), '20090514' ); $styles->add( 'dashboard', '/wp-admin/css/dashboard.css', array(), '20090514' );
$styles->add( 'install', '/wp-admin/css/install.css', array(), '20090514' ); $styles->add( 'install', '/wp-admin/css/install.css', array(), '20090514' );
$styles->add( 'theme-editor', '/wp-admin/css/theme-editor.css', array(), '20090514' ); $styles->add( 'theme-editor', '/wp-admin/css/theme-editor.css', array(), '20090514' );

View File

@ -297,7 +297,7 @@ class WP_Widget {
$settings = wp_convert_widget_settings($this->id_base, $this->option_name, $settings); $settings = wp_convert_widget_settings($this->id_base, $this->option_name, $settings);
} }
unset($settings['_multiwidget']); unset($settings['_multiwidget'], $settings['__i__']);
return $settings; return $settings;
} }
} }