WordPress.org

Make WordPress Core

Changeset 10912


Ignore:
Timestamp:
04/11/2009 02:37:24 PM (10 years ago)
Author:
azaozz
Message:

Widgets page, first run, see #9511

Location:
trunk
Files:
15 edited

Legend:

Unmodified
Added
Removed
  • trunk/wp-admin/admin-ajax.php

    r10909 r10912  
    12691269    die;
    12701270    break;
     1271case 'widgets-order' :
     1272    check_ajax_referer( 'save-sidebar-widgets', 'savewidgets' );
     1273
     1274    if ( !current_user_can('switch_themes') )
     1275        die('-1');
     1276
     1277    unset( $_POST['savewidgets'], $_POST['action'] );
     1278    $sidebars_widgets = array('array_version' => 3);
     1279
     1280    foreach ( $_POST as $key => $val ) {
     1281        if ( preg_match( '/^(wp_inactive_widgets|sidebar-[0-9]+)$/', $key ) ) {
     1282            if ( preg_match( '/^[0-9a-z,_-]+$/i', $val ) ) {
     1283                $val = explode(',', $val);
     1284
     1285                foreach ( $val as $k => $v ) {
     1286                    $val[$k] = substr($v, strpos($v, '_') + 1);
     1287                }
     1288            } elseif ( '' == $val ) {
     1289                $val = array();
     1290            } else {
     1291                die('-1');
     1292            }
     1293
     1294            $sidebars_widgets[$key] = $val;
     1295        }
     1296    }
     1297
     1298    wp_set_sidebars_widgets($sidebars_widgets);
     1299
     1300    die('1');
     1301    break;
     1302case 'save-widget' :
     1303    check_ajax_referer( 'save-sidebar-widgets', 'savewidgets' );
     1304
     1305    if ( !current_user_can('switch_themes') )
     1306        die('-1');
     1307
     1308    unset( $_POST['savewidgets'], $_POST['action'] );
     1309
     1310    $number = isset($_POST['widget_number']) ? $_POST['widget_number'] : '';
     1311    if ( isset($_POST['id_base']) )
     1312        $id_base = $_POST['id_base'];
     1313    else
     1314        die('-1');
     1315
     1316    $sidebar_id = (string) $_POST['sidebar'];
     1317    $sidebars = wp_get_sidebars_widgets();
     1318    $sidebar = isset($sidebars[$sidebar_id]) ? $sidebars[$sidebar_id] : array();
     1319
     1320    // delete
     1321    if ( isset($_POST['delete_widget']) && $_POST['delete_widget'] ) {
     1322        $del_id = $_POST['widget-id'];
     1323        $widget = isset($wp_registered_widgets[$del_id]) ? $wp_registered_widgets[$del_id] : false;
     1324
     1325        if ( !in_array($del_id, $sidebar, true) || !$widget )
     1326            die('-1');
     1327
     1328        $option = str_replace( '-', '_', 'widget_' . $id_base );
     1329        $data = get_option($option);
     1330
     1331        if ( isset($widget['params'][0]['number']) ) {
     1332            $number = $widget['params'][0]['number'];
     1333            if ( is_array($data) && isset($data[$number]) ) {
     1334                unset( $data[$number] );
     1335                update_option($option, $data);
     1336            }
     1337        } else {
     1338            if ( $data ) {
     1339                $data = array();
     1340                update_option($option, $data);
     1341            }
     1342        }
     1343
     1344        $sidebar = array_diff( $sidebar, array($del_id) );
     1345        $sidebars[$sidebar_id] = $sidebar;
     1346        wp_set_sidebars_widgets($sidebars);
     1347
     1348        echo "deleted:$del_id";
     1349        die();
     1350    }
     1351
     1352    // save
     1353    foreach ( (array) $wp_registered_widget_updates as $name => $control ) {
     1354        if ( $name == $id_base ) {
     1355            if ( !is_callable( $control['callback'] ) )
     1356                continue;
     1357
     1358            if ( $number ) {
     1359                // don't delete other instances of the same multi-widget
     1360                foreach ( $sidebar as $_widget_id ) {
     1361                    if ( isset($wp_registered_widgets[$_widget_id]['params'][0]['number']) )
     1362                        unset($wp_registered_widgets[$_widget_id]['params'][0]['number']);
     1363                }
     1364            }
     1365
     1366            ob_start();
     1367                call_user_func_array( $control['callback'], $control['params'] );
     1368            ob_end_clean();
     1369            break;
     1370        }
     1371    }
     1372
     1373    die('1');
     1374    break;
    12711375default :
    12721376    do_action( 'wp_ajax_' . $_POST['action'] );
  • trunk/wp-admin/css/colors-classic.css

    r10883 r10912  
    3434}
    3535
    36 div#current-widgets,
    3736#postcustomstuff table,
    3837#your-profile fieldset,
     
    8483}
    8584
    86 div.dashboard-widget-submit,
    87 ul.widget-control-list div.widget-control-actions {
     85div.dashboard-widget-submit {
    8886    border-top-color: #ccc;
    8987}
     
    102100}
    103101/* #upload-menu li a.upload-tab-link, */
    104 li.widget-list-control-item h4.widget-title a:hover,
    105 li.widget-list-control-item h4.widget-title a,
    106 #dragHelper li.widget-list-control-item h4.widget-title a,
    107 #draghelper li.widget-list-control-item h4.widget-title a:visited,
    108102.login #backtoblog a:hover,
    109103#plugin-information .action-button a,
     
    113107}
    114108
    115 li.widget-list-control-item div.widget-control {
    116     background-color: #fff;
    117     border-color: #dfdfdf;
    118 }
    119 
    120109.metabox-holder .postbox h3,
    121110#poststuff .postbox h3,
     
    142131strong .post-com-count span {
    143132    background-color: #21759b;
    144 }
    145 
    146 ul#widget-list li.widget-list-item h4.widget-title {
    147     background-color: #f0f0f0;
    148     color: #000;
    149133}
    150134
     
    277261}
    278262
    279 .side-info ul, .widget-description {
     263.side-info ul {
    280264    color: #666;
    281265}
     
    430414
    431415div#available-widgets-filter,
    432 ul#widget-list li.widget-list-item,
    433416.commentlist li {
    434417    border-bottom-color: #ccc;
     
    532515}
    533516
    534 #current-widgets .drop-widget-here {
    535     background-color: #ffc;
    536 }
    537 
    538517#dashboard_secondary div.dashboard-widget-content ul li a {
    539518    background-color: #f9f9f9;
     
    542521input.readonly, textarea.readonly {
    543522    background-color: #ddd;
    544 }
    545 
    546 #dragHelper h4.widget-title,
    547 li.widget-list-control-item h4,
    548 #dragHelper li.widget-list-control-item h4 {
    549     background-color: #2683ae;
    550     color: #fff;
    551523}
    552524
     
    15961568    border-bottom-color: #ccc;
    15971569}
     1570
     1571div.widgets-holder-wrap {
     1572    background-color: #F1F1F1;
     1573    border-color: #DDDDDD;
     1574}
  • trunk/wp-admin/css/colors-fresh.css

    r10883 r10912  
    3434}
    3535
    36 div#current-widgets,
    3736#postcustomstuff table,
    3837#your-profile fieldset,
     
    8483}
    8584
    86 div.dashboard-widget-submit,
    87 ul.widget-control-list div.widget-control-actions {
     85div.dashboard-widget-submit {
    8886    border-top-color: #ccc;
    8987}
     
    102100}
    103101/* #upload-menu li a.upload-tab-link, */
    104 li.widget-list-control-item h4.widget-title a:hover,
    105 li.widget-list-control-item h4.widget-title a,
    106 #dragHelper li.widget-list-control-item h4.widget-title a,
    107 #draghelper li.widget-list-control-item h4.widget-title a:visited,
    108102.login #backtoblog a:hover,
    109103#plugin-information .action-button a,
     
    113107}
    114108
    115 li.widget-list-control-item div.widget-control {
    116     background-color: #fff;
    117     border-color: #dfdfdf;
    118 }
    119 
    120 .metabox-holder .postbox h3,
    121 #poststuff .postbox h3,
    122 #poststuff .stuffbox h3 {
     109.widget .widget-top,
     110.postbox h3,
     111.stuffbox h3 {
    123112    background: #dfdfdf url("../images/gray-grad.png") repeat-x left top;
    124113    text-shadow: #fff 0 1px 0;
     
    142131strong .post-com-count span {
    143132    background-color: #21759b;
    144 }
    145 
    146 ul#widget-list li.widget-list-item h4.widget-title {
    147     background-color: #f0f0f0;
    148     color: #000;
    149133}
    150134
     
    277261}
    278262
    279 .side-info ul, .widget-description {
     263.side-info ul {
    280264    color: #666;
    281265}
     
    430414
    431415div#available-widgets-filter,
    432 ul#widget-list li.widget-list-item,
    433416.commentlist li {
    434417    border-bottom-color: #ccc;
     
    532515}
    533516
    534 #current-widgets .drop-widget-here {
    535     background-color: #ffc;
    536 }
    537 
    538517#dashboard_secondary div.dashboard-widget-content ul li a {
    539518    background-color: #f9f9f9;
     
    542521input.readonly, textarea.readonly {
    543522    background-color: #ddd;
    544 }
    545 
    546 #dragHelper h4.widget-title,
    547 li.widget-list-control-item h4,
    548 #dragHelper li.widget-list-control-item h4 {
    549     background-color: #2683ae;
    550     color: #fff;
    551523}
    552524
     
    643615}
    644616
    645 .metabox-holder .postbox,
    646 #poststuff .postbox,
     617.widget,
     618.postbox,
    647619#titlediv,
    648620#poststuff .postarea,
     
    655627}
    656628
    657 .metabox-holder .postbox,
    658 #poststuff .postbox {
     629.widget,
     630.postbox {
    659631    background-color: #FFF;
    660632}
    661633
     634.widget .widget-top,
    662635.ui-sortable .postbox h3 {
    663636    color: #464646;
    664637}
    665638
     639.widget .widget-top,
    666640.ui-sortable .postbox h3:hover {
    667641    color: #000;
     
    15961570    border-bottom-color: #ccc;
    15971571}
     1572
     1573div.widgets-holder-wrap {
     1574    background-color: #F1F1F1;
     1575    border-color: #DDDDDD;
     1576}
  • trunk/wp-admin/css/global.css

    r10884 r10912  
    275275h4 {
    276276  display: block;
     277  font-size: 1em;
    277278  font-weight: bold;
    278279  margin: 1.33em 0;
  • trunk/wp-admin/css/ie.css

    r10884 r10912  
    189189}
    190190
    191 #the-comment-list .comment-item,
    192 ul#widget-list li.widget-list-item {
    193     zoom: 100%;
    194 }
    195 
    196191#wphead-info {
    197192    float: right;
     
    208203}
    209204
    210 * html div.widget-liquid-left-holder,
     205* html div.widget-liquid-left,
    211206* html div.widget-liquid-right {
    212207    display: block;
     
    228223}
    229224
     225#the-comment-list .comment-item,
    230226#post-status-info,
    231227#wpwrap,
     
    240236#editorcontainer,
    241237.tablenav,
    242 .widget-control-list,
    243 li.widget-list-control-item,
     238.widget-liquid-left,
     239.widget-liquid-right,
     240#widgets-left,
     241.widgets-sortables,
    244242#dragHelper,
    245 li.widget-list-control-item h4,
    246 .widget-sortable,
     243.widget .widget-top,
     244.widget,
    247245.widget-control-actions,
    248246.tagchecklist,
     
    354352    width: 145px;
    355353}
     354
     355* html .widget-top .widget-title-action a {
     356    background: url("../images/menu-bits.gif") no-repeat scroll 0 -110px;
     357}
     358
     359* html .widget {
     360    border-color: #dfdfdf;
     361}
     362
     363* html div.widget-liquid-left {
     364    width: 99%;
     365}
     366
     367#wp_inactive_widgets {
     368    padding-bottom: 8px;
     369}
     370
     371* html .widgets-sortables {
     372    height: 50px;
     373}
  • trunk/wp-admin/css/widgets-rtl.css

    r10147 r10912  
    1 h4.widget-title span {
    2     float: right;
    3 }
    4 h4.widget-title a {
    5     float: left;
    6     margin-left: 0;
    7     margin-right: 1em;
    8 }
    9 ul#widget-list li.widget-list-item h4.widget-title {
    10     float: right;
    11 }
     1
    122ul#widget-list li.widget-list-item div.widget-description {
    133    margin: 0 200px 0 0;
     
    2010    float: right;
    2111}
    22 li.widget-list-control-item h4.widget-title a,
    23 #dragHelper li.widget-list-control-item h4.widget-title a,
    24 #draghelper li.widget-list-control-item h4.widget-title a:visited {
    25     right: auto;
    26     left: 1em;
    27 }
  • trunk/wp-admin/css/widgets.css

    r9944 r10912  
    11/* 2 column liquid layout */
    2 div.widget-liquid-left-holder {
     2div.widget-liquid-left {
    33    float: left;
    44    clear: left;
    55    width: 100%;
    6     margin-right: -310px;
     6    margin-right: -325px;
    77}
    88
    9 div.widget-liquid-left {
    10     margin-right: 320px;
     9div#widgets-left {
     10    margin-right: 335px;
    1111}
    1212
     
    1414    float: right;
    1515    clear: right;
    16     width: 300px;
    17     position: relative;
     16    width: 320px;
    1817}
    1918
    20 /* pasitioning etc. */
    21 form#widgets-filter {
    22     position: relative;
     19.widgets-sortables li {
     20    width: 300px;
     21    margin: 15px 0 18px;
     22}
     23
     24#widgets-left .widgets-sortables li,
     25#widgets-left #widget-list li {
     26    float: left;
     27    margin: 0 15px 18px 3px;
     28    width: 300px;
     29}
     30
     31.widget-placeholder {
     32    border-width: 1px;
     33    border-style: dashed;
     34    margin-bottom: 20px;
     35    height: 25px;
     36    width: 298px;
     37}
     38
     39div.widgets-holder-wrap {
     40    padding: 8px 8px 0;
     41    margin: 12px 0;
     42    border-width: 1px;
     43    border-style: solid;
     44    -moz-border-radius: 6px;
     45    -khtml-border-radius: 6px;
     46    -webkit-border-radius: 6px;
     47    border-radius: 6px;
     48}
     49
     50#widgets-left #available-widgets {
     51    background-color: transparent;
     52    border: 0 none;
    2353}
    2454
     
    3262    margin: 0;
    3363    padding: 0;
     64    min-height: 100px;
    3465}
    3566
    36 ul#widget-list li.widget-list-item {
    37     padding: .7em 0.9em;
    38     margin: 0;
    39     border-bottom-width: 1px;
    40     border-bottom-style: solid;
     67.widget .widget-top {
     68    font-size: 12px;
     69    font-weight: bold;
    4170    line-height: 1;
    4271}
    4372
    44 h4.widget-title span {
    45     float: left;
     73.widget-top .widget-title {
     74    margin-right: 30px;
     75    padding: 7px 9px;
    4676}
    4777
    48 h4.widget-title a {
     78.widget-top .widget-title-action {
    4979    float: right;
    50     text-decoration: underline;
    51     border-bottom: none;
    52     margin-left: 1em;
    5380}
    5481
    55 ul#widget-list li.widget-list-item h4.widget-title {
    56     position: relative;
    57     margin: 0;
    58     padding: .5em 1em;
    59     width: 200px;
    60     float: left;
    61     font-size: 13px;
    62     -moz-border-radius: 3px;
    63     -khtml-border-radius: 3px;
    64     -webkit-border-radius: 3px;
    65     border-radius: 3px;
     82.widget-title-action a {
     83    display: block;
     84    width: 24px;
     85    height: 26px;
    6686}
    6787
    68 #dragHelper h4.widget-title {
    69     padding: .5em 1em;
    70     margin: 0;
     88.widget-top:hover .widget-title-action a {
     89    background: url("../images/menu-bits.gif") no-repeat scroll 0 -110px;
    7190}
    7291
    73 ul#widget-list li.widget-list-item div.widget-description {
    74     display: block;
    75     margin: 0 0 0 200px;
    76     padding: 0 0 0 4em;
     92.widget .widget-inside {
     93    margin: 15px;
    7794    font-size: 11px;
     95    display: none;
    7896}
    7997
    80 ul#widget-list li.widget-list-item ul.widget-control-info {
     98.widget-control,
     99.widget-description {
    81100    display: none;
     101}
     102
     103#available-widgets .widget-description,
     104.widget-liquid-right .widget-control,
     105#wp_inactive_widgets .widget-control {
     106    display: block;
     107}
     108
     109.widget .widget-control p {
     110    margin: 0 0 1em;
     111    padding: 0;
     112}
     113
     114.widget-title h4 {
     115    margin: 0;
     116    line-height: 1;
     117}
     118
     119.sidebar-name {
     120    margin: 0 0 12px;
     121    padding: 6px;
     122    cursor: pointer;
     123}
     124
     125.widgets-sortables {
     126    min-height: 50px;
     127}
     128
     129.widget-control-actions {
     130    margin-top: 8px;
     131}
     132
     133.widget-control-actions a {
     134    text-decoration: none;
    82135}
    83136
     
    88141}
    89142
    90 ul.widget-control-list {
    91     list-style: none;
    92     margin: 0;
    93     padding: 0 1em;
    94 }
    95 
    96 div#current-widgets p.submit {
    97     padding: 1em;
    98 }
    99 
    100 li.widget-list-control-item {
    101     margin: 1em 0;
    102     -moz-border-radius: 3px;
    103     -khtml-border-radius: 3px;
    104     -webkit-border-radius: 3px;
    105     border-radius: 3px;
    106 }
    107 
    108 li.widget-list-control-item h4,
    109 #dragHelper li.widget-list-control-item h4,
    110 li.widget-sortable h4 {
    111     margin: 0;
    112     cursor: move;
    113     font-size: 13px;
    114     padding: 0.4em 0.8em;
    115     position: relative;
    116     -moz-border-radius: 3px;
    117     -khtml-border-radius: 3px;
    118     -webkit-border-radius: 3px;
    119     border-radius: 3px;
    120 }
    121 
    122 .widget-control-save,
    123 .widget-control-remove {
    124     margin-right: 8px;
    125     float: left;
    126     text-decoration: none;
    127 }
    128 
    129 li.widget-list-control-item h4.widget-title a,
    130 #dragHelper li.widget-list-control-item h4.widget-title a,
    131 #draghelper li.widget-list-control-item h4.widget-title a:visited {
    132     right: 1em;
    133 }
    134 
    135 li.widget-list-control-item h4.widget-title a:hover {
     143.widget-title a,
     144.widget-title a:hover {
    136145    text-decoration: none;
    137146    border-bottom: none;
    138 }
    139 
    140 li.widget-list-control-item div.widget-control {
    141     border-width: 0 1px 1px;
    142     border-style: none solid solid;
    143     display: none;
    144     padding: 15px;
    145     font-size: 11px;
    146     position: relative;
    147 }
    148 
    149 li.widget-list-control-item div.widget-control p {
    150     margin: 0 0 1em;
    151     padding: 0;
    152 }
    153 
    154 ul.widget-control-list div.widget-control-actions {
    155     padding: 0.5em 0 0;
    156147}
    157148
     
    161152}
    162153
    163 div#current-widgets {
    164     padding-top: 1em;
    165     border-width: 1px 0 0;
    166     border-style: solid none none;
    167 }
    168154
    169 #widget-controls .widefat {
    170     width: 92%;
    171     padding: 3px;
    172 }
    173 
    174 #widget-controls select.widefat {
    175     width: auto;
    176     display: block;
    177 }
  • trunk/wp-admin/includes/widgets.php

    r10680 r10912  
    88
    99/**
    10  * Display list of widgets, either all or matching search.
     10 * Display list of the available widgets, either all or matching search.
    1111 *
    1212 * The search parameter are search terms separated by spaces.
     
    1919function wp_list_widgets( $show = 'all', $_search = false ) {
    2020    global $wp_registered_widgets, $sidebars_widgets, $wp_registered_widget_controls;
    21     if ( $_search ) {
     21
     22    if ( $_search ) {
    2223        // sanitize
    2324        $search = preg_replace( '/[^\w\s]/', '', $_search );
     
    3233?>
    3334
    34     <ul id='widget-list'>
    35         <?php
     35    <ul id="widget-list">
     36<?php
    3637        $no_widgets_shown = true;
    3738        $already_shown = array();
    38         foreach ( $wp_registered_widgets as $name => $widget ) :
     39        foreach ( $wp_registered_widgets as $name => $widget ) {
    3940            if ( 'all' == $show && in_array( $widget['callback'], $already_shown ) ) // We already showed this multi-widget
    4041                continue;
     
    6465            if ( ! isset( $widget['params'][0] ) )
    6566                $widget['params'][0] = array();
    66             ob_start();
    67             $args = wp_list_widget_controls_dynamic_sidebar( array( 0 => array( 'widget_id' => $widget['id'], 'widget_name' => $widget['name'], '_display' => 'template', '_show' => $show ), 1 => $widget['params'][0] ) );
    68             $sidebar_args = call_user_func_array( 'wp_widget_control', $args );
    69             $widget_control_template = ob_get_contents();
    70             ob_end_clean();
    71 
    72             $widget_id = $widget['id']; // save this for later in case we mess with $widget['id']
    73 
    74             $is_multi = false !== strpos( $widget_control_template, '%i%' );
    75             if ( !$sidebar || $is_multi ) {
    76                 $add_query = array(
    77                     'sidebar' => $sidebar,
    78                     'key' => false,
    79                     'edit' => false
    80                 );
    81                 if ( 'all' == $show && $is_multi ) {
    82                     // it's a multi-widget.  We only need to show it in the list once.
    83                     $already_shown[] = $widget['callback'];
    84                     $num = (int) array_pop( $ids = explode( '-', $widget['id'] ) );
    85                     $id_base = $wp_registered_widget_controls[$widget['id']]['id_base'];
    86                     // so that we always add a new one when clicking "add"
    87                     while ( isset($wp_registered_widgets["$id_base-$num"]) )
    88                         $num++;
    89                     $widget['id'] = "$id_base-$num";
    90                     $add_query['base'] = $id_base;
    91                     $add_query['key'] = $num;
    92                     $add_query['sidebar'] = $GLOBALS['sidebar'];
    93                 }
    94                 $add_query['add'] = $widget['id'];
    95                 $action = 'add';
    96                 $add_url = clean_url( wp_nonce_url( add_query_arg( $add_query ), "add-widget_$widget[id]" ) );
     67
     68            $already_shown[] = $widget['callback'];
     69            $no_widgets_shown = false;
     70
     71            $args = array( 'widget_id' => $widget['id'], 'widget_name' => $widget['name'], '_display' => 'template' );
     72
     73            if ( isset($wp_registered_widget_controls[$widget['id']]['id_base']) && isset($widget['params'][0]['number']) ) {
     74                $id_base = $wp_registered_widget_controls[$widget['id']]['id_base'];
     75                $args['_temp_id'] = "$id_base-__i__";
     76                $args['_multi_num'] = next_widget_id_number($id_base);
     77                $args['_add'] = 'multi';
    9778            } else {
    98                 $action = 'edit';
    99                 $edit_url = clean_url( add_query_arg( array(
    100                     'sidebar' => $sidebar,
    101                     'edit' => $widget['id'],
    102                     'key' => array_search( $widget['id'], $sidebars_widgets[$sidebar] ),
    103                 ) ) );
    104 
    105                 $widget_control_template = '<textarea rows="1" cols="1">' . htmlspecialchars( $widget_control_template ) . '</textarea>';
     79                $args['_add'] = 'single';
     80                if ( $sidebar )
     81                    $args['_hide'] = '1';
    10682            }
    10783
    108             $widget_control_template = $sidebar_args['before_widget'] . $widget_control_template . $sidebar_args['after_widget'];
    109 
    110             $no_widgets_shown = false;
    111 
    112 
    113             if ( 'all' != $show && $sidebar_args['_widget_title'] )
    114                 $widget_title = $sidebar_args['_widget_title'];
    115             else
    116                 $widget_title = $widget['name'];
    117         ?>
    118 
    119         <li id="widget-list-item-<?php echo attribute_escape( $widget['id'] ); ?>" class="widget-list-item">
    120             <h4 class="widget-title widget-draggable">
    121 
    122                 <span><?php echo $widget_title; ?></span>
    123 
    124                 <?php if ( 'add' == $action ) : ?>
    125 
    126                 <a class="widget-action widget-control-add" href="<?php echo $add_url; ?>"><?php _e( 'Add' ); ?></a>
    127 
    128                 <?php elseif ( 'edit' == $action ) :
    129                     // We echo a hidden edit link for the sake of the JS.  Edit links are shown (needlessly?) after a widget is added.
    130                 ?>
    131 
    132                 <a class="widget-action widget-control-edit" href="<?php echo $edit_url; ?>" style="display: none;"><?php _e( 'Edit' ); ?></a>
    133 
    134                 <?php endif; ?>
    135 
    136                 <br class="clear" />
    137 
    138             </h4>
    139 
    140 
    141             <ul id="widget-control-info-<?php echo $widget['id']; ?>" class="widget-control-info">
    142 
    143                 <?php echo $widget_control_template; ?>
    144 
    145             </ul>
    146 
    147             <?php if ( 'add' == $action ) : ?>
    148             <?php endif; ?>
    149 
    150             <div class="widget-description">
    151                 <?php echo ( $widget_description = wp_widget_description( $widget_id ) ) ? $widget_description : '&nbsp;'; ?>
    152             </div>
    153 
    154             <br class="clear" />
    155 
    156         </li>
    157 
    158         <?php endforeach; if ( $no_widgets_shown ) : ?>
    159 
    160         <li><?php _e( 'No matching widgets' ); ?></li>
    161 
    162         <?php endif; ?>
    163 
     84            $args = wp_list_widget_controls_dynamic_sidebar( array( 0 => $args, 1 => $widget['params'][0] ) );
     85            call_user_func_array( 'wp_widget_control', $args );
     86        }
     87
     88        if ( $no_widgets_shown )
     89          echo '<li>' . __( 'No matching widgets' ) . "</li>\n";
     90?>
    16491    </ul>
    16592<?php
     
    173100 * @param string $sidebar
    174101 */
    175 function wp_list_widget_controls( $sidebar ) {
     102function wp_list_widget_controls( $sidebar, $hide = false ) {
    176103    add_filter( 'dynamic_sidebar_params', 'wp_list_widget_controls_dynamic_sidebar' );
    177104?>
    178105
    179     <ul class="widget-control-list">
    180 
    181         <?php if ( !dynamic_sidebar( $sidebar ) ) echo "<li />"; ?>
    182 
     106    <ul class="widgets-sortables<?php echo $hide ? ' hide-if-js' : ''; ?>">
     107    <?php dynamic_sidebar( $sidebar ); ?>
    183108    </ul>
    184109
     
    200125
    201126    $widget_id = $params[0]['widget_id'];
    202 
    203     $params[0]['before_widget'] = "<li id='widget-list-control-item-$i-$widget_id' class='widget-list-control-item widget-sortable'>\n";
     127    $id = isset($params[0]['_temp_id']) ? $params[0]['_temp_id'] : $widget_id;
     128    $hidden = isset($params[0]['_hide']) ? ' style="display:none;"' : '';
     129
     130    $params[0]['before_widget'] = "<li id='widget-${i}_$id' class='widget'$hidden>";
    204131    $params[0]['after_widget'] = "</li>";
    205     $params[0]['before_title'] = "%BEG_OF_TITLE%";
    206     $params[0]['after_title'] = "%END_OF_TITLE%";
     132    $params[0]['before_title'] = "%BEG_OF_TITLE%"; // deprecated
     133    $params[0]['after_title'] = "%END_OF_TITLE%"; // deprecated
    207134    if ( is_callable( $wp_registered_widgets[$widget_id]['callback'] ) ) {
    208         $wp_registered_widgets[$widget_id]['_callback'] = $wp_registered_widgets[$widget_id]['callback'];
     135        $wp_registered_widgets[$widget_id]['_callback'] = $wp_registered_widgets[$widget_id]['callback'];
    209136        $wp_registered_widgets[$widget_id]['callback'] = 'wp_widget_control';
    210137    }
     138
    211139    return $params;
     140}
     141
     142function next_widget_id_number($id_base) {
     143    global $wp_registered_widgets;
     144    $number = 2;
     145
     146    while ( isset($wp_registered_widgets["$id_base-$number"]) )
     147        $number++;
     148
     149    return $number;
    212150}
    213151
     
    223161 */
    224162function wp_widget_control( $sidebar_args ) {
    225     global $wp_registered_widgets, $wp_registered_widget_controls, $sidebars_widgets, $edit_widget;
     163    global $wp_registered_widgets, $wp_registered_widget_controls, $sidebars_widgets;
     164
    226165    $widget_id = $sidebar_args['widget_id'];
    227166    $sidebar_id = isset($sidebar_args['id']) ? $sidebar_args['id'] : false;
    228167
    229     $control = isset($wp_registered_widget_controls[$widget_id]) ? $wp_registered_widget_controls[$widget_id] : 0;
     168    $control = isset($wp_registered_widget_controls[$widget_id]) ? $wp_registered_widget_controls[$widget_id] : array();
    230169    $widget  = $wp_registered_widgets[$widget_id];
    231170
    232171    $key = $sidebar_id ? array_search( $widget_id, $sidebars_widgets[$sidebar_id] ) : 'no-key'; // position of widget in sidebar
    233172
    234     $edit = -1 <  $edit_widget && is_numeric($key) && $edit_widget === $key; // (bool) are we currently editing this widget
     173    $edit = isset($_GET['editwidget']); // editing without js
     174    $nonce = $edit ? wp_create_nonce("edit-widget_$widget_id") : '';
    235175
    236176    $id_format = $widget['id'];
    237177
    238     if ( ! isset( $sidebar_args['_show'] ) )
    239         $sidebar_args['_show'] = '';
    240 
    241     if ( ! isset( $sidebar_args['_display'] ) )
    242         $sidebar_args['_display'] = '';
     178    $widget_number = isset($control['params'][0]['number']) ? $control['params'][0]['number'] : '';
     179    $add_new = $sidebar_args['_add'];
     180    $id_base = isset($control['id_base']) ? $control['id_base'] : $widget_id;
    243181
    244182    // We aren't showing a widget control, we're outputing a template for a mult-widget control
    245     if ( 'all' == $sidebar_args['_show'] && 'template' == $sidebar_args['_display'] && isset($control['params'][0]['number']) ) {
    246         // number == -1 implies a template where id numbers are replaced by a generic '%i%'
     183    if ( isset($sidebar_args['_display']) && 'template' == $sidebar_args['_display'] && $widget_number ) {
     184        // number == -1 implies a template where id numbers are replaced by a generic '__i__'
    247185        $control['params'][0]['number'] = -1;
    248186        // if given, id_base means widget id's should be constructed like {$id_base}-{$id_number}
    249187        if ( isset($control['id_base']) )
    250             $id_format = $control['id_base'] . '-%i%';
     188            $id_format = $control['id_base'] . '-__i__';
     189
     190        $multi_number = $sidebar_args['_multi_num'];
    251191    }
    252192
    253     $widget_title = '';
    254     // We grab the normal widget output to find the widget's title
    255     if ( ( 'all' != $sidebar_args['_show'] || 'template' != $sidebar_args['_display'] ) && is_callable( $widget['_callback'] ) ) {
    256         ob_start();
    257         $args = func_get_args();
    258         call_user_func_array( $widget['_callback'], $args );
    259         $widget_title = ob_get_clean();
    260         $widget_title = wp_widget_control_ob_filter( $widget_title );
    261     }
    262193    $wp_registered_widgets[$widget_id]['callback'] = $wp_registered_widgets[$widget_id]['_callback'];
    263194    unset($wp_registered_widgets[$widget_id]['_callback']);
    264195
    265     if ( $widget_title && $widget_title != $sidebar_args['widget_name'] )
    266         /* translators: 1: widget name, 2: widget title */
    267         $widget_title = sprintf( _x('%1$s: %2$s', 'widget' ), $sidebar_args['widget_name'], $widget_title );
    268     else
    269         $widget_title = wp_specialchars( strip_tags( $sidebar_args['widget_name'] ) );
    270 
    271     $sidebar_args['_widget_title'] = $widget_title;
    272 
    273     if ( empty($sidebar_args['_display']) || 'template' != $sidebar_args['_display'] )
    274         echo $sidebar_args['before_widget'];
    275 ?>
     196    $widget_title = wp_specialchars( strip_tags( $sidebar_args['widget_name'] ) );
     197
     198    echo $sidebar_args['before_widget']; ?>
    276199        <div class="widget-top">
    277         <h4 class="widget-title"><span><?php echo $widget_title ?></span>
    278 
    279             <?php if ( $edit ) : ?>
    280 
    281             <a class="widget-action widget-control-edit" href="<?php echo clean_url( remove_query_arg( array( 'edit', 'key' ) ) ); ?>"><?php _e('Cancel'); ?></a>
    282 
    283             <?php else : ?>
    284 
    285             <a class="widget-action widget-control-edit" href="<?php echo clean_url( add_query_arg( array( 'edit' => $id_format, 'key' => $key ) ) ); ?>"><?php _e('Edit'); ?></a>
    286 
    287             <?php endif; ?>
    288 
    289             <br class="clear" />
    290 
    291         </h4></div>
    292 
    293         <div class="widget-control"<?php if ( $edit ) echo ' style="display: block;"'; ?>>
    294 
    295             <?php
    296             if ( $control )
     200        <div class="widget-title-action">
     201<?php       if ( !$edit ) { ?>
     202            <a class="widget-action widget-control-edit" href="<?php echo clean_url( add_query_arg( array( 'edit' => $id_format, 'key' => $key ) ) ); ?>"></a>
     203<?php       } ?>
     204        </div>
     205        <div class="widget-title"><h4><?php echo $widget_title ?></h4></div>
     206        </div>
     207
     208        <div class="widget-inside">
     209        <form action="" method="post">
     210        <div class="widget-control">
     211<?php
     212            if ( isset($control['callback']) )
    297213                call_user_func_array( $control['callback'], $control['params'] );
    298214            else
    299                 echo '<p>' . __('There are no options for this widget.') . '</p>';
    300             ?>
    301 
    302             <input type="hidden" name="widget-id[]" value="<?php echo $id_format; ?>" />
    303             <input type="hidden" class="widget-width" value="<?php echo $control['width']; ?>" />
     215                echo "\t\t<p>" . __('There are no options for this widget.') . "</p>\n"; ?>
     216
     217            <input type="hidden" name="widget-id" class="widget-id" value="<?php echo $id_format; ?>" />
     218            <input type="hidden" name="id_base" class="id_base" value="<?php echo $id_base; ?>" />
     219            <input type="hidden" name="widget-width" value="<?php echo $control['width']; ?>" />
     220            <input type="hidden" name="widget-height" value="<?php echo $control['height']; ?>" />
     221            <input type="hidden" name="widget_number" class="widget_number" value="<?php echo $widget_number; ?>" />
     222            <input type="hidden" name="add_new" class="add_new" value="<?php echo $add_new; ?>" />
     223<?php
     224            if ( isset($multi_number) )
     225                echo "\t\t\t<input type='hidden' name='multi_number' class='multi_number' value='$multi_number' />\n"; ?>
    304226
    305227            <div class="widget-control-actions">
    306 
    307                 <?php if ( $control ) : ?>
    308 
    309                 <a class="button widget-action widget-control-save hide-if-no-js edit alignleft" href="#save:<?php echo $id_format; ?>"><?php _e('Done'); ?></a>
    310 
    311                 <?php endif; ?>
    312 
    313                 <a class="button widget-action widget-control-remove alignright" href="<?php echo clean_url( wp_nonce_url( add_query_arg( array( 'remove' => $id_format, 'key' => $key ) ), "remove-widget_$widget[id]" ) ); ?>"><?php _e('Remove'); ?></a>
     228                <a class="button widget-control-remove alignleft" href="<?php echo $edit ? clean_url( add_query_arg( array( 'remove' => $id_format, 'key' => $key, '_wpnonce' => $nonce ) ) ) : '#remove'; ?>"><?php _e('Remove'); ?></a>
     229<?php       if ( !empty($control) ) { ?>
     230                <a class="button-primary widget-control-save alignright" href="<?php echo $edit ? clean_url( add_query_arg( array( 'save' => $id_format, 'key' => $key, '_wpnonce' => $nonce ) ) ) : '#save'; ?>"><?php _e('Save'); ?></a>
     231<?php       } ?>
    314232                <br class="clear" />
    315233            </div>
    316234        </div>
    317 <?php
    318     if ( empty($sidebar_args['_display']) || 'template' != $sidebar_args['_display'] )
    319         echo $sidebar_args['after_widget'];
     235        </form>
     236        <div class="widget-description">
     237<?php echo ( $widget_description = wp_widget_description($widget_id) ) ? "$widget_description\n" : "$widget_title\n"; ?>
     238        </div>
     239        </div>
     240<?php
     241    echo $sidebar_args['after_widget'];
     242
    320243    return $sidebar_args;
    321244}
    322245
    323 /**
    324  * {@internal Missing Short Description}}
    325  *
    326  * @since unknown
    327  *
    328  * @param string $string
    329  * @return string
    330  */
    331 function wp_widget_control_ob_filter( $string ) {
    332     if ( false === $beg = strpos( $string, '%BEG_OF_TITLE%' ) )
    333         return '';
    334     if ( false === $end = strpos( $string, '%END_OF_TITLE%' ) )
    335         return '';
    336     $string = substr( $string, $beg + 14 , $end - $beg - 14);
    337     $string = str_replace( '&nbsp;', ' ', $string );
    338     return trim( wp_specialchars( strip_tags( $string ) ) );
    339 }
    340 
    341 ?>
  • trunk/wp-admin/js/widgets.dev.js

    r10326 r10912  
    1 jQuery(function($) {
    2     $('.noscript-action').remove();
    31
    4     var reminded = false;
    5     var lameWidgetReminder = function() {
    6         if ( reminded )
    7             return;
    8         window.onbeforeunload = function () { return widgetsL10n.lamerReminder };
    9         $('h2:first').after( '<div class="updated"><p>' + widgetsL10n.lameReminder + '</p></div>' );
    10         $('#current-widgets .submit input[name=save-widgets]').css( 'background-color', '#ffffe0' ).click( function() {
    11             window.onbeforeunload = null;
    12         } );
    13         reminded = true;
    14     };
     2var wpWidgets;
     3(function($) {
    154
    16     var increment = 1;
     5wpWidgets = {
     6    init : function() {
     7        var rem;
     8        $('h3.sidebar-name').click(function(){
     9            var c = $(this).siblings('.widgets-sortables');
     10            if ( c.is(':visible') ) {
     11                c.hide().sortable('disable');
     12            } else {
     13                c.show().sortable('enable').sortable('refresh');
     14            }
     15            $(this).siblings('#widget-list').toggle();
     16        });
     17        this.addEvents();
    1718
    18     // Open or close widget control form
    19     var toggleWidget = function( li, disableFields ) {
    20         var width = li.find('input.widget-width').val();
     19        $('#widget-list .widget').draggable({
     20            connectToSortable: '.widgets-sortables',
     21            handle: '.widget-title',
     22            distance: 2,
     23            tolerance: 'pointer',
     24        //  forcePlaceholderSize: true,
     25            helper: 'clone',
     26            start: function() {
     27                wpWidgets.fixWebkit(1);
     28            },
     29            stop: function(e,ui) {
     30                if ( rem )
     31                    $(rem).hide();
     32                rem = '';
     33                wpWidgets.fixWebkit();
     34            }
     35        });
    2136
    22         // it seems IE chokes on these animations because of the positioning/floating
    23         var widgetAnim = $.browser.msie ? function() {
    24             var t = $(this);
    25             if ( t.is(':visible') ) {
    26                 if ( disableFields ) { t.find( ':input:enabled' ).not( '[name="widget-id[]"], [name*="[submit]"]' ).attr( 'disabled', 'disabled' ); }
    27                 li.css( 'marginLeft', 0 );
    28                 t.siblings('div').children('h4').children('a').text( widgetsL10n.edit );
    29             } else {
    30                 t.find( ':disabled' ).attr( 'disabled', '' ); // always enable on open
    31                 if ( width > 250 )
    32                     li.css( 'marginLeft', ( width - 250 ) * -1 );
    33                 t.siblings('div').children('h4').children('a').text( widgetsL10n.cancel );
     37        $('.widgets-sortables').sortable({
     38            placeholder: 'widget-placeholder',
     39            connectWith: '.widgets-sortables',
     40            items: '.widget',
     41            handle: '.widget-title',
     42            cursor: 'move',
     43            distance: 2,
     44            tolerance: 'pointer',
     45        //  forcePlaceholderSize: true,
     46        //  helper: 'clone',
     47            opacity: 0.65,
     48            start: function(e,ui) {
     49                wpWidgets.fixWebkit(1);
     50            },
     51            stop: function(e,ui) {
     52                var add = ui.item.find('input.add_new').val(), n = ui.item.find('input.multi_number').val(), id = ui.item.attr('id'), sb = $(this).parent().attr('id');
     53
     54                if ( add ) {
     55                    if ( 'multi' == add ) {
     56                        ui.item.html( ui.item.html().replace(/<[^<>]+>/g, function(m){ return m.replace(/__i__/g, n); }) );
     57                        ui.item.attr( 'id', id.replace(/__i__/g, n) );
     58                        n++;
     59                        $('li#' + id).find('input.multi_number').val(n);
     60                    } else if ( 'single' == add ) {
     61                        ui.item.attr( 'id', 'new-' + id );
     62                        rem = 'li#' + id;
     63                    }
     64                    wpWidgets.addEvents(ui.item);
     65                    wpWidgets.save( ui.item.find('form').serializeArray(), sb, 0 );
     66                    ui.item.find('input.add_new').val('');
     67                }
     68                wpWidgets.saveOrder(sb);
     69                wpWidgets.fixWebkit();
     70            },
     71            receive: function(e,ui) {
     72                if ( !$(this).is(':visible') )
     73                    $(this).sortable('cancel');
    3474            }
    35             t.toggle();
    36         } : function() {
    37             var t = $(this);
    3875
    39             if ( t.is(':visible') ) {
    40                 if ( disableFields ) { t.find( ':input:enabled' ).not( '[name="widget-id[]"], [name*="[submit]"]' ).attr( 'disabled', 'disabled' ); }
    41                 if ( width > 250 )
    42                     li.animate( { marginLeft: 0 } );
    43                 t.siblings('div').children('h4').children('a').text( widgetsL10n.edit );
    44             } else {
    45                 t.find( ':disabled' ).attr( 'disabled', '' ); // always enable on open
    46                 if ( width > 250 )
    47                     li.animate( { marginLeft: ( width - 250 ) * -1 } );
    48                 t.siblings('div').children('h4').children('a').text( widgetsL10n.cancel );
    49             }
    50             t.animate( { height: 'toggle' } );
     76        }).not(':visible').sortable('disable');
     77    },
     78
     79    saveOrder : function(sb) {
     80        $('#' + sb + ' .ajax-feedback').css('visibility', 'visible');
     81        var p = {
     82            action: 'widgets-order',
     83            savewidgets: $('#_wpnonce_widgets').val()
     84        };
     85        $('.widgets-sortables').each( function() {
     86            p[$(this).parent().attr('id')] = $(this).sortable('toArray').join(',');
     87        });
     88        $.post( ajaxurl, p, function(){
     89            $('.ajax-feedback').css('visibility', 'hidden');
     90        });
     91    },
     92
     93    save : function(data, sb, del, t) {
     94        var a;
     95        sb = sb || '';
     96        $('#' + sb + ' .ajax-feedback').css('visibility', 'visible');
     97
     98        a = {
     99            action: 'save-widget',
     100            savewidgets: $('#_wpnonce_widgets').val(),
     101            sidebar: sb
    51102        };
    52103
    53         return li.children('div.widget-control').each( widgetAnim ).end();
    54     };
     104        if ( del )
     105            a['delete_widget'] = 1;
    55106
    56     // onclick for edit/cancel links
    57     var editClick = function() {
    58         var q = wpAjax.unserialize( this.href );
    59         // if link is in available widgets list, make sure it points to the current sidebar
    60         if ( ( q.sidebar && q.sidebar == $('#sidebar').val() ) || q.add ) {
    61             var w = q.edit || q.add;
    62             toggleWidget( $('#current-sidebar .widget-control-list input[name^="widget-id"][value=' + w + ']').parents('li:first'), false ).blur();
     107        $.map(data, function(n,i){ a[n.name] = n.value; });
     108
     109        $.post( ajaxurl, a, function(r){
     110            var id;
     111            $('.ajax-feedback').css('visibility', 'hidden');
     112            if ( !t )
     113                return;
     114
     115            if ( del ) {
     116                $(t).parents('li.widget').remove();
     117                if ( !a.widget_number ) {
     118                    id = a['widget-id'];
     119                    $('#available-widgets .widget-id').each(function(){
     120                        if ( $(this).val() == id )
     121                            $(this).parents('li.widget').show();
     122                    });
     123                }
     124            } else {
     125                $(t).parents('.widget-inside').hide();
     126            }
     127        });
     128    },
     129
     130    fixWebkit : function(n) {
     131        n = n ? 'none' : '';
     132        $('body').css({
     133          WebkitUserSelect: n,
     134          KhtmlUserSelect: n
     135        });
     136    },
     137
     138    addEvents : function(sc) {
     139        sc = sc || document;
     140        $('a.widget-action', sc).click(function(){
     141            $(this).parents('.widget-top').siblings('.widget-inside').toggle();
     142            return false;
     143        });
     144        $('.widget-control-save', sc).click(function(){
     145            wpWidgets.save( $(this).parents('form').serializeArray(), $(this).parents('.widgets-holder-wrap').attr('id'), 0, this );
    63146            return false;
    64         } else if ( q.sidebar ) { // otherwise, redirect to correct page
    65             return true;
    66         }
    67 
    68         // If link is in current widgets list, just open the form
    69         toggleWidget( $(this).parents('li:first'), true ).blur();
    70         return false;
    71     };
    72 
    73     // onclick for add links
    74     var addClick = function() {
    75         var oldLi = $(this).parents('li:first').find('ul.widget-control-info li');
    76         var newLi = oldLi.clone();
    77 
    78         if ( newLi.html().match( /%i%/ ) ) {
    79             // supplid form is a template, replace %i% by unique id
    80             var i = $('#generated-time').val() + increment.toString();
    81             increment++;
    82             newLi.html( newLi.html().replace( /%i%/g, i ) );
    83         } else {
    84             $(this).text( widgetsL10n.edit ).unbind().click( editClick );
    85             // save form content in textarea so we don't have any conflicting HTML ids
    86             oldLi.html( '<textarea>' + oldLi.html() + '</textarea>' );
    87         }
    88 
    89         // add event handlers
    90         addWidgetControls( newLi );
    91 
    92         // add widget to sidebar sortable
    93         widgetSortable.append( newLi ).SortableAddItem( newLi[0] );
    94 
    95         // increment widget counter
    96         var n = parseInt( $('#widget-count').text(), 10 ) + 1;
    97         $('#widget-count').text( n.toString() )
    98 
    99         lameWidgetReminder();
    100         return false;
    101     };
    102 
    103     // add event handlers to all links found in context
    104     var addWidgetControls = function( context ) {
    105         if ( !context )
    106             context = document;
    107 
    108         $('a.widget-control-edit', context).click( editClick );
    109 
    110         // onclick for save links
    111         $('a.widget-control-save', context).click( function() {
    112             lameWidgetReminder();
    113             toggleWidget( $(this).parents('li:first'), false ).blur()
     147        });
     148        $('.widget-control-remove', sc).click(function(){
     149            wpWidgets.save( $(this).parents('form').serializeArray(), $(this).parents('.widgets-holder-wrap').attr('id'), 1, this );
    114150            return false;
    115         } );
    116 
    117         // onclick for remove links
    118         $('a.widget-control-remove', context).click( function() {
    119             var w = $(this).parents('li:first').find('input[name^="widget-id"]').val();
    120             $(this).parents('li:first').remove();
    121             var t = $('#widget-list ul#widget-control-info-' + w + ' textarea');
    122             t.parent().html( t.text() ).parents('li.widget-list-item:first').children( 'h4' ).children('a.widget-action')
    123                 .show().text( widgetsL10n.add ).unbind().click( addClick );
    124             var n = parseInt( $('#widget-count').text(), 10 ) - 1;
    125             $('#widget-count').text( n.toString() )
    126             return false;
    127         } );
     151        });
    128152    }
    129153
    130     addWidgetControls();
     154};
     155    $(document).ready(function(){wpWidgets.init();});
    131156
    132     $('a.widget-control-add').click( addClick );
    133 
    134     var widgetSortable;
    135     var widgetSortableInit = function() {
    136         try { // a hack to make sortables work in jQuery 1.2+ and IE7
    137             $('#current-sidebar .widget-control-list').SortableDestroy();
    138         } catch(e) {}
    139         widgetSortable = $('#current-sidebar .widget-control-list').Sortable( {
    140             accept: 'widget-sortable',
    141             helperclass: 'sorthelper',
    142             handle: 'h4.widget-title',
    143             onStop: widgetSortableInit
    144         } );
    145     }
    146 
    147     // initialize sortable
    148     widgetSortableInit();
    149 
    150 });
     157})(jQuery);
  • trunk/wp-admin/js/widgets.js

    r10326 r10912  
    1 jQuery(function(e){e(".noscript-action").remove();var a=false;var h=function(){if(a){return}window.onbeforeunload=function(){return widgetsL10n.lamerReminder};e("h2:first").after('<div class="updated"><p>'+widgetsL10n.lameReminder+"</p></div>");e("#current-widgets .submit input[name=save-widgets]").css("background-color","#ffffe0").click(function(){window.onbeforeunload=null});a=true};var j=1;var g=function(k,m){var l=k.find("input.widget-width").val();var n=e.browser.msie?function(){var o=e(this);if(o.is(":visible")){if(m){o.find(":input:enabled").not('[name="widget-id[]"], [name*="[submit]"]').attr("disabled","disabled")}k.css("marginLeft",0);o.siblings("div").children("h4").children("a").text(widgetsL10n.edit)}else{o.find(":disabled").attr("disabled","");if(l>250){k.css("marginLeft",(l-250)*-1)}o.siblings("div").children("h4").children("a").text(widgetsL10n.cancel)}o.toggle()}:function(){var o=e(this);if(o.is(":visible")){if(m){o.find(":input:enabled").not('[name="widget-id[]"], [name*="[submit]"]').attr("disabled","disabled")}if(l>250){k.animate({marginLeft:0})}o.siblings("div").children("h4").children("a").text(widgetsL10n.edit)}else{o.find(":disabled").attr("disabled","");if(l>250){k.animate({marginLeft:(l-250)*-1})}o.siblings("div").children("h4").children("a").text(widgetsL10n.cancel)}o.animate({height:"toggle"})};return k.children("div.widget-control").each(n).end()};var b=function(){var l=wpAjax.unserialize(this.href);if((l.sidebar&&l.sidebar==e("#sidebar").val())||l.add){var k=l.edit||l.add;g(e('#current-sidebar .widget-control-list input[name^="widget-id"][value='+k+"]").parents("li:first"),false).blur();return false}else{if(l.sidebar){return true}}g(e(this).parents("li:first"),true).blur();return false};var c=function(){var o=e(this).parents("li:first").find("ul.widget-control-info li");var l=o.clone();if(l.html().match(/%i%/)){var k=e("#generated-time").val()+j.toString();j++;l.html(l.html().replace(/%i%/g,k))}else{e(this).text(widgetsL10n.edit).unbind().click(b);o.html("<textarea>"+o.html()+"</textarea>")}f(l);i.append(l).SortableAddItem(l[0]);var m=parseInt(e("#widget-count").text(),10)+1;e("#widget-count").text(m.toString());h();return false};var f=function(k){if(!k){k=document}e("a.widget-control-edit",k).click(b);e("a.widget-control-save",k).click(function(){h();g(e(this).parents("li:first"),false).blur();return false});e("a.widget-control-remove",k).click(function(){var l=e(this).parents("li:first").find('input[name^="widget-id"]').val();e(this).parents("li:first").remove();var m=e("#widget-list ul#widget-control-info-"+l+" textarea");m.parent().html(m.text()).parents("li.widget-list-item:first").children("h4").children("a.widget-action").show().text(widgetsL10n.add).unbind().click(c);var o=parseInt(e("#widget-count").text(),10)-1;e("#widget-count").text(o.toString());return false})};f();e("a.widget-control-add").click(c);var i;var d=function(){try{e("#current-sidebar .widget-control-list").SortableDestroy()}catch(k){}i=e("#current-sidebar .widget-control-list").Sortable({accept:"widget-sortable",helperclass:"sorthelper",handle:"h4.widget-title",onStop:d})};d()});
     1var wpWidgets;(function(a){wpWidgets={init:function(){var b;a("h3.sidebar-name").click(function(){var d=a(this).siblings(".widgets-sortables");if(d.is(":visible")){d.hide().sortable("disable")}else{d.show().sortable("enable").sortable("refresh")}a(this).siblings("#widget-list").toggle()});this.addEvents();a("#widget-list .widget").draggable({connectToSortable:".widgets-sortables",handle:".widget-title",distance:2,tolerance:"pointer",helper:"clone",start:function(){wpWidgets.fixWebkit(1)},stop:function(d,c){if(b){a(b).hide()}b="";wpWidgets.fixWebkit()}});a(".widgets-sortables").sortable({placeholder:"widget-placeholder",connectWith:".widgets-sortables",items:".widget",handle:".widget-title",cursor:"move",distance:2,tolerance:"pointer",opacity:0.65,start:function(d,c){wpWidgets.fixWebkit(1)},stop:function(f,c){var d=c.item.find("input.add_new").val(),i=c.item.find("input.multi_number").val(),h=c.item.attr("id"),g=a(this).parent().attr("id");if(d){if("multi"==d){c.item.html(c.item.html().replace(/<[^<>]+>/g,function(e){return e.replace(/__i__/g,i)}));c.item.attr("id",h.replace(/__i__/g,i));i++;a("li#"+h).find("input.multi_number").val(i)}else{if("single"==d){c.item.attr("id","new-"+h);b="li#"+h}}wpWidgets.addEvents(c.item);wpWidgets.save(c.item.find("form").serializeArray(),g,0);c.item.find("input.add_new").val("")}wpWidgets.saveOrder(g);wpWidgets.fixWebkit()},receive:function(d,c){if(!a(this).is(":visible")){a(this).sortable("cancel")}}}).not(":visible").sortable("disable")},saveOrder:function(c){a("#"+c+" .ajax-feedback").css("visibility","visible");var b={action:"widgets-order",savewidgets:a("#_wpnonce_widgets").val()};a(".widgets-sortables").each(function(){b[a(this).parent().attr("id")]=a(this).sortable("toArray").join(",")});a.post(ajaxurl,b,function(){a(".ajax-feedback").css("visibility","hidden")})},save:function(e,f,c,d){var b;f=f||"";a("#"+f+" .ajax-feedback").css("visibility","visible");b={action:"save-widget",savewidgets:a("#_wpnonce_widgets").val(),sidebar:f};if(c){b.delete_widget=1}a.map(e,function(h,g){b[h.name]=h.value});a.post(ajaxurl,b,function(g){var h;a(".ajax-feedback").css("visibility","hidden");if(!d){return}if(c){a(d).parents("li.widget").remove();if(!b.widget_number){h=b["widget-id"];a("#available-widgets .widget-id").each(function(){if(a(this).val()==h){a(this).parents("li.widget").show()}})}}else{a(d).parents(".widget-inside").hide()}})},fixWebkit:function(b){b=b?"none":"";a("body").css({WebkitUserSelect:b,KhtmlUserSelect:b})},addEvents:function(b){b=b||document;a("a.widget-action",b).click(function(){a(this).parents(".widget-top").siblings(".widget-inside").toggle();return false});a(".widget-control-save",b).click(function(){wpWidgets.save(a(this).parents("form").serializeArray(),a(this).parents(".widgets-holder-wrap").attr("id"),0,this);return false});a(".widget-control-remove",b).click(function(){wpWidgets.save(a(this).parents("form").serializeArray(),a(this).parents(".widgets-holder-wrap").attr("id"),1,this);return false})}};a(document).ready(function(){wpWidgets.init()})})(jQuery);
  • trunk/wp-admin/widgets.php

    r10798 r10912  
    1616    wp_die( __( 'Cheatin&#8217; uh?' ));
    1717
    18 wp_enqueue_script( array( 'wp-lists', 'admin-widgets' ) );
     18wp_enqueue_script('admin-widgets');
    1919wp_admin_css( 'widgets' );
    2020
     
    2424$parent_file = 'themes.php';
    2525
    26 // $sidebar = What sidebar are we editing?
    27 if ( isset($_GET['sidebar']) && isset($wp_registered_sidebars[$_GET['sidebar']]) ) {
    28     $sidebar = attribute_escape( $_GET['sidebar'] );
    29 } elseif ( is_array($wp_registered_sidebars) && !empty($wp_registered_sidebars) ) {
    30     // By default we look at the first defined sidebar
    31     $sidebar = array_shift( $keys = array_keys($wp_registered_sidebars) );
    32 } else {
    33     // If no sidebars, die.
     26// register the inactive_widgets area as sidebar
     27register_sidebar(array(
     28    'name' => '',
     29    'id' => 'wp_inactive_widgets',
     30    'before_widget' => '',
     31    'after_widget' => '',
     32    'before_title' => '',
     33    'after_title' => '',
     34));
     35
     36// These are the widgets grouped by sidebar
     37$sidebars_widgets = wp_get_sidebars_widgets();
     38if ( empty( $sidebars_widgets ) )
     39    $sidebars_widgets = wp_get_widget_defaults();
     40
     41// look for "lost" widgets, perhaps run only after changin themes
     42function retrieve_widgets() {
     43    global $wp_registered_widget_updates, $wp_registered_sidebars, $sidebars_widgets;
     44
     45    $key_sidebars = array_keys( (array) $wp_registered_sidebars);
     46    $key_widgets = array_keys($sidebars_widgets);
     47    if ( count($key_widgets) > count($key_sidebars) ) {
     48        $changed_sidebars = array_diff( $key_widgets, $key_sidebars );
     49        foreach ( $changed_sidebars as $lost ) {
     50            if ( is_array($sidebars_widgets[$lost]) )
     51                $sidebars_widgets['wp_inactive_widgets'] = array_merge( (array) $sidebars_widgets['wp_inactive_widgets'], $sidebars_widgets[$lost] );
     52            unset($sidebars_widgets[$lost]);
     53        }
     54    }
     55
     56    $shown_widgets = array();
     57    foreach ( $sidebars_widgets as $sidebar ) {
     58        if ( is_array($sidebar) )
     59            $shown_widgets = array_merge($shown_widgets, $sidebar);
     60    }
     61
     62    $all_widgets = array();
     63    foreach ( $wp_registered_widget_updates as $key => $val ) {
     64        if ( isset($val['id_base']) )
     65            $all_widgets[] = $val['id_base'];
     66        else
     67            $all_widgets[] = $key;
     68    }
     69
     70    $all_widgets = array_unique($all_widgets);
     71
     72    $lost_widgets = array();
     73    foreach ( $all_widgets as $name ) {
     74        $data = get_option( str_replace('-', '_', "widget_$name") );
     75        if ( is_array($data) ) {
     76            foreach ( $data as $num => $value ) {
     77                if ( !is_numeric($num) ) // skip single widgets, some don't delete their settings
     78                    continue;
     79                if ( is_array($value) && !in_array("$name-$num", $shown_widgets, true) )
     80                    $lost_widgets[] = "$name-$num";
     81            }
     82        }
     83    }
     84
     85    $sidebars_widgets['wp_inactive_widgets'] = array_merge($lost_widgets, (array) $sidebars_widgets['wp_inactive_widgets']);
     86    wp_set_sidebars_widgets($sidebars_widgets);
     87}
     88retrieve_widgets();
     89
     90if ( count($wp_registered_sidebars) == 1 ) {
     91    // If only the "wp_inactive_widgets" is defined the theme has no sidebars, die.
    3492    require_once( 'admin-header.php' );
    3593?>
     
    49107}
    50108
    51 // These are the widgets grouped by sidebar
    52 $sidebars_widgets = wp_get_sidebars_widgets();
    53 if ( empty( $sidebars_widgets ) )
    54     $sidebars_widgets = wp_get_widget_defaults();
    55 
    56 // for the sake of PHP warnings
    57 if ( empty( $sidebars_widgets[$sidebar] ) )
    58     $sidebars_widgets[$sidebar] = array();
    59 
    60 $http_post = 'post' == strtolower($_SERVER['REQUEST_METHOD']);
    61 
    62 // We're updating a sidebar
    63 if ( $http_post && isset($sidebars_widgets[$_POST['sidebar']]) ) {
    64     check_admin_referer( 'edit-sidebar_' . $_POST['sidebar'] );
    65 
    66     /* Hack #1
    67      * The widget_control is overloaded.  It updates the widget's options AND echoes out the widget's HTML form.
    68      * Since we want to update before sending out any headers, we have to catch it with an output buffer,
    69      */
    70     ob_start();
    71         /* There can be multiple widgets of the same type, but the widget_control for that
    72          * widget type needs only be called once if it's a multi-widget.
    73          */
    74         $already_done = array();
    75 
    76         foreach ( $wp_registered_widget_updates as $name => $control ) {
    77             if ( in_array( $control['callback'], $already_done ) )
    78                 continue;
    79 
    80             if ( is_callable( $control['callback'] ) ) {
    81                 call_user_func_array( $control['callback'], $control['params'] );
    82                 $control_output = ob_get_contents();
    83                 if ( false !== strpos( $control_output, '%i%' ) ) // if it's a multi-widget, only call control function once.
    84                     $already_done[] = $control['callback'];
    85             }
    86 
    87             ob_clean();
    88         }
    89     ob_end_clean();
    90 
    91     // Prophylactic.  Take out empty ids.
    92     if ( isset($_POST['widget-id']) ) {
    93         foreach ( (array) $_POST['widget-id'] as $key => $val ) {
    94             if ( !$val )
    95                 unset($_POST['widget-id'][$key]);
    96         }
    97     }
    98 
    99     // Reset the key numbering and store
    100     $new_sidebar = isset( $_POST['widget-id'] ) && is_array( $_POST['widget-id'] ) ? array_values( $_POST['widget-id'] ) : array();
    101     $sidebars_widgets[$_POST['sidebar']] = $new_sidebar;
    102     wp_set_sidebars_widgets( $sidebars_widgets );
    103 
    104     wp_redirect( add_query_arg( 'message', 'updated' ) );
    105     exit;
    106 }
    107 
    108 // What widget (if any) are we editing
    109 $edit_widget = -1;
    110 
    111 $query_args = array('add', 'remove', 'key', 'edit', '_wpnonce', 'message', 'base' );
    112 
    113 if ( isset($_GET['add']) && $_GET['add'] ) {
    114     // Add to the end of the sidebar
    115     $control_callback;
    116     if ( isset($wp_registered_widgets[$_GET['add']]) ) {
    117         check_admin_referer( "add-widget_$_GET[add]" );
    118         $sidebars_widgets[$sidebar][] = $_GET['add'];
    119         wp_set_sidebars_widgets( $sidebars_widgets );
    120     } elseif ( isset($_GET['base']) && isset($_GET['key']) ) { // It's a multi-widget
    121         check_admin_referer( "add-widget_$_GET[add]" );
    122         // Copy minimal info from an existing instance of this widget to a new instance
    123         foreach ( $wp_registered_widget_controls as $control ) {
    124             if ( $_GET['base'] === $control['id_base'] ) {
    125                 $control_callback = $control['callback'];
    126                 $num = (int) $_GET['key'];
    127                 $control['params'][0]['number'] = $num;
    128                 $control['id'] = $control['id_base'] . '-' . $num;
    129                 $wp_registered_widget_controls[$control['id']] = $control;
    130                 $sidebars_widgets[$sidebar][] = $control['id'];
    131                 break;
    132             }
    133         }
    134     }
    135 
    136     // it's a multi-widget.  The only way to add multi-widgets without JS is to actually submit POST content...
    137     // so here we go
    138     if ( is_callable( $control_callback ) ) {
    139         require_once( 'admin-header.php' );
    140     ?>
    141         <div class="wrap">
    142         <h2><?php _e( 'Add Widget' ); ?></h2>
    143         <br />
    144         <form action="<?php echo clean_url( remove_query_arg( $query_args ) ); ?>" method="post">
    145 
    146             <ul class="widget-control-list">
    147                 <li class="widget-list-control-item">
    148                     <div class="widget-top">
    149                     <h4 class="widget-title"><?php echo $control['name']; ?></h4>
    150                     </div>
    151                     <div class="widget-control" style="display: block;">
    152     <?php
    153                         call_user_func_array( $control_callback, $control['params'] );
    154     ?>
    155                         <div class="widget-control-actions">
    156                             <input type="submit" class="button" value="<?php _e( 'Add Widget' ); ?>" />
    157                             <input type="hidden" id='sidebar' name='sidebar' value="<?php echo $sidebar; ?>" />
    158     <?php   wp_nonce_field ( 'edit-sidebar_' . $sidebar );
    159         foreach ( $sidebars_widgets[$sidebar] as $sidebar_widget_id ) : ?>
    160                             <input type="hidden" name='widget-id[]' value="<?php echo $sidebar_widget_id; ?>" />
    161     <?php   endforeach; ?>
    162                         </div>
    163                     </div>
    164                 </li>
    165             </ul>
    166         </form>
    167         </div>
    168     <?php
    169 
    170         require_once( 'admin-footer.php' );
    171         exit;
    172     }
    173     wp_redirect( remove_query_arg( $query_args ) );
    174     exit;
    175 } elseif ( isset($_GET['remove']) && $_GET['remove'] && isset($_GET['key']) && is_numeric($_GET['key']) ) {
    176     // Remove from sidebar the widget of type $_GET['remove'] and in position $_GET['key']
    177     $key = (int) $_GET['key'];
    178     if ( -1 < $key && ( $keys = array_keys($sidebars_widgets[$sidebar], $_GET['remove']) ) && in_array($key, $keys) ) {
    179         check_admin_referer( "remove-widget_$_GET[remove]" );
    180         unset($sidebars_widgets[$sidebar][$key]);
    181         $sidebars_widgets[$sidebar] = array_values($sidebars_widgets[$sidebar]);
    182         wp_set_sidebars_widgets( $sidebars_widgets );
    183     }
    184     wp_redirect( remove_query_arg( $query_args ) );
    185     exit;
    186 } elseif ( isset($_GET['edit']) && $_GET['edit'] && isset($_GET['key']) && is_numeric($_GET['key']) ) {
    187     // Edit widget of type $_GET['edit'] and position $_GET['key']
    188     $key = (int) $_GET['key'];
    189     if ( -1 < $key && ( $keys = array_keys($sidebars_widgets[$sidebar], $_GET['edit']) ) && in_array($key, $keys) )
    190         $edit_widget = $key;
    191 }
    192 
    193 // Total number of registered sidebars
    194 $sidebar_widget_count = count($sidebars_widgets[$sidebar]);
    195 
    196 // This is sort of lame since "widget" won't be converted to "widgets" in the JS
    197 if ( 1 < $sidebars_count = count($wp_registered_sidebars) )
    198     $sidebar_info_text = _n( 'You are using %1$s widget in the "%2$s" sidebar.', 'You are using %1$s widgets in the "%2$s" sidebar.', $sidebar_widget_count );
    199 else
    200     $sidebar_info_text = _n( 'You are using %1$s widget in the sidebar.', 'You are using %1$s widgets in the sidebar.', $sidebar_widget_count );
    201 
    202 
    203 $sidebar_info_text = sprintf( wp_specialchars( $sidebar_info_text ), "<span id='widget-count'>$sidebar_widget_count</span>", $wp_registered_sidebars[$sidebar]['name'] );
    204 
    205 $page = isset($_GET['apage']) ? abs( (int) $_GET['apage'] ) : 1;
    206 
    207 /* TODO: Paginate widgets list
    208 $page_links = paginate_links( array(
    209     'base'    => add_query_arg( 'apage', '%#%' ),
    210     'format'  => '',
    211     'total'   => ceil(($total = 105 )/ 10),
    212     'current' => $page
    213 ));
    214 */
    215 $page_links = '&nbsp;';
    216 
     109/*
    217110// Unsanitized!
    218111$widget_search = isset($_GET['s']) ? $_GET['s'] : false;
     
    224117    'used'   => __( 'Show used widgets' )
    225118);
     119*/
    226120
    227121$show = isset($_GET['show']) && isset($show_values[$_GET['show']]) ? attribute_escape( $_GET['show'] ) : false;
     
    237131<?php endif; ?>
    238132
     133
     134<div id="message" class="updated"><p>This page is not 100% ready, please use only on test installations.</p></div>
     135
     136
    239137<div class="wrap">
    240138<?php screen_icon(); ?>
    241139<h2><?php echo wp_specialchars( $title ); ?></h2>
    242140
     141
     142<!--
    243143    <form id="widgets-filter" action="" method="get">
    244144
     
    248148        <div class="nav">
    249149            <select name="show" id="show">
    250 <?php foreach ( $show_values as $show_value => $show_text ) : $show_value = attribute_escape( $show_value ); ?>
    251                 <option value='<?php echo $show_value; ?>'<?php selected( $show_value, $show ); ?>><?php echo wp_specialchars( $show_text ); ?></option>
    252 <?php endforeach; ?>
     150<?php //foreach ( $show_values as $show_value => $show_text ) : $show_value = attribute_escape( $show_value ); ?>
     151                <option value='<?php //echo $show_value; ?>'<?php //selected( $show_value, $show ); ?>><?php //echo wp_specialchars( $show_text ); ?></option>
     152<?php //endforeach; ?>
    253153            </select>
    254154            <input type="submit" value="<?php _e('Show' ); ?>" class="button-secondary" />
    255155            <p class="pagenav">
    256                 <?php echo $page_links; ?>
     156                <?php // echo $page_links; ?>
    257157            </p>
    258158        </div>
     
    265165        <div class="nav">
    266166            <select id="sidebar-selector" name="sidebar">
    267 <?php foreach ( $wp_registered_sidebars as $sidebar_id => $registered_sidebar ) : $sidebar_id = attribute_escape( $sidebar_id ); ?>
    268                 <option value='<?php echo $sidebar_id; ?>'<?php selected( $sidebar_id, $sidebar ); ?>><?php echo wp_specialchars( $registered_sidebar['name'] ); ?></option>
    269 <?php endforeach; ?>
     167<?php //foreach ( $wp_registered_sidebars as $sidebar_id => $registered_sidebar ) : $sidebar_id = attribute_escape( $sidebar_id ); ?>
     168                <option value='<?php //echo $sidebar_id; ?>'<?php selected( $sidebar_id, $open_sidebar ); ?>><?php //echo wp_specialchars( $registered_sidebar['name'] ); ?></option>
     169<?php //endforeach; ?>
    270170            </select>
    271171            <input type="submit" value="<?php _e('Show' ); ?>" class="button-secondary" />
     
    275175
    276176    </form>
    277 
    278     <div id="widget-content" class="widget-liquid-left-holder">
    279 
    280         <div id="available-widgets" class="widget-liquid-left">
    281 
    282             <?php wp_list_widgets( $show, $widget_search ); // This lists all the widgets for the query ( $show, $search ) ?>
    283 
    284             <div class="nav">
    285                 <p class="pagenav">
    286                     <?php echo $page_links; ?>
    287                 </p>
    288             </div>
    289         </div>
    290     </div>
    291 
    292     <form id="widget-controls" action="" method="post">
    293 
     177-->
     178
     179    <div class="widget-liquid-left">
     180    <div id="widgets-left">
     181        <div id="available-widgets" class="widgets-holder-wrap">
     182            <h3 class="sidebar-name"><?php _e('Available Widgets'); ?></h3>
     183            <?php wp_list_widgets(); ?>
     184            <br class="clear" />
     185        </div>
     186
     187        <div id="wp_inactive_widgets" class="widgets-holder-wrap">
     188            <h3 class="sidebar-name"><?php _e('Inactive Widgets'); ?>
     189            <span><img src="images/loading-publish.gif" class="ajax-feedback" title="" alt="" /></span></h3>
     190            <?php wp_list_widget_controls('wp_inactive_widgets'); ?>
     191            <br class="clear" />
     192        </div>
     193    </div>
     194    </div>
     195
     196<!--
    294197    <div id="current-widgets-head" class="widget-liquid-right">
    295198
    296199        <div id="sidebar-info">
    297             <p><?php echo $sidebar_info_text; ?></p>
     200            <p><?php //echo $sidebar_info_text; ?></p>
    298201            <p><?php _e( 'Add more from the Available Widgets section.' ); ?></p>
    299202        </div>
    300203
    301204    </div>
    302 
    303     <div id="current-widgets" class="widget-liquid-right">
    304         <div id="current-sidebar">
    305 
    306             <?php wp_list_widget_controls( $sidebar ); // Show the control forms for each of the widgets in this sidebar ?>
    307 
    308         </div>
    309 
    310         <p class="submit">
    311             <input type="hidden" id='sidebar' name='sidebar' value="<?php echo $sidebar; ?>" />
    312             <input type="hidden" id="generated-time" name="generated-time" value="<?php echo time() - 1199145600; // Jan 1, 2008 ?>" />
    313             <input type="submit" name="save-widgets" class="button-primary" value="<?php _e( 'Save Changes' ); ?>" />
    314 <?php
    315             wp_nonce_field( 'edit-sidebar_' . $sidebar );
    316 ?>
    317         </p>
    318     </div>
    319 
     205-->
     206
     207    <div class="widget-liquid-right">
     208<?php
     209    $i = 0;
     210    foreach ( $wp_registered_sidebars as $sidebar => $registered_sidebar ) {
     211        if ( 'wp_inactive_widgets' == $sidebar )
     212            continue;
     213        ?>
     214        <div id="<?php echo attribute_escape( $sidebar ); ?>" class="widgets-holder-wrap">
     215        <h3 class="sidebar-name"><?php echo wp_specialchars( $registered_sidebar['name'] ); ?>
     216        <span><img src="images/loading-publish.gif" class="ajax-feedback" title="" alt="" /></span></h3>
     217        <?php wp_list_widget_controls( $sidebar, $i ); // Show the control forms for each of the widgets in this sidebar ?>
     218        </div>
     219<?php
     220       $i++;
     221    } ?>
     222    </div>
     223    <form action="" method="post">
     224    <?php wp_nonce_field( 'save-sidebar-widgets', '_wpnonce_widgets', false ); ?>
    320225    </form>
    321226    <br class="clear" />
    322 
    323227</div>
    324228
    325 <?php do_action( 'sidebar_admin_page' ); ?>
    326 
    327 <?php require_once( 'admin-footer.php' ); ?>
    328 
    329 
     229<?php
     230do_action( 'sidebar_admin_page' );
     231require_once( 'admin-footer.php' );
  • trunk/wp-admin/wp-admin.css

    r10872 r10912  
    15451545}
    15461546
    1547 .ui-sortable .postbox h3 {
    1548     cursor: pointer;
     1547.widget .widget-top,
     1548.postbox h3 {
     1549    cursor: move;
    15491550    -webkit-user-select: none;
    15501551    -moz-user-select: none;
     
    15531554}
    15541555
    1555 .ui-sortable .postbox .hndle span {
     1556.postbox .hndle span {
    15561557    padding: 6px 0;
    15571558}
    15581559
    1559 .ui-sortable .postbox .hndle {
     1560.postbox .hndle {
    15601561    cursor: move;
    15611562}
     
    15701571}
    15711572
    1572 .meta-box-sortables .postbox .handlediv {
     1573.postbox .handlediv {
    15731574    float: right;
    15741575    width: 23px;
     
    15911592}
    15921593
    1593 .metabox-holder .postbox,
    1594 #poststuff .postbox,
    1595 #poststuff .stuffbox {
     1594.widget,
     1595.postbox,
     1596.stuffbox {
    15961597    margin-bottom: 20px;
    15971598    border-width: 1px;
     
    16041605}
    16051606
    1606 .metabox-holder .postbox h3,
    1607 #poststuff .postbox h3,
    1608 #poststuff .stuffbox h3 {
     1607.widget .widget-top,
     1608.postbox h3,
     1609.postbox h3,
     1610.stuffbox h3 {
    16091611    -moz-border-radius: 6px 6px 0 0;
    16101612    -webkit-border-top-right-radius: 6px;
     
    30513053    clear: none;
    30523054}
     3055
     3056.ajax-feedback {
     3057    visibility: hidden;
     3058    vertical-align: bottom;
     3059}
  • trunk/wp-includes/default-widgets.php

    r10896 r10912  
    141141        <p>
    142142        <label for="<?php echo $this->get_field_id('category'); ?>">
    143         <select id="<?php echo $this->get_field_id('category'); ?>" name="<?php echo $this->get_field_name('category'); ?>" style="width: 97%;" />
     143        <select class="widefat" id="<?php echo $this->get_field_id('category'); ?>" name="<?php echo $this->get_field_name('category'); ?>">
    144144        <option value=""><?php _e('All Links'); ?></option>
    145145        <?php
     
    150150        }
    151151        ?>
    152         </select></label><br />
     152        </select></label></p>
     153        <p>
    153154        <label for="<?php echo $this->get_field_id('images'); ?>">
    154155        <input class="checkbox" type="checkbox" <?php checked($instance['images'], true) ?> id="<?php echo $this->get_field_id('images'); ?>" name="<?php echo $this->get_field_name('images'); ?>" /> <?php _e('Show Link Image'); ?></label><br />
     
    185186        echo $after_widget;
    186187    }
     188
     189    function form( $instance ) { ?>
     190        <input name="<?php echo $this->get_field_name('title'); ?>" type="hidden" value="" />
     191<?php
     192    }
     193
    187194}
    188195
     
    883890        $items = 10;
    884891        $error = false;
    885         $number = '%i%';
     892        $number = '__i__';
    886893        $show_summary = 0;
    887894        $show_author = 0;
  • trunk/wp-includes/script-loader.php

    r10884 r10912  
    331331        $scripts->add_data( 'media-upload', 'group', 1 );
    332332
    333         $scripts->add( 'admin-widgets', "/wp-admin/js/widgets$suffix.js", array( 'interface' ), '20090106' );
    334         $scripts->localize( 'admin-widgets', 'widgetsL10n', array(
    335             'add' => __('Add'),
    336             'edit' => __('Edit'),
    337             'cancel' => __('Cancel'),
    338             'lameReminder' => __('Remember to click the "Save Changes" button at the bottom of the Current Widgets column after you\'re all done!'),
    339             'lamerReminder' => __("You're about to leave without having saved your changes!"),
    340             'l10n_print_after' => 'try{convertEntities(widgetsL10n);}catch(e){};'
    341         ));
     333        $scripts->add( 'admin-widgets', "/wp-admin/js/widgets$suffix.js", array( 'jquery-ui-sortable', 'jquery-ui-draggable' ), '20090411' );
     334        $scripts->add_data( 'admin-widgets', 'group', 1 );
    342335
    343336        $scripts->add( 'word-count', "/wp-admin/js/word-count$suffix.js", array( 'jquery' ), '20090102' );
     
    426419    $rtl_styles = array( 'global', 'colors', 'dashboard', 'ie', 'install', 'login', 'media', 'theme-editor', 'upload', 'widgets', 'press-this', 'plugin-install', 'farbtastic' );
    427420
    428     $styles->add( 'wp-admin', '/wp-admin/wp-admin.css', array(), '20090405' );
     421    $styles->add( 'wp-admin', '/wp-admin/wp-admin.css', array(), '20090411' );
    429422    $styles->add_data( 'wp-admin', 'rtl', '/wp-admin/rtl.css' );
    430423
    431     $styles->add( 'ie', '/wp-admin/css/ie.css', array(), '20090407' );
     424    $styles->add( 'ie', '/wp-admin/css/ie.css', array(), '20090411' );
    432425    $styles->add_data( 'ie', 'conditional', 'lte IE 7' );
    433426
    434     $styles->add( 'colors', true, array(), '20090405' ); // Register "meta" stylesheet for admin colors
     427    $styles->add( 'colors', true, array(), '20090411' ); // Register "meta" stylesheet for admin colors
    435428    $styles->add( 'colors-fresh', '/wp-admin/css/colors-fresh.css', array(), '20081210'); // for login.php.  Is there a better way?
    436429    $styles->add_data( 'colors-fresh', 'rtl', true );
     
    438431    $styles->add_data( 'colors-classic', 'rtl', true );
    439432
    440     $styles->add( 'global', '/wp-admin/css/global.css', array(), '20090407' );
     433    $styles->add( 'global', '/wp-admin/css/global.css', array(), '20090411' );
    441434    $styles->add( 'media', '/wp-admin/css/media.css', array(), '20090325' );
    442     $styles->add( 'widgets', '/wp-admin/css/widgets.css', array(), '20081210' );
     435    $styles->add( 'widgets', '/wp-admin/css/widgets.css', array(), '20090411' );
    443436    $styles->add( 'dashboard', '/wp-admin/css/dashboard.css', array(), '20090305' );
    444437    $styles->add( 'install', '/wp-admin/css/install.css', array(), '20081210' );
  • trunk/wp-includes/widgets.php

    r10822 r10912  
    5050     * This function should check that $new_instance is set correctly.
    5151     * The newly calculated value of $instance should be returned.
     52     * If "false" is returned, the instance won't be saved/updated.
    5253     *
    5354     * @param array $new_instance New settings for this instance as input by the user via form()
    5455     * @param array $old_instance Old settings for this instance
    55      * @return array Settings to save
     56     * @return array Settings to save or bool false to cancel saving
    5657     */
    5758    function update($new_instance, $old_instance) {
     
    192193                $this_sidebar = array();
    193194
    194             foreach ( $this_sidebar as $_widget_id )    {
    195                 // Remove all widgets of this type from the sidebar. We'll add the
    196                 // new data in a second. This makes sure we don't get any duplicate
    197                 // data since widget ids aren't necessarily persistent across multiple
    198                 // updates
    199                 if ( $this->_get_display_callback() == $wp_registered_widgets[$_widget_id]['callback'] && isset($wp_registered_widgets[$_widget_id]['params'][0]['number']) ) {
    200                     $number = $wp_registered_widgets[$_widget_id]['params'][0]['number'];
    201                     if( !in_array( $this->id_base . '-' . $number, (array)$_POST['widget-id'] ) ) {
    202                         // the widget has been removed.
     195            if ( isset($_POST['delete_widget']) && $_POST['delete_widget'] ) {
     196                // Delete the settings for this instance of the widget
     197                if ( isset($_POST['widget-id']) )
     198                    $del_id = $_POST['widget-id'];
     199                else
     200                    return;
     201
     202                if ( $this->_get_display_callback() == $wp_registered_widgets[$del_id]['callback'] && isset($wp_registered_widgets[$del_id]['params'][0]['number']) ) {
     203                    $number = $wp_registered_widgets[$del_id]['params'][0]['number'];
     204
     205                    if ( $this->id_base . '-' . $number == $del_id ) {
    203206                        unset($all_instances[$number]);
    204207                    }
    205208                }
    206             }
    207 
    208             foreach ( (array) $_POST['widget-' . $this->id_base] as $number => $new_instance ) {
    209                 $new_instance = stripslashes_deep($new_instance);
    210                 $this->_set($number);
    211 
    212                 if ( !isset($new_instance['submit']) )
    213                     continue;
    214 
    215                 if ( isset($all_instances[$number]) )
    216                     $instance = $this->update($new_instance, $all_instances[$number]);
    217                 else
    218                     $instance = $this->update($new_instance, array());
    219 
    220                 if ( !empty($instance) )
    221                     $all_instances[$number] = $instance;
     209            } else {
     210                foreach ( (array) $_POST['widget-' . $this->id_base] as $number => $new_instance ) {
     211                    $new_instance = stripslashes_deep($new_instance);
     212                    $this->_set($number);
     213
     214                    if ( isset($all_instances[$number]) )
     215                        $instance = $this->update($new_instance, $all_instances[$number]);
     216                    else
     217                        $instance = $this->update($new_instance, array());
     218
     219                    if ( false !== $instance )
     220                        $all_instances[$number] = $instance;
     221                }
    222222            }
    223223
     
    237237
    238238        if ( -1 == $widget_args['number'] ) {
    239             // We echo out a form where 'number' can be set later via JS
    240             $this->_set('%i%');
     239            // We echo out a form where 'number' can be set later
     240            $this->_set('__i__');
    241241            $instance = array();
    242242        } else {
     
    246246
    247247        $this->form($instance);
    248 ?>
    249         <input type="hidden" id="<?php echo $this->get_field_id('submit'); ?>" name="<?php echo $this->get_field_name('submit'); ?>" value="1" />
    250 <?php
    251248    }
    252249
     
    254251    function _register_one($number = -1) {
    255252        wp_register_sidebar_widget( $this->id, $this->name, $this->_get_display_callback(), $this->widget_options, array( 'number' => $number ) );
    256         _register_widget_update_callback(   $this->id, $this->name, $this->_get_update_callback(), $this->control_options, array( 'number' => $number ) );
     253        _register_widget_update_callback( $this->id_base, $this->_get_update_callback(), $this->control_options, array( 'number' => -1 ) );
    257254        _register_widget_form_callback( $this->id, $this->name, $this->_get_form_callback(), $this->control_options, array( 'number' => $number ) );
    258255    }
     
    580577
    581578    $id = strtolower($id);
     579    $update_id = preg_replace( '/-[0-9]+$/', '', $id );
    582580
    583581    if ( empty($control_callback) ) {
    584582        unset($wp_registered_widget_controls[$id]);
    585         unset($wp_registered_widget_updates[$id]);
     583        unset($wp_registered_widget_updates[$update_id]);
    586584        return;
    587585    }
     
    603601    $widget = array_merge($widget, $options);
    604602
    605     $wp_registered_widget_controls[$id] = $wp_registered_widget_updates[$id] = $widget;
    606 }
    607 
    608 function _register_widget_update_callback($id, $name, $update_callback, $options = array()) {
     603    $wp_registered_widget_controls[$id] = $widget;
     604
     605    if ( isset($wp_registered_widget_updates[$update_id]) )
     606        return;
     607
     608    if ( isset($widget['params'][0]['number']) )
     609        $widget['params'][0]['number'] = -1;
     610
     611    unset($widget['width'], $widget['height'], $widget['name'], $widget['id']);
     612    $wp_registered_widget_updates[$update_id] = $widget;
     613}
     614
     615function _register_widget_update_callback($id_base, $update_callback, $options = array()) {
    609616    global $wp_registered_widget_updates;
    610617
    611     $id = strtolower($id);
    612 
    613     if ( empty($update_callback) ) {
    614         unset($wp_registered_widget_updates[$id]);
     618    if ( isset($wp_registered_widget_updates[$id_base]) ) {
     619        if ( empty($update_callback) )
     620            unset($wp_registered_widget_updates[$id_base]);
    615621        return;
    616622    }
    617623
    618     if ( isset($wp_registered_widget_updates[$id]) && !did_action( 'widgets_init' ) )
    619         return;
    620 
    621     $defaults = array('width' => 250, 'height' => 200 ); // height is never used
    622     $options = wp_parse_args($options, $defaults);
    623     $options['width'] = (int) $options['width'];
    624     $options['height'] = (int) $options['height'];
    625 
    626624    $widget = array(
    627         'name' => $name,
    628         'id' => $id,
    629625        'callback' => $update_callback,
    630         'params' => array_slice(func_get_args(), 4)
     626        'params' => array_slice(func_get_args(), 3)
    631627    );
     628
    632629    $widget = array_merge($widget, $options);
    633 
    634     $wp_registered_widget_updates[$id] = $widget;
     630    $wp_registered_widget_updates[$id_base] = $widget;
    635631}
    636632
     
    648644        return;
    649645
    650     $defaults = array('width' => 250, 'height' => 200 ); // height is never used
     646    $defaults = array('width' => 250, 'height' => 200 );
    651647    $options = wp_parse_args($options, $defaults);
    652648    $options['width'] = (int) $options['width'];
Note: See TracChangeset for help on using the changeset viewer.