diff --git a/wp-admin/menu.php b/wp-admin/menu.php index 383abeb799..4e09015830 100644 --- a/wp-admin/menu.php +++ b/wp-admin/menu.php @@ -67,6 +67,7 @@ $submenu['plugins.php'][5] = array(__('Plugins'), 'activate_plugins', 'plugins.p $submenu['plugins.php'][10] = array(__('Plugin Editor'), 'edit_plugins', 'plugin-editor.php'); $submenu['themes.php'][5] = array(__('Themes'), 'switch_themes', 'themes.php'); +$submenu['themes.php'][7] = array( __( 'Widgets' ), 'edit_themes', 'widgets.php' ); $submenu['themes.php'][10] = array(__('Theme Editor'), 'edit_themes', 'theme-editor.php'); // Create list of page plugin hook names. diff --git a/wp-admin/widgets.css b/wp-admin/widgets.css new file mode 100644 index 0000000000..fc5acfcfbb --- /dev/null +++ b/wp-admin/widgets.css @@ -0,0 +1,215 @@ +body { + height: 100%; +} + +#sbadmin #zones { + width: px; + -moz-user-select: none; + -khtml-user-select: none; + user-select: none; +} + +#sbreset { + float: left; + margin: 1px 0; +} + +.dropzone { + float: left; + margin-right: 10px; + padding: 5px; + border: 1px solid #bbb; + background-color: #f0f8ff; +} + +.dropzone h3 { + text-align: center; + color: #333; +} + +.dropzone ul { + list-style-type: none; + width: 240px; + height: px; + float: left; + margin: 0; + padding: 0; +} + +* .module, #lastmodule { + width: 238px; + padding: 0; + margin: 5px 0; + cursor: move; + display: block; + border: 1px solid #ccc; + background-color: #fbfbfb; + text-align: left; + line-height: 25px; +} + +* .handle, #lastmodule span { + display: block; + width: 216px; + padding: 0 10px; + border-top: 1px solid #f2f2f2; + border-right: 1px solid #e8e8e8; + border-bottom: 1px solid #e8e8e8; + border-left: 1px solid #f2f2f2; +} + +* .popper { + margin: 0; + display: inline; + position: absolute; + top: 3px; + right: 3px; + overflow: hidden; + text-align: center; + height: 16px; + font-size: 18px; + line-height: 14px; + cursor: pointer; + padding: 0 3px 1px; + border-top: 4px solid #6da6d1; + background: url( images/fade-butt.png ) -5px 0px; +} + +* html .popper { + padding: 1px 6px 0; + font-size: 16px; +} + +#sbadmin p.submit { + padding-right: 10px; + clear: left; +} + +.placematt { + position: absolute; + cursor: default; + margin: 10px 0 0; + padding: 0; + width: 238px; + background-color: #ffe; +} + +* html .placematt { + margin-top: 5px; +} + +.placematt h4 { + text-align: center; + margin-bottom: 5px; +} + +.placematt span { + padding: 0 10px 10px; + text-align: justify; +} + +#palettediv { + border: 1px solid #bbb; + background-color: #f0f8ff; + height: 180px; + margin-top: 10px; +} + +#palettediv h3 { + text-align: center; + color: #333; +} + +#palettediv ul { + padding: 0 0 0 10px; +} + +#palettediv .module, #lastmodule { + margin-right: 10px; + float: left; + width: 120px; +} + +#palettediv .handle, #lastmodule span { + height: 40px; + font-size: 90%; + width: 110px; + padding: 0 5px; +} + +#palettediv .popper { + visibility: hidden; +} + +#lastmodule { + visibility: hidden; +} + +* html #palettediv ul { + margin: 0; + padding: 0 0 0 10px; +} + +* html #palettediv .module { + float: none; + display: inline; +} + +#controls { + height: 0px; +} + +.control { + position: absolute; + display: block; + background: #f9fcfe; + padding: 0; +} + +.controlhandle { + cursor: move; + background-color: #6da6d1; + border-bottom: 2px solid #448abd; + color: #333; + display: block; + margin: 0 0 5px; + padding: 4px; + font-size: 120%; +} + +.controlcloser { + cursor: pointer; + font-size: 120%; + display: block; + position: absolute; + top: 2px; + right: 8px; + padding: 0 3px; + font-weight: bold; +} + +.controlform { + margin: 20px 30px; +} + +.controlform p { + text-align: center; +} + +.control .checkbox { + border: none; + background: transparent; +} + +.hidden { + display: none; +} + +#shadow { + background: black; + display: none; + position: absolute; + top: 0px; + left: 0px; + width: 100%; +} \ No newline at end of file diff --git a/wp-admin/widgets.js.php b/wp-admin/widgets.js.php new file mode 100644 index 0000000000..f090d0944b --- /dev/null +++ b/wp-admin/widgets.js.php @@ -0,0 +1,138 @@ + $sidebar ) { + $cols[] = '\'' . $index . '\''; + } + $cols = implode( ', ', $cols ); + + $widgets = array(); + foreach ( $wp_registered_widgets as $name => $widget ) { + $widgets[] = '\'' . $widget['id'] . '\''; + } + $widgets = implode( ', ', $widgets ); +?> +var cols = []; +var widgets = []; +var controldims = new Array; + $widget ) : ?> + controldims['control'] = new Array; + controldims['control']['width'] = ; + controldims['control']['height'] = ; + +function initWidgets() { + $widget ) : ?> + $('popper').onclick = function() {popControl('control');}; + $('closer').onclick = function() {unpopControl('control');}; + new Draggable('control', {revert:false,handle:'controlhandle',starteffect:function(){},endeffect:function(){},change:function(o){dragChange(o);}}); + if ( true && window.opera ) + $('control').style.border = '1px solid #bbb'; + + if ( true && window.opera ) + $('shadow').style.background = 'transparent'; + new Effect.Opacity('shadow', {to:0.0}); + widgets.map(function(o) {o='widgetprefix-'+o; Position.absolutize(o); Position.relativize(o);} ); + $A(Draggables.drags).map(function(o) {o.startDrag(null); o.finishDrag(null);}); + for ( var n in Draggables.drags ) { + if ( Draggables.drags[n].element.id == 'lastmodule' ) { + Draggables.drags[n].destroy(); + break; + } + } + resetPaletteHeight(); +} +function resetDroppableHeights() { + var max = 6; + cols.map(function(o) {var c = $(o).childNodes.length; if ( c > max ) max = c;} ); + var height = 35 * ( max + 1); + cols.map(function(o) {h = (($(o).childNodes.length + 1) * 35); $(o).style.height = (h > 280 ? h : 280) + 'px';} ); +} +function resetPaletteHeight() { + var p = $('palette'), pd = $('palettediv'), last = $('lastmodule'); + p.appendChild(last); + if ( Draggables.activeDraggable && last.id == Draggables.activeDraggable.element.id ) + last = last.previousSibling; + var y1 = Position.cumulativeOffset(last)[1] + last.offsetHeight; + var y2 = Position.cumulativeOffset(pd)[1] + pd.offsetHeight; + var dy = y1 - y2; + pd.style.height = (pd.offsetHeight + dy + 9) + "px"; +} +function maxHeight(elm) { + htmlheight = document.body.parentNode.clientHeight; + bodyheight = document.body.clientHeight; + var height = htmlheight > bodyheight ? htmlheight : bodyheight; + $(elm).style.height = height + 'px'; +} +function dragChange(o) { + el = o.element ? o.element : $(o); + var p = Position.page(el); + var right = p[0]; + var top = p[1]; + var left = $('shadow').offsetWidth - (el.offsetWidth + left); + var bottom = $('shadow').offsetHeight - (el.offsetHeight + top); + if ( right < 1 ) el.style.left = 0; + if ( top < 1 ) el.style.top = 0; + if ( left < 1 ) el.style.left = (left + right) + 'px'; + if ( bottom < 1 ) el.style.top = (top + bottom) + 'px'; +} +function popControl(elm) { + el = $(elm); + el.style.width = controldims[elm]['width'] + 'px'; + el.style.height = controldims[elm]['height'] + 'px'; + var x = ( document.body.clientWidth - controldims[elm]['width'] ) / 2; + var y = ( document.body.parentNode.clientHeight - controldims[elm]['height'] ) / 2; + el.style.position = 'absolute'; + el.style.right = '' + x + 'px'; + el.style.top = '' + y + 'px'; + el.style.zIndex = 1000; + el.className='control'; + $('shadow').onclick = function() {unpopControl(elm);}; + window.onresize = function(){maxHeight('shadow');dragChange(elm);}; + popShadow(); +} +function popShadow() { + maxHeight('shadow'); + var shadow = $('shadow'); + shadow.style.zIndex = 999; + shadow.style.display = 'block'; + new Effect.Opacity('shadow', {duration:0.5, from:0.0, to:0.2}); +} +function unpopShadow() { + new Effect.Opacity('shadow', {to:0.0}); + $('shadow').style.display = 'none'; +} +function unpopControl(el) { + $(el).className='hidden'; + unpopShadow(); +} +function serializeAll() { + $sidebar ) : ?> + $('order').value = Sortable.serialize(''); + +} +function updateAll() { + resetDroppableHeights(); + resetPaletteHeight(); + cols.map(function(o){ + var pm = $(o+'placematt'); + if ( $(o).childNodes.length == 0 ) { + pm.style.display = 'block'; + Position.absolutize(o+'placematt'); + } else { + pm.style.display = 'none'; + } + }); +} +function noSelection(event) { + if ( document.selection ) { + var range = document.selection.createRange(); + range.collapse(false); + range.select(); + return false; + } +} +addLoadEvent(updateAll); +addLoadEvent(initWidgets); +Event.observe(window, 'resize', resetPaletteHeight); \ No newline at end of file diff --git a/wp-admin/widgets.php b/wp-admin/widgets.php new file mode 100644 index 0000000000..8a2bf20350 --- /dev/null +++ b/wp-admin/widgets.php @@ -0,0 +1,239 @@ + + +≡' + : ''; + + $output = '
  • %2$s
  • '; + + printf( $output, $sanitized_name, $name . $popper ); +} + +$title = __( 'Widgets' ); +$parent_file = 'themes.php'; + +require_once 'admin-header.php'; + +if ( count( $wp_registered_sidebars ) < 1 ) { +?> +
    +

    + +

    follow these instructions.' ); /* TODO: article on codex */; ?>

    +
    + $sidebar ) { + $postindex = $index . 'order'; + + parse_str( $_POST[$postindex], $order ); + + $new_order = $order[$index]; + + if ( is_array( $new_order ) ) { + foreach ( $new_order as $sanitized_name ) { + foreach ( $wp_registered_widgets as $name => $widget ) { + if ( $sanitized_name == $widget['id'] ) { + $sidebars_widgets[$index][] = $name; + } + } + } + } + } + + wp_set_sidebars_widgets( $sidebars_widgets ); + break; + } +} + +ksort( $wp_registered_widgets ); + +$inactive_widgets = array(); + +foreach ( $wp_registered_widgets as $name => $widget ) { + $is_active = false; + + foreach ( $wp_registered_sidebars as $index => $sidebar ) { + if ( is_array( $sidebars_widgets[$index] ) && in_array( $name, $sidebars_widgets[$index] ) ) { + $is_active = true; + break; + } + } + + if ( !$is_active ) { + $inactive_widgets[] = $name; + } +} + +$containers = array( 'palette' ); + +foreach ( $wp_registered_sidebars as $index => $sidebar ) { + $containers[] = $index; +} + +$c_string = ''; + +foreach ( $containers as $container ) { + $c_string .= '"' . $container . '",'; +} + +$c_string = substr( $c_string, 0, -1 ); + +if ( isset( $_POST['action'] ) ) { +?> +
    +

    View site »' ), get_bloginfo( 'url' ) . '/' ); ?>

    +
    + +
    +

    + +

    + +
    +
    + $sidebar ) { + ?> + + +
    +

    + +
    + +

    + +
    +
    + +
      + +
    +
    + + +
    + +
    + +
    +

    + +
      + +
    • +
    +
    + + + +

    + + + +

    + +
    + $widget ) { ?> + + +
    +
    + +
    +
    + +
    + + + + \ No newline at end of file diff --git a/wp-includes/images/rss.png b/wp-includes/images/rss.png new file mode 100644 index 0000000000..6e7b676b34 Binary files /dev/null and b/wp-includes/images/rss.png differ diff --git a/wp-includes/widgets.php b/wp-includes/widgets.php new file mode 100644 index 0000000000..33802acd97 --- /dev/null +++ b/wp-includes/widgets.php @@ -0,0 +1,1814 @@ + 1 ) { + if ( strpos( $name, '%d' ) === false ) { + $name = $name . ' %d'; + } + + $args['name'] = sprintf( $name, $i ); + } + + register_sidebar( $args ); + } + } +} + +if ( !function_exists( 'register_sidebar' ) ) { + function register_sidebar( $args = array() ) { + global $wp_registered_sidebars; + + if ( is_string( $args ) ) { + parse_str( $args, $args ); + } + + $defaults = array( + 'name' => sprintf( __( 'Sidebar %d' ), count( $wp_registered_sidebars ) + 1 ), + 'before_widget' => '
  • ', + 'after_widget' => "
  • \n", + 'before_title' => '

    ', + 'after_title' => "

    \n" + ); + + $defaults = apply_filters( 'register_sidebar_defaults', $defaults, $args ); + + $sidebar = array_merge( $defaults, $args ); + + $sidebar['id'] = sanitize_title( $sidebar['name'] ); + + $wp_registered_sidebars[$sidebar['id']] = $sidebar; + + return $sidebar['id']; + } +} + +if ( !function_exists( 'unregister_sidebar' ) ) { + function unregister_sidebar( $name ) { + global $wp_registered_sidebars; + + if ( isset( $wp_registered_sidebars[$name] ) ) { + unset( $wp_registered_sidebars[$name] ); + } + } +} + +if ( !function_exists( 'register_sidebar_widget' ) ) { + function register_sidebar_widget( $name, $output_callback, $classname = '' ) { + global $wp_registered_widgets, $wp_register_widget_defaults; + + if ( is_array( $name ) ) { + $id = sanitize_title( sprintf( $name[0], $name[2] ) ); + $name = sprintf( __( $name[0], $name[1] ), $name[2] ); + } else { + $id = sanitize_title( $name ); + $name = __( $name ); + } + + if ( ( empty( $classname ) || !is_string( $classname ) ) && is_string( $output_callback ) ) { + $classname = $output_callback; + } + + $widget = array( + 'id' => $id, + 'callback' => $output_callback, + 'classname' => $classname, + 'params' => array_slice( func_get_args(), 2 ) + ); + + if ( empty( $output_callback ) ) { + unset( $wp_registered_widgets[$name] ); + } elseif ( is_callable( $output_callback ) && ( !isset( $wp_registered_widgets[$name] ) || !$wp_register_widget_defaults ) ) { + $wp_registered_widgets[$name] = $widget; + } + } +} + +if ( !function_exists( 'unregister_sidebar_widget' ) ) { + function unregister_sidebar_widget( $name ) { + register_sidebar_widget( $name, '' ); + unregister_widget_control( $name ); + } +} + +if ( !function_exists( 'register_widget_control' ) ) { + function register_widget_control( $name, $control_callback, $width = 300, $height = 200 ) { + global $wp_registered_widget_controls, $wp_registered_sidebar_defaults; + + $width = (int) $width; + $height = (int) $height; + + if ( is_array( $name ) ) { + $id = sanitize_title( sprintf( $name[0], $name[2] ) ); + $name = sprintf( __( $name[0], $name[1] ), $name[2] ); + } else { + $id = sanitize_title( $name ); + $name = __( $name ); + } + + $width = ( $width > 90 ) ? $width + 60 : 360; + $height = ( $height > 60 ) ? $height + 40 : 240; + + if ( empty( $control_callback ) ) { + unset( $wp_registered_widget_controls[$name] ); + } elseif ( !isset( $wp_registered_widget_controls[$name] ) || !$wp_registered_sidebar_defaults ) { + $wp_registered_widget_controls[$name] = array( + 'id' => $id, + 'callback' => $control_callback, + 'width' => $width, + 'height' => $height, + 'params' => array_slice( func_get_args(), 4 ) + ); + } + } +} + +if ( !function_exists( 'unregister_widget_control' ) ) { + function unregister_widget_control( $name ) { + register_sidebar_control( $name, '' ); + } +} + +if ( !function_exists( 'dynamic_sidebar' ) ) { + function dynamic_sidebar( $name = 1 ) { + global $wp_registered_sidebars, $wp_registered_widgets; + + if ( is_int( $name ) ) { + $index = sanitize_title( __( 'Sidebar' ) . ' ' . $name ); + $name = sprintf( __( 'Sidebar %d' ), $name ); + } else { + $index = sanitize_title( $name ); + } + + $sidebars_widgets = wp_get_sidebars_widgets(); + + $sidebar = $wp_registered_sidebars[$index]; + + if ( empty( $sidebar ) || !is_array( $sidebars_widgets[$index] ) || empty( $sidebars_widgets[$index] ) ) { + return false; + } + + $did_one = false; + + foreach ( $sidebars_widgets[$index] as $name ) { + $callback = $wp_registered_widgets[$name]['callback']; + + $params = array_merge( array( $sidebar ), (array) $wp_registered_widgets[$name]['params'] ); + $params[0]['before_widget'] = sprintf( $params[0]['before_widget'], $wp_registered_widgets[$name]['id'], $wp_registered_widgets[$name]['classname'] ); + + if ( is_callable( $callback ) ) { + call_user_func_array( $callback, $params ); + $did_one = true; + } + } + + return $did_one; + } +} + +if ( !function_exists( 'is_active_widget' ) ) { + function is_active_widget( $callback ) { + global $wp_registered_widgets; + + $sidebars_widgets = wp_get_sidebars_widgets(); + + if ( is_array( $sidebars_widgets ) ) { + foreach ( $sidebars_widgets as $sidebar => $widgets ) { + if ( is_array( $widgets) ) { + foreach ( $widgets as $widget ) { + if ( $wp_registered_widgets[$widget]['callback'] == $callback ) { + return true; + } + } + } + } + } + + return false; + } +} + +if ( !function_exists( 'is_dynamic_sidebar' ) ) { + function is_dynamic_sidebar() { + global $wp_registered_sidebars, $wp_registered_widgets; + + $sidebars_widgets = wp_get_sidebars_widgets(); + + foreach ( $wp_registered_sidebars as $index => $sidebar ) { + if ( count( $sidebars_widgets[$index] ) > 0 ) { + foreach ( $sidebars_widgets[$index] as $widget ) { + if ( array_key_exists( $widget, $wp_registered_sidebars ) ) { + return true; + } + } + } + } + + return false; + } +} + +/* Internal Functions */ + +function wp_get_sidebars_widgets() { + return get_option( 'wp_sidebars_widgets' ); +} + +function wp_set_sidebars_widgets( $sidebars_widgets ) { + update_option( 'wp_sidebars_widgets', $sidebars_widgets ); +} + +function wp_get_widget_defaults() { + global $wp_registered_sidebars; + + $defaults = array(); + + foreach ( $wp_registered_sidebars as $index => $sidebar ) { + $defaults[$index] = array(); + } + + return $defaults; +} + +/* Default Widgets */ + +function wp_widget_pages( $args ) { + extract( $args ); + + $options = get_option( 'wp_widget_pages' ); + + $title = ( empty( $options['title'] ) ) ? __( 'Pages' ) : $options['title']; + + echo $before_widget . $before_title . $title . $after_title . "\n" . $after_widget; +} + +function wp_widget_pages_control() { + $options = $newoptions = get_option( 'wp_widget_pages' ); + + if ( isset( $_POST['pages-submit'] ) ) { + $newoptions['title'] = strip_tags( stripslashes( $_POST['pages-title'] ) ); + + if ( $newoptions != $options ) { + $options = $newoptions; + update_option( 'wp_widget_pages', $options ); + } + } + + $title = htmlspecialchars( $options['title'], ENT_QUOTES ); +?> +

    + + $before_title, 'title_after' => $after_title, + 'category_before' => $before_widget, 'category_after' => $after_widget + ) ); + } +} + +function wp_widget_search( $args ) { + extract( $args ); +?> + +
    +

    +
    +
    + + + + + + + +

    +

    + + + + + + + +

    + + + + +
    + +
    + + +

    + + + + +
    + + + + + + 9 ) { + $i = 9; + } elseif ( $i < 1 ) { + $i = 1; + } + + $newoptions['number'] = $i; + + if ( $newoptions != $options ) { + $options = $newoptions; + update_option( 'wp_widget_text', $options ); + } + } +} + +function wp_widget_text_page() { + $options = get_option( 'widget_text' ); + + $i = $options['number']; +?> +
    +
    +

    + +

    + + +

    +
    +
    + 9 ) { + $i = 9; + } + + for ( $j = 1; $j <= 9; $j++ ) { + $name = array( 'Text %s', '', $i ); + register_sidebar_widget( $name, ( $j <= $i ) ? 'wp_widget_text' : '', $j ); + register_widget_control( $name, ( $j <= $i ) ? 'wp_widget_text_control' : '', 460, 350, $j ); + } + + add_action( 'sidebar_admin_setup', 'wp_widget_text_setup' ); + add_action( 'sidebar_admin_page', 'wp_widget_text_page' ); +} + +function wp_widget_categories( $args ) { + extract( $args ); + + $options = get_option( 'wp_widget_categories' ); + + $title = ( empty( $options['title'] ) ) ? __( 'Categories' ) : $options['title']; + $c = ( $options['count'] ) ? '1' : '0'; + $h = ( $options['hierarchical'] ) ? '1' : '0'; +?> + + + + + +

    +

    +

    + +have_posts() ) { + return; + } +?> + + + + +get_results( "SELECT * FROM $wpdb->comments WHERE comment_approved = '1' ORDER BY comment_date_gmt DESC LIMIT 5" ); + + if ( is_array( $comments ) && count( $comments ) > 0 ) { +?> + + + + + +

    + + + + 10 ) { + $number_items = 10; + } + + $url = $options[$i]['url']; + + if ( empty( $url ) ) { + return; + } + + while ( strstr( $url, 'http' ) != $url ) { + $url = substr( $url, 1 ); + } + + $rss = fetch_rss( $url ); + + $link = wp_specialchars( strip_tags( $rss->channel['link'] ), 1 ); + + while ( strstr( $link, 'http' ) != $link ) { + $link = substr( $link, 1 ); + } + + $desc = wp_specialchars( strip_tags( html_entity_decode( $rss->channel['description'], ENT_QUOTES ) ), 1 ); + + $title = $options[$i]['title']; + + if ( empty( $title ) ) { + $title = htmlentities( strip_tags( $rss->channel['title'] ) ); + } + + if ( empty( $title ) ) { + $title = $desc; + } + + if ( empty( $title ) ) { + $title = __( 'Unknown Feed' ); + } + + $url = wp_specialchars( strip_tags( $url ), 1 ); + + if ( file_exists( ABSPATH . 'wp-content/rss.png' ) ) { + $icon = get_bloginfo( 'wpurl' ) . '/wp-content/rss.png'; + } else { + $icon = get_bloginfo( 'wpurl' ) . '/wp-includes/images/rss.png'; + } + + $h2 = '%4$s %7$s'; + $h2 = sprintf( $h2, $url, __( 'Syndicate this content' ), $icon, __( 'RSS' ), $link, $desc, $title ); +?> + + +