WordPress.org

Make WordPress Core

Ticket #5316: 5316.5.diff

File 5316.5.diff, 16.3 KB (added by DD32, 10 years ago)
  • wp-admin/js/common.js

     
    55        // Reveal
    66        jQuery('.wp-no-js-hidden').removeClass( 'wp-no-js-hidden' );
    77
     8        // Hide elements which are shown via Javascript. (Show by default for non-js viewers)
     9        jQuery('.wp-js-hide').hide()
     10
    811        // Basic form validation
    912        if ( ( 'undefined' != typeof wpAjax ) && jQuery.isFunction( wpAjax.validateForm ) ) {
    1013                jQuery('form.validate').submit( function() { return wpAjax.validateForm( jQuery(this) ); } );
  • wp-admin/js/forms.js

     
    11function checkAll(jQ) { // use attr( checked, fn )
    2         jQuery(jQ).find( 'tbody :checkbox' ).attr( 'checked', function() {
     2        jQuery(jQ).find( 'tbody tr:visible :checkbox' ).attr( 'checked', function() {
    33                return jQuery(this).attr( 'checked' ) ? '' : 'checked';
    44        } );
    55}
     
    1010                if ( 'undefined' == e.shiftKey ) { return true; }
    1111                if ( e.shiftKey ) {
    1212                        if ( !lastClicked ) { return true; }
    13                         var checks = $( lastClicked ).parents( 'form:first' ).find( ':checkbox' );
     13                        var checks = $( lastClicked ).parents( 'form:first' ).find( 'tr:visible :checkbox' );
    1414                        var first = checks.index( lastClicked );
    1515                        var last = checks.index( this );
    1616                        if ( 0 < first && 0 < last && first != last ) {
  • wp-admin/options.php

     
    55$this_file = 'options.php';
    66$parent_file = 'options-general.php';
    77
    8 wp_reset_vars(array('action'));
     8wp_reset_vars(array('action', 'show', 'view'));
    99
    1010if ( !current_user_can('manage_options') )
    1111        wp_die(__('Cheatin&#8217; uh?'));
    1212
     13if ( isset($_POST['show-submit']) )
     14        $action = ''; //Prevent action=update firing if its a show-submit.
     15else if ( isset($_POST['delete-submit']) )
     16        $action = 'delete';
     17
     18function options_javascript(){
     19?>
     20<script type="text/javascript">
     21        function filterTable(force_filter){
     22                var phrase = jQuery('#show').val();
     23                var callback = function(){ //Uncheck any checkbox's which are now hidden
     24                        jQuery('tr:not(:visible) :checkbox').each( function(){ jQuery(this).attr('checked',''); } );
     25                }
     26               
     27                if( phrase != ''){
     28                        if( phrase.length > 2 || force_filter)
     29                                jQuery.uiTableFilter(jQuery('#options-table'), phrase, null, callback); //Perform a filter
     30                } else { //Else lets do a more efficient show-all
     31                        jQuery('#options-table tr').show();
     32                }
     33
     34                return false; //Prevent pagereload.
     35        }
     36       
     37        function confirmDelete(){
     38                delete_items = Array();
     39                jQuery(':checked').each( function(){ delete_items.push(jQuery(this).val()); });
     40                if( delete_items.length == 0 )
     41                        return false;
     42                else if( delete_items.length == 1 )
     43                        var strConfirm = '<?php _e('Are you sure you want to delete the Setting "%s"') ?>';
     44                else
     45                        var strConfirm = '<?php _e('Are you sure you want to delete the Settings "%s"') ?>';
     46                strConfirm = strConfirm.replace('%s', delete_items.join('", "'));
     47                return confirm(strConfirm);
     48        }
     49       
     50        //Only perform a filter if a key hasnt been pressed for 250ms.
     51        var search_timeout = undefined;
     52        addLoadEvent( function() {
     53                jQuery('#show').bind('keyup', function() {
     54                        if( typeof(search_timeout) != undefined)
     55                                clearTimeout(search_timeout);
     56
     57                        search_timeout = window.setTimeout(function() {
     58                                search_timeout = undefined;
     59                                filterTable();
     60                        }, 250);
     61                });
     62        });
     63       
     64</script>
     65<?php
     66}
     67
    1368switch($action) {
    1469
     70case 'delete':
     71
     72        check_admin_referer('update-options');
     73
     74        $delete = (array)$_POST['checked'];
     75        $goback = remove_query_arg('updated', wp_get_referer());
     76
     77        if( count($delete) > 0 ){
     78                foreach( (array) $delete as $option)
     79                        delete_option($option);
     80                update_option('deleted_options', $delete);
     81                $goback = add_query_arg('deleted', 'true', $goback);
     82        }
     83
     84        if( !empty($show) )
     85                $goback = add_query_arg('show', $show, $goback);
     86        wp_redirect($goback);
     87    break;
     88
    1589case 'update':
    16         $any_changed = 0;
    1790
    1891        check_admin_referer('update-options');
    1992
    2093        if ( !$_POST['page_options'] ) {
    2194                foreach ( (array) $_POST as $key => $value) {
    22                         if ( !in_array($key, array('_wpnonce', '_wp_http_referer')) )
     95                        if ( !in_array($key, array('_wpnonce', '_wp_http_referer', 'action')) )
    2396                                $options[] = $key;
    2497                }
    2598        } else {
     
    30103                foreach ($options as $option) {
    31104                        $option = trim($option);
    32105                        $value = $_POST[$option];
    33                         if(!is_array($value))   $value = trim($value);
     106                        if( ! is_array($value) )
     107                                $value = trim($value);
    34108                        $value = stripslashes_deep($value);
    35109                        update_option($option, $value);
    36110                }
    37111        }
    38 
    39         $goback = add_query_arg('updated', 'true', wp_get_referer());
     112        $goback = remove_query_arg('deleted', wp_get_referer());
     113        $goback = add_query_arg('updated', 'true', $goback);
     114        if( !empty($show) )
     115                $goback = add_query_arg('show', $show, $goback);
    40116        wp_redirect($goback);
    41     break;
     117        break;
    42118
    43119default:
    44         include('admin-header.php'); ?>
    45120
     121        wp_enqueue_script('admin-forms');
     122        wp_enqueue_script('ui-table-filter');
     123        add_action('admin_head', 'options_javascript');
     124
     125        include('admin-header.php');
     126
     127        if( isset($_GET['deleted']) ){
     128                $deleted = get_option('deleted_options');
     129                if( ! empty($deleted) )
     130                        echo '<div id="message" class="updated fade"><p>' . sprintf(__('<strong>Settings Deleted:</strong> The following settings have been deleted: <em>%s</em>'), implode(', ', $deleted) ) . '</p></div>';
     131                delete_option('deleted_options');
     132        }
     133        ?>
    46134<div class="wrap">
    47   <h2><?php _e('All Settings'); ?></h2>
    48   <form name="form" action="options.php" method="post" id="all-options">
    49   <?php wp_nonce_field('update-options') ?>
    50   <input type="hidden" name="action" value="update" />
    51   <table class="form-table">
     135        <form name="form" action="options.php" method="post" id="settings-filter">
     136       
     137        <h2><?php _e('All Settings'); ?></h2>
     138       
     139        <?php wp_nonce_field('update-options') ?>
     140        <input type="hidden" name="action" value="update" />
     141       
     142        <p id="settings-search">
     143                <label class="hidden" for="show"><?php _e('Search Settings:') ?></label>
     144                <input name="show" id="show" type="text" value="<?php echo wp_specialchars($show) ?>" />
     145                <input type="submit" name="show-submit" class="button" onclick="return filterTable(true);" value="<?php _e('Search Settings'); ?>" />
     146        </p>
     147       
     148        <div class="tablenav">
     149                <input type="submit" name="delete-submit" id="delete-submit" class="button-secondary delete" onclick="return confirmDelete();" value="<?php _e('Delete Selected Settings') ?>" />
     150        </div>
     151        <br class="clear" />
     152        <table class="widefat" id="options-table">
     153        <thead>
     154                <tr>
     155                        <th scope="col" class="check-column"><input type="checkbox" /></th>
     156                        <th scope="col" style="width: 200px;"><?php _e('Setting Name') ?></th>
     157                        <th scope="col"><?php _e('Setting Value') ?></th>
     158                </tr>
     159        </thead>
     160        <tbody>
    52161<?php
    53 $options = $wpdb->get_results("SELECT * FROM $wpdb->options ORDER BY option_name");
     162$where = '';
     163if( ! empty($show) )
     164        $where = $wpdb->prepare("WHERE option_name LIKE '%s'", "%$show%");
    54165
    55 foreach ( (array) $options as $option) :
    56         $disabled = '';
     166$options = $wpdb->get_results("SELECT * FROM $wpdb->options $where ORDER BY option_name");
     167
     168foreach ( (array)$options as $option) {
     169
    57170        $option->option_name = attribute_escape($option->option_name);
    58171        if ( is_serialized($option->option_value) ) {
    59                 if ( is_serialized_string($option->option_value) ) {
    60                         // this is a serialized string, so we should display it
     172                if ( is_serialized_string($option->option_value) )
     173                        $type = 'string';
     174                elseif ( is_serialized_array($option->option_value) )
     175                        $type = 'array';
     176                else
     177                        $type = 'other';
     178        } else {
     179                $type = 'string';
     180        }
     181       
     182        echo "
     183        <tr>
     184                <th scope='row' class='check-column'><input type='checkbox' name='checked[]' value='$option->option_name' /></th>
     185                <th scope='row'><label for='$option->option_name'>$option->option_name</label></th>
     186                <td>";
     187        switch( $type ){
     188                case 'string':
    61189                        $value = maybe_unserialize($option->option_value);
     190                        if (strpos($value, "\n") !== false)
     191                                echo "<textarea name='$option->option_name' id='$option->option_name' cols='30' rows='5'>" . wp_specialchars($value) . "</textarea>";
     192                        else
     193                                echo "<input type='text' name='$option->option_name' id='$option->option_name' size='30' value='" . attribute_escape($value) . "' />";
    62194                        $options_to_update[] = $option->option_name;
    63                         $class = 'all-options';
    64                 } else {
    65                         $value = 'SERIALIZED DATA';
    66                         $disabled = ' disabled="disabled"';
    67                         $class = 'all-options disabled';
    68                 }
    69         } else {
    70                 $value = $option->option_value;
    71                 $options_to_update[] = $option->option_name;
    72                 $class = 'all-options';
     195                        break;
     196                case 'array':
     197                        echo "<p><a href='#$option->option_name' onclick='jQuery(\"#$option->option_name\").show(); jQuery(this).parent().hide(); return false;'>" . __('View Serialzed Data') . '</a></p>';
     198                        echo "<pre id='$option->option_name' class='wp-js-hide'>";
     199                        print_r( unserialize($option->option_value) );
     200                        echo '</pre>';
     201                        break;
     202                case 'other': //Generally Objects, Objects are quite large usually, And as such, Its not worth loading them. (think RSS caches etc)
     203                default:
     204                        echo "<input type='text' name='$option->option_name' id='$option->option_name' size='30' class='disabled' disabled='disabled' value='" . attribute_escape(__('Unable to display Data')) . "' />";
     205                        break;
    73206        }
    74         echo "
    75 <tr>
    76         <th scope='row'><label for='$option->option_name'>$option->option_name</label></th>
    77 <td>";
    78207
    79         if (strpos($value, "\n") !== false) echo "<textarea class='$class' name='$option->option_name' id='$option->option_name' cols='30' rows='5'>" . wp_specialchars($value) . "</textarea>";
    80         else echo "<input class='$class' type='text' name='$option->option_name' id='$option->option_name' size='30' value='" . attribute_escape($value) . "'$disabled />";
    81 
    82208        echo "</td>
    83 </tr>";
    84 endforeach;
     209        </tr>";
     210}
    85211?>
    86   </table>
    87 <?php $options_to_update = implode(',', $options_to_update); ?>
    88 <p class="submit"><input type="hidden" name="page_options" value="<?php echo $options_to_update; ?>" /><input type="submit" name="Update" value="<?php _e('Save Changes') ?>" /></p>
    89   </form>
     212        </tbody>
     213        </table>
     214        <p class="submit">
     215                <input type="hidden" name="page_options" value="<?php echo implode(',', (array)$options_to_update); ?>" />
     216                <input type="submit" name="Update" value="<?php _e('Save Changes') ?>" />
     217        </p>
     218        </form>
    90219</div>
    91220
    92 
    93221<?php
     222include('admin-footer.php');
    94223break;
    95224} // end switch
    96 
    97 include('admin-footer.php');
    98 ?>
     225?>
     226 No newline at end of file
  • wp-admin/wp-admin.css

     
    212212        text-align: center;
    213213}
    214214
    215 textarea.all-options, input.all-options {
    216         width: 250px;
     215#options-table td textarea, #options-table td input {
     216        width: 350px;
    217217}
    218218
    219219#postdiv, #titlediv, #guiddiv, #poststuff .stuffbox {
     
    12841284}
    12851285
    12861286/* pasitioning etc. */
    1287 form#tags-filter {
     1287form#tags-filter, form#posts-filter, form#settings-filter {
    12881288        position: relative;
    12891289}
    12901290
    1291 p#tag-search {
     1291p#tag-search, p#post-search, p#settings-search {
    12921292        position: absolute;
    12931293        right: 0;
    12941294        top: 0;
    12951295        margin: 0;
    12961296}
    12971297
    1298 form#posts-filter {
    1299         position: relative;
    1300 }
    1301 
    1302 p#post-search {
    1303         position: absolute;
    1304         right: 0;
    1305         top: 0;
    1306         margin: 0;
    1307 }
    1308 
    1309 #post-search .button, #widget-search .button {
     1298#post-search .button, #widget-search .button, #settings-search .button {
    13101299        padding: 3px;
    13111300        font-size: 13px;
    13121301}
  • wp-includes/functions.php

     
    190190        return false;
    191191}
    192192
     193function is_serialized_array( $data ){
     194        // if it isn't a string, it isn't serialized
     195        if ( !is_string( $data ) )
     196                return false;
     197        $data = trim( $data );
     198        if ( preg_match( '/^a:[0-9]+:{.*}$/s', $data ) ) // this should match all lists(arrays)
     199                return true;
     200        return false;
    193201
     202}
     203
     204
    194205/* Options functions */
    195206
    196207// expects $setting to already be SQL-escaped
  • wp-includes/js/jquery/jquery.uitablefilter.js

     
     1/*
     2 * Copyright (c) 2008 Greg Weber greg at gregweber.info
     3 * Dual licensed under the MIT and GPL licenses:
     4 * http://www.opensource.org/licenses/mit-license.php
     5 * http://www.gnu.org/licenses/gpl.html
     6 *
     7 * documentation at http://gregweber.info/projects/uitablefilter
     8 *
     9 * allows table rows to be filtered (made invisible)
     10 * <code>
     11 * t = $('table')
     12 * $.uiTableFilter( t, phrase )
     13 * </code>
     14 * arguments:
     15 *   jQuery object containing table rows
     16 *   phrase to search for
     17 *   optional arguments:
     18 *     column to limit search too (the column title in the table header)
     19 *     ifHidden - callback to execute if one or more elements was hidden
     20 */
     21jQuery.uiTableFilter = function(jq, phrase, column, ifHidden){
     22  var new_hidden = false;
     23  if( this.last_phrase === phrase ) return false;
     24
     25  var phrase_length = phrase.length;
     26  var words = phrase.toLowerCase().split(" ");
     27
     28  var success = function(elem) { elem.show() }
     29  var failure = function(elem) { elem.hide() }
     30
     31  if( column ) {
     32    var index = null;
     33    jq.find("thead > tr:last > th").each( function(i){
     34      if( $(this).text() == column ){
     35        index = i;
     36        return false;
     37      }
     38    });
     39    var iselector = "td:eq(" + index + ")";
     40 
     41    var search_text = function( ){
     42      var elem = jQuery(this);
     43      jQuery.uiTableFilter.has_words( jQuery(elem.find(iselector)).text(), words ) ?
     44        success(elem) : failure(elem);
     45    }
     46  }
     47  else {
     48    var search_text = function(){
     49        var elem = jQuery(this);
     50        jQuery.uiTableFilter.has_words( elem.text(), words ) ? elem.show() : elem.hide();
     51    }
     52  }
     53
     54  // if added one letter to last time,
     55  // just check newest word and only need to hide
     56  if( (words.size > 1) && (phrase.substr(0, phrase_length - 1) ===
     57        this.last_phrase) ) {
     58
     59    if( phrase[-1] === " " )
     60    { this.last_phrase = phrase; return false; }
     61
     62    success = function(elem) { elem.hide(); new_hidden = true; }
     63    failure = function(elem) {;}
     64    var words = words[-1];
     65    jq.find("tbody tr:visible").each( search_text )
     66  }
     67  else {
     68    new_hidden = true;
     69    jq.find("tbody > tr").each( search_text );
     70  }
     71
     72  last_phrase = phrase;
     73  if( ifHidden && new_hidden ) ifHidden();
     74  return jq;
     75};
     76jQuery.uiTableFilter.last_phrase = ""
     77
     78// not jQuery dependent
     79// "" [""] -> Boolean
     80// "" [""] Boolean -> Boolean
     81jQuery.uiTableFilter.has_words = function( str, words, caseSensitive )
     82{
     83  var text = caseSensitive ? str : str.toLowerCase();
     84  for (var i=0; i < words.length; i++) {
     85    if (text.indexOf(words[i]) === -1) return false;
     86  }
     87  return true;
     88}
     89 No newline at end of file
  • wp-includes/script-loader.php

     
    1111        }
    1212
    1313        function default_scripts() {
    14                 $this->add( 'common', '/wp-admin/js/common.js', array('jquery'), '20080318' );
     14                $this->add( 'common', '/wp-admin/js/common.js', array('jquery'), '20080517' );
    1515                $this->add( 'sack', '/wp-includes/js/tw-sack.js', false, '1.6.1' );
    1616
    1717                $this->add( 'quicktags', '/wp-includes/js/quicktags.js', false, '3958' );
     
    205205                                'updateCompleted' => __('Update completed.'),
    206206                                'error' => __('Error:')
    207207                        ));
     208                        $this->add( 'ui-table-filter', '/wp-includes/js/jquery/jquery.uitablefilter.js', array( 'jquery' ), '20080517' );
    208209                }
    209210        }
    210211