home *** CD-ROM | disk | FTP | other *** search
/ Cricao de Sites - 650 Layouts Prontos / WebMasters.iso / Blogs / wordpress2.6.exe / wordpress2.6 / wp-admin / includes / widgets.php < prev   
Encoding:
PHP Script  |  2008-07-04  |  9.8 KB  |  290 lines

  1. <?php
  2.  
  3. // $_search is unsanitized
  4. function wp_list_widgets( $show = 'all', $_search = false ) {
  5.     global $wp_registered_widgets, $sidebars_widgets, $wp_registered_widget_controls;
  6.     if ( $_search ) {
  7.         // sanitize
  8.         $search = preg_replace( '/[^\w\s]/', '', $_search );
  9.         // array of terms
  10.         $search_terms = preg_split( '/[\s]/', $search, -1, PREG_SPLIT_NO_EMPTY );
  11.     } else {
  12.         $search_terms = array();
  13.     }
  14.  
  15.     if ( !in_array( $show, array( 'all', 'unused', 'used' ) ) )
  16.         $show = 'all';
  17. ?>
  18.  
  19.     <ul id='widget-list'>
  20.         <?php
  21.         $no_widgets_shown = true;
  22.         $already_shown = array();
  23.         foreach ( $wp_registered_widgets as $name => $widget ) :
  24.             if ( 'all' == $show && in_array( $widget['callback'], $already_shown ) ) // We already showed this multi-widget
  25.                 continue;
  26.  
  27.             if ( $search_terms ) {
  28.                 $hit = false;
  29.                 // Simple case-insensitive search.  Boolean OR.
  30.                 $search_text = preg_replace( '/[^\w]/', '', $widget['name'] );
  31.                 if ( isset($widget['description']) )
  32.                     $search_text .= preg_replace( '/[^\w]/', '', $widget['description'] );
  33.  
  34.                 foreach ( $search_terms as $search_term ) {
  35.                     if ( stristr( $search_text, $search_term ) ) {
  36.                         $hit = true;
  37.                         break;
  38.                     }
  39.                 }
  40.                 if ( !$hit )
  41.                     continue;
  42.             }
  43.  
  44.             $sidebar = is_active_widget( $widget['callback'], $widget['id'] );
  45.  
  46.             if ( ( 'unused' == $show && $sidebar ) || ( 'used' == $show && !$sidebar ) )
  47.                 continue;
  48.  
  49.             ob_start();
  50.                 $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] ) );
  51.                 $sidebar_args = call_user_func_array( 'wp_widget_control', $args );
  52.             $widget_control_template = ob_get_contents();
  53.             ob_end_clean();
  54.  
  55.             $widget_id = $widget['id']; // save this for later in case we mess with $widget['id']
  56.  
  57.             $is_multi = false !== strpos( $widget_control_template, '%i%' );
  58.             if ( !$sidebar || $is_multi ) {
  59.                 $add_query = array(
  60.                     'sidebar' => $sidebar,
  61.                     'key' => false,
  62.                     'edit' => false
  63.                 );
  64.                 if ( 'all' == $show && $is_multi ) {
  65.                     // it's a multi-widget.  We only need to show it in the list once.
  66.                     $already_shown[] = $widget['callback'];
  67.                     $num = (int) array_pop( $ids = explode( '-', $widget['id'] ) );
  68.                     $id_base = $wp_registered_widget_controls[$widget['id']]['id_base'];
  69.                     // so that we always add a new one when clicking "add"
  70.                     while ( isset($wp_registered_widgets["$id_base-$num"]) )
  71.                         $num++;
  72.                     $widget['id'] = "$id_base-$num";
  73.                     $add_query['base'] = $id_base;
  74.                     $add_query['key'] = $num;
  75.                     $add_query['sidebar'] = $GLOBALS['sidebar'];
  76.                 }
  77.                 $add_query['add'] = $widget['id'];
  78.                 $action = 'add';
  79.                 $add_url = clean_url( wp_nonce_url( add_query_arg( $add_query ), "add-widget_$widget[id]" ) );
  80.             } else {
  81.                 $action = 'edit';
  82.                 $edit_url = clean_url( add_query_arg( array(
  83.                     'sidebar' => $sidebar,
  84.                     'edit' => $widget['id'],
  85.                     'key' => array_search( $widget['id'], $sidebars_widgets[$sidebar] ),
  86.                 ) ) );
  87.                 
  88.                 $widget_control_template = '<textarea rows="1" cols="1">' . htmlspecialchars( $widget_control_template ) . '</textarea>';
  89.             }
  90.  
  91.             $widget_control_template = $sidebar_args['before_widget'] . $widget_control_template . $sidebar_args['after_widget'];
  92.  
  93.             $no_widgets_shown = false;
  94.  
  95.  
  96.             if ( 'all' != $show && $sidebar_args['_widget_title'] )
  97.                 $widget_title = $sidebar_args['_widget_title'];
  98.             else
  99.                 $widget_title = $widget['name'];
  100.         ?>
  101.  
  102.         <li id="widget-list-item-<?php echo attribute_escape( $widget['id'] ); ?>" class="widget-list-item">
  103.             <h4 class="widget-title widget-draggable">
  104.  
  105.                 <span><?php echo $widget_title; ?></span>
  106.  
  107.                 <?php if ( 'add' == $action ) : ?>
  108.  
  109.                 <a class="widget-action widget-control-add" href="<?php echo $add_url; ?>"><?php _e( 'Add' ); ?></a>
  110.  
  111.                 <?php elseif ( 'edit' == $action ) :
  112.                     // We echo a hidden edit link for the sake of the JS.  Edit links are shown (needlessly?) after a widget is added.
  113.                 ?>
  114.  
  115.                 <a class="widget-action widget-control-edit" href="<?php echo $edit_url; ?>" style="display: none;"><?php _e( 'Edit' ); ?></a>
  116.  
  117.                 <?php endif; ?>
  118.  
  119.                 <br class="clear" />
  120.  
  121.             </h4>
  122.  
  123.  
  124.             <ul id="widget-control-info-<?php echo $widget['id']; ?>" class="widget-control-info">
  125.  
  126.                 <?php echo $widget_control_template; ?>
  127.  
  128.             </ul>
  129.  
  130.             <?php if ( 'add' == $action ) : ?>
  131.             <?php endif; ?>
  132.  
  133.             <div class="widget-description">
  134.                 <?php echo ( $widget_description = wp_widget_description( $widget_id ) ) ? $widget_description : ' '; ?>
  135.             </div>
  136.  
  137.             <br class="clear" />
  138.  
  139.         </li>
  140.  
  141.         <?php endforeach; if ( $no_widgets_shown ) : ?>
  142.  
  143.         <li><?php _e( 'No matching widgets' ); ?></li>
  144.  
  145.         <?php endif; ?>
  146.  
  147.     </ul>
  148. <?php
  149. }
  150.  
  151.  
  152.  
  153. function wp_list_widget_controls( $sidebar ) {
  154.     add_filter( 'dynamic_sidebar_params', 'wp_list_widget_controls_dynamic_sidebar' );
  155. ?>
  156.  
  157.     <ul class="widget-control-list">
  158.  
  159.         <?php if ( !dynamic_sidebar( $sidebar ) ) echo "<li />"; ?>
  160.  
  161.     </ul>
  162.  
  163. <?php
  164. }
  165.  
  166.  
  167. function wp_list_widget_controls_dynamic_sidebar( $params ) {
  168.     global $wp_registered_widgets;
  169.     static $i = 0;
  170.     $i++;
  171.  
  172.     $widget_id = $params[0]['widget_id'];
  173.  
  174.     $params[0]['before_widget'] = "<li id='widget-list-control-item-$i-$widget_id' class='widget-list-control-item widget-sortable'>\n";
  175.     $params[0]['after_widget'] = "</li>";
  176.     $params[0]['before_title'] = "%BEG_OF_TITLE%";
  177.     $params[0]['after_title'] = "%END_OF_TITLE%";
  178.     if ( is_callable( $wp_registered_widgets[$widget_id]['callback'] ) ) {
  179.         $wp_registered_widgets[$widget_id]['_callback'] = $wp_registered_widgets[$widget_id]['callback'];
  180.         $wp_registered_widgets[$widget_id]['callback'] = 'wp_widget_control';
  181.     }
  182.     return $params;
  183. }
  184.  
  185. /*
  186.  * Meta widget used to display the control form for a widget.  Called from dynamic_sidebar()
  187.  */
  188. function wp_widget_control( $sidebar_args ) {
  189.     global $wp_registered_widgets, $wp_registered_widget_controls, $sidebars_widgets, $edit_widget;
  190.     $widget_id = $sidebar_args['widget_id'];
  191.     $sidebar_id = isset($sidebar_args['id']) ? $sidebar_args['id'] : false;
  192.  
  193.     $control = $wp_registered_widget_controls[$widget_id];
  194.     $widget  = $wp_registered_widgets[$widget_id];
  195.  
  196.     $key = $sidebar_id ? array_search( $widget_id, $sidebars_widgets[$sidebar_id] ) : 'no-key'; // position of widget in sidebar
  197.  
  198.     $edit = -1 <  $edit_widget && is_numeric($key) && $edit_widget === $key; // (bool) are we currently editing this widget
  199.  
  200.     $id_format = $widget['id'];
  201.     // We aren't showing a widget control, we're outputing a template for a mult-widget control
  202.     if ( 'all' == $sidebar_args['_show'] && 'template' == $sidebar_args['_display'] && isset($control['params'][0]['number']) ) {
  203.         // number == -1 implies a template where id numbers are replaced by a generic '%i%'
  204.         $control['params'][0]['number'] = -1;
  205.         // if given, id_base means widget id's should be constructed like {$id_base}-{$id_number}
  206.         if ( isset($control['id_base']) )
  207.             $id_format = $control['id_base'] . '-%i%';
  208.     }
  209.  
  210.     $widget_title = '';
  211.     // We grab the normal widget output to find the widget's title
  212.     if ( ( 'all' != $sidebar_args['_show'] || 'template' != $sidebar_args['_display'] ) && is_callable( $widget['_callback'] ) ) {
  213.         ob_start();
  214.         $args = func_get_args();
  215.         call_user_func_array( $widget['_callback'], $args );
  216.         $widget_title = ob_get_clean();
  217.         $widget_title = wp_widget_control_ob_filter( $widget_title );
  218.     }
  219.     $wp_registered_widgets[$widget_id]['callback'] = $wp_registered_widgets[$widget_id]['_callback'];
  220.     unset($wp_registered_widgets[$widget_id]['_callback']);
  221.  
  222.     if ( $widget_title && $widget_title != $sidebar_args['widget_name'] )
  223.         $widget_title = sprintf( _c('%1$s: %2$s|1: widget name, 2: widget title' ), $sidebar_args['widget_name'], $widget_title );
  224.     else
  225.         $widget_title = wp_specialchars( strip_tags( $sidebar_args['widget_name'] ) );
  226.  
  227.     $sidebar_args['_widget_title'] = $widget_title;
  228.  
  229.     if ( empty($sidebar_args['_display']) || 'template' != $sidebar_args['_display'] )
  230.         echo $sidebar_args['before_widget'];
  231. ?>
  232.         <div class="widget-top">
  233.         <h4 class="widget-title"><span><?php echo $widget_title ?></span>
  234.  
  235.             <?php if ( $edit ) : ?>
  236.  
  237.             <a class="widget-action widget-control-edit" href="<?php echo clean_url( remove_query_arg( array( 'edit', 'key' ) ) ); ?>"><?php _e('Cancel'); ?></a>
  238.  
  239.             <?php else : ?>
  240.  
  241.             <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>
  242.  
  243.             <?php endif; ?>
  244.  
  245.             <br class="clear" />
  246.  
  247.         </h4></div>
  248.  
  249.         <div class="widget-control"<?php if ( $edit ) echo ' style="display: block;"'; ?>>
  250.  
  251.             <?php
  252.             if ( $control )
  253.                 call_user_func_array( $control['callback'], $control['params'] );
  254.             else
  255.                 echo '<p>' . __('There are no options for this widget.') . '</p>';
  256.             ?>
  257.  
  258.             <input type="hidden" name="widget-id[]" value="<?php echo $id_format; ?>" />
  259.             <input type="hidden" class="widget-width" value="<?php echo $control['width']; ?>" />
  260.  
  261.             <div class="widget-control-actions">
  262.  
  263.                 <?php if ( $control ) : ?>
  264.  
  265.                 <a class="widget-action widget-control-save wp-no-js-hidden edit alignleft" href="#save:<?php echo $id_format; ?>"><?php _e('Change'); ?></a>
  266.  
  267.                 <?php endif; ?>
  268.  
  269.                 <a class="widget-action widget-control-remove delete 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>
  270.                 <br class="clear" />
  271.             </div>
  272.         </div>
  273. <?php
  274.     if ( empty($sidebar_args['_display']) || 'template' != $sidebar_args['_display'] )
  275.         echo $sidebar_args['after_widget'];
  276.     return $sidebar_args;
  277. }
  278.  
  279. function wp_widget_control_ob_filter( $string ) {
  280.     if ( false === $beg = strpos( $string, '%BEG_OF_TITLE%' ) )
  281.         return '';
  282.     if ( false === $end = strpos( $string, '%END_OF_TITLE%' ) )
  283.         return '';
  284.     $string = substr( $string, $beg + 14 , $end - $beg - 14);
  285.     $string = str_replace( ' ', ' ', $string );
  286.     return trim( wp_specialchars( strip_tags( $string ) ) );
  287. }
  288.  
  289. ?>
  290.