From e2b4009e666a286cf55c7c0d74a23b7bec30501a Mon Sep 17 00:00:00 2001 From: azaozz Date: Sun, 31 Aug 2008 06:34:43 +0000 Subject: [PATCH] Saving/restoring the user interface state, see #7654 git-svn-id: http://svn.automattic.com/wordpress/trunk@8784 1a063a9b-81f0-0310-95a4-ce76da25c4cd --- wp-admin/edit-form-advanced.php | 2 +- wp-admin/edit-page-form.php | 2 +- wp-admin/js/editor.js | 73 +++++----- wp-admin/js/user-settings.js | 129 ++++++++++++++++++ wp-includes/default-filters.php | 1 + wp-includes/functions.php | 128 +++++++++++++++++ wp-includes/general-template.php | 4 +- .../plugins/wordpress/editor_plugin.js | 24 ++-- wp-includes/js/tinymce/tiny_mce_config.php | 4 +- wp-includes/script-loader.php | 16 ++- 10 files changed, 324 insertions(+), 59 deletions(-) create mode 100644 wp-admin/js/user-settings.js diff --git a/wp-admin/edit-form-advanced.php b/wp-admin/edit-form-advanced.php index 9bf44ff0c3..514153617d 100644 --- a/wp-admin/edit-form-advanced.php +++ b/wp-admin/edit-form-advanced.php @@ -486,7 +486,7 @@ endif; ?>
-
+

diff --git a/wp-admin/edit-page-form.php b/wp-admin/edit-page-form.php index b48f033ba1..b79d673a1e 100644 --- a/wp-admin/edit-page-form.php +++ b/wp-admin/edit-page-form.php @@ -358,7 +358,7 @@ endif; ?>
-
+

post_content); ?> diff --git a/wp-admin/js/editor.js b/wp-admin/js/editor.js index d262de0bad..7d32a6c7f7 100644 --- a/wp-admin/js/editor.js +++ b/wp-admin/js/editor.js @@ -1,24 +1,31 @@ -wpEditorInit = function() { - var H; - - // Activate tinyMCE if it's the user's default editor - if ( ( 'undefined' == typeof wpTinyMCEConfig ) || 'tinymce' == wpTinyMCEConfig.defaultEditor ) { - try { document.getElementById('editorcontainer').style.padding = '0px'; } catch(e){}; - try { document.getElementById("quicktags").style.display = "none"; } catch(e){}; - tinyMCE.execCommand("mceAddControl", false, "content"); - } else { - if ( H = tinymce.util.Cookie.getHash("TinyMCE_content_size") ) - try { document.getElementById('content').style.height = H.ch - 30 + 'px'; } catch(e){}; - } -}; switchEditors = { + I : function(e) { + return document.getElementById(e); + }, + + edInit : function() { + var h = tinymce.util.Cookie.getHash("TinyMCE_content_size"), H = this.I('edButtonHTML'), P = this.I('edButtonPreview'); + + // Activate TinyMCE if it's the user's default editor + if ( getUserSetting( 'editor', 'tinymce' ) == 'tinymce' ) { + try { P.onclick = ''; P.className = 'active'; } catch(e){}; + try { this.I('editorcontainer').style.padding = '0px'; } catch(e){}; + try { this.I("quicktags").style.display = "none"; } catch(e){}; + tinyMCE.execCommand("mceAddControl", false, "content"); + } else { + try { H.onclick = ''; H.className = 'active'; } catch(e){}; + if ( h ) + try { this.I('content').style.height = h.ch - 30 + 'px'; } catch(e){}; + } + }, + saveCallback : function(el, content, body) { - document.getElementById(el).style.color = '#fff'; + this.I(el).style.color = '#fff'; if ( tinyMCE.activeEditor.isHidden() ) - content = document.getElementById(el).value; + content = this.I(el).value; else content = this.pre_wpautop(content); @@ -84,11 +91,11 @@ switchEditors = { go : function(id) { var ed = tinyMCE.get(id); - var qt = document.getElementById('quicktags'); - var H = document.getElementById('edButtonHTML'); - var P = document.getElementById('edButtonPreview'); - var ta = document.getElementById(id); - var ec = document.getElementById('editorcontainer'); + var qt = this.I('quicktags'); + var H = this.I('edButtonHTML'); + var P = this.I('edButtonPreview'); + var ta = this.I(id); + var ec = (ta.parentNode && ta.parentNode.nodeName == 'DIV') ? ta.parentNode : ''; if ( ! ed || ed.isHidden() ) { ta.style.color = '#fff'; @@ -97,15 +104,16 @@ switchEditors = { edCloseAllTags(); // :-( qt.style.display = 'none'; - ec.style.padding = '0px'; ta.style.padding = '0px'; + if ( ec ) + ec.style.padding = '0px'; ta.value = this.wpautop(ta.value); if ( ed ) ed.show(); else tinyMCE.execCommand("mceAddControl", false, id); - this.wpSetDefaultEditor('tinymce'); + setUserSetting( 'editor', 'tinymce' ); } else { this.edToggle(H, P); ta.style.height = ed.getContentAreaContainer().offsetHeight + 6 + 'px'; @@ -115,15 +123,17 @@ switchEditors = { if ( tinymce.isIE6 ) { ta.style.width = '98%'; - ec.style.padding = '0px'; + if ( ec ) + ec.style.padding = '0px'; ta.style.padding = '6px'; } else { ta.style.width = '100%'; - ec.style.padding = '6px'; + if ( ec ) + ec.style.padding = '6px'; } ta.style.color = ''; - this.wpSetDefaultEditor('html'); + setUserSetting( 'editor', 'html' ); } }, @@ -135,19 +145,6 @@ switchEditors = { A.onclick = null; }, - wpSetDefaultEditor : function(editor) { - try { - editor = escape( editor.toString() ); - } catch(err) { - editor = 'tinymce'; - } - - var userID = document.getElementById('user-id'); - var date = new Date(); - date.setTime(date.getTime()+(10*365*24*60*60*1000)); - document.cookie = "wordpress_editor_" + userID.value + "=" + editor + "; expires=" + date.toGMTString(); - }, - wpautop : function(pee) { var blocklist = 'table|thead|tfoot|caption|colgroup|tbody|tr|td|th|div|dl|dd|dt|ul|ol|li|pre|select|form|blockquote|address|math|p|h[1-6]'; diff --git a/wp-admin/js/user-settings.js b/wp-admin/js/user-settings.js new file mode 100644 index 0000000000..7e44c7291a --- /dev/null +++ b/wp-admin/js/user-settings.js @@ -0,0 +1,129 @@ + +wpCookies = { +// The following functions are from Cookie.js class in TinyMCE, Moxiecode, used under LGPL. + + each : function(o, cb, s) { + var n, l; + + if (!o) + return 0; + + s = s || o; + + if (typeof(o.length) != 'undefined') { + for (n=0, l = o.length; n diff --git a/wp-includes/functions.php b/wp-includes/functions.php index 7a2cef988e..76bcaf93f3 100644 --- a/wp-includes/functions.php +++ b/wp-includes/functions.php @@ -643,6 +643,134 @@ function delete_option( $name ) { return true; } +/** + * Saves and restores user interface settings stored in a cookie. + * + * @package WordPress + * @subpackage Option + * @since 2.7.0 + * + * Checks if the current user-settings cookie is updated and stores it. + * When no cookie exists (different browser used), adds the last saved cookie restoring the settings. + */ +function wp_user_settings() { + + if ( ! is_admin() ) + return; + + if ( ! $user = wp_get_current_user() ) + return; + + $settings = get_user_option( 'user-settings', $user->ID ); + + if ( isset($_COOKIE['wp-settings-'.$user->ID]) ) { + $cookie = preg_replace( '/[^A-Za-z0-9=&_]/', '', $_COOKIE['wp-settings-'.$user->ID] ); + + if ( ! empty($cookie) && strpos($cookie, '=') ) { + if ( $cookie == $settings ) + return; + + $last_time = (int) get_user_option( 'user-settings-time', $user->ID ); + $saved = isset($_COOKIE['wp-settings-time-'.$user->ID]) ? preg_replace( '/[^0-9]/', '', $_COOKIE['wp-settings-time-'.$user->ID] ) : 0; + + if ( $saved > $last_time ) { + update_user_option( $user->ID, 'user-settings', $cookie ); + update_user_option( $user->ID, 'user-settings-time', time() - 5 ); + return; + } + } + } + + setcookie('wp-settings-'.$user->ID, $settings, time() + 31536000, SITECOOKIEPATH); + setcookie('wp-settings-time-'.$user->ID, time(), time() + 31536000, SITECOOKIEPATH); +} + +/** + * Retrieve user interface setting value based on setting name. + * + * @package WordPress + * @subpackage Option + * @since 2.7.0 + * + * @param string $name The name of the setting. + * @param string $default Optional default value to return when $name is not set. + * @return mixed the last saved user setting or the default value/false if it doesn't exist. + */ +function get_user_setting( $name, $default = false ) { + + $arr = get_all_user_settings(); + + return isset($arr[$name]) ? $arr[$name] : $default; +} + +/** + * Delete user interface settings. + * + * @package WordPress + * @subpackage Option + * @since 2.7.0 + * + * Deleting settings would reset them to the defaults. + * + * @param mixed $names The name or array of names of the setting to be deleted. + */ +function delete_user_setting( $names ) { + global $current_user; + + $arr = get_all_user_settings(); + $names = (array) $names; + + foreach ( $names as $name ) { + if ( isset($arr[$name]) ) { + unset($arr[$name]); + $settings = ''; + } + } + + if ( isset($settings) ) { + foreach ( $arr as $k => $v ) + $settings .= $k . '=' . $v . '&'; + + $settings = rtrim($settings, '&'); + + update_user_option( $current_user->ID, 'user-settings', $settings ); + setcookie('wp-settings-'.$current_user->ID, $settings, time() + 31536000, SITECOOKIEPATH); + } +} + +/** + * Retrieve all user interface settings. + * + * @package WordPress + * @subpackage Option + * @since 2.7.0 + * + * @return array the last saved user settings or empty array. + */ +function get_all_user_settings() { + if ( ! $user = wp_get_current_user() ) + return array(); + + if ( isset($_COOKIE['wp-settings-'.$user->ID]) ) { + $cookie = preg_replace( '/[^A-Za-z0-9=&_]/', '', $_COOKIE['wp-settings-'.$user->ID] ); + + if ( $cookie && strpos($cookie, '=') ) { // the '=' cannot be 1st char + parse_str($cookie, $arr); + return $arr; + } + } + + return array(); +} + +function delete_all_user_settings() { + if ( ! $user = wp_get_current_user() ) + return; + + delete_usermeta( $user->ID, 'user-settings' ); + setcookie('wp-settings-'.$user->ID, ' ', time() - 31536000, SITECOOKIEPATH); +} + /** * Serialize data, if needed. * diff --git a/wp-includes/general-template.php b/wp-includes/general-template.php index a17ed501fa..c05aed6ef4 100644 --- a/wp-includes/general-template.php +++ b/wp-includes/general-template.php @@ -942,8 +942,8 @@ function user_can_richedit() { function wp_default_editor() { $r = user_can_richedit() ? 'tinymce' : 'html'; // defaults if ( $user = wp_get_current_user() ) { // look for cookie - if ( isset($_COOKIE['wordpress_editor_' . $user->ID]) && in_array($_COOKIE['wordpress_editor_' . $user->ID], array('tinymce', 'html', 'test') ) ) - $r = $_COOKIE['wordpress_editor_' . $user->ID]; + $ed = get_user_setting('editor', 'tinymce'); + $r = ( in_array($ed, array('tinymce', 'html', 'test') ) ) ? $ed : $r; } return apply_filters( 'wp_default_editor', $r ); // filter } diff --git a/wp-includes/js/tinymce/plugins/wordpress/editor_plugin.js b/wp-includes/js/tinymce/plugins/wordpress/editor_plugin.js index faff841500..5f77d64648 100644 --- a/wp-includes/js/tinymce/plugins/wordpress/editor_plugin.js +++ b/wp-includes/js/tinymce/plugins/wordpress/editor_plugin.js @@ -14,7 +14,7 @@ var moreHTML = ''; var nextpageHTML = ''; - if ( tinymce.util.Cookie.get('kitchenSink') == '1' ) + if ( getUserSetting('hidetb', '0') == '1' ) ed.settings.wordpress_adv_hidden = 0; // Hides the specified toolbar and resizes the iframe @@ -44,23 +44,20 @@ }); ed.addCommand('WP_Adv', function() { - var id = ed.controlManager.get(tbId).id, cm = ed.controlManager, cook = tinymce.util.Cookie, date; - - date = new Date(); - date.setTime(date.getTime()+(10*365*24*60*60*1000)); + var id = ed.controlManager.get(tbId).id, cm = ed.controlManager; if (DOM.isHidden(id)) { cm.setActive('wp_adv', 1); DOM.show(id); t._resizeIframe(ed, tbId, -28); ed.settings.wordpress_adv_hidden = 0; - cook.set('kitchenSink', '1', date); + setUserSetting('hidetb', '1'); } else { cm.setActive('wp_adv', 0); DOM.hide(id); t._resizeIframe(ed, tbId, 28); ed.settings.wordpress_adv_hidden = 1; - cook.set('kitchenSink', '0', date); + setUserSetting('hidetb', '0'); } }); @@ -94,11 +91,14 @@ title : 'wordpress.add_media', image : url + '/img/media.gif', onclick : function() { - tb_show('', tinymce.DOM.get('add_media').href); - tinymce.DOM.setStyle( ['TB_overlay','TB_window','TB_load'], 'z-index', '999999' ); + var a = tinymce.DOM.get('add-media-link'); + if ( a ) { + tb_show('', a.href); + tinymce.DOM.setStyle( ['TB_overlay','TB_window','TB_load'], 'z-index', '999999' ); + } } }); - +/* ed.addButton('add_image', { title : 'wordpress.add_image', image : url + '/img/image.gif', @@ -125,12 +125,12 @@ tinymce.DOM.setStyle( ['TB_overlay','TB_window','TB_load'], 'z-index', '999999' ); } }); - +*/ // Add Media buttons to fullscreen ed.onBeforeExecCommand.add(function(ed, cmd, ui, val) { if ( 'mceFullScreen' != cmd ) return; if ( 'mce_fullscreen' != ed.id ) - ed.settings.theme_advanced_buttons1 += ',|,add_image,add_video,add_audio,add_media'; + ed.settings.theme_advanced_buttons1 += ',|,add_media'; }); // Add class "alignleft", "alignright" and "aligncenter" when selecting align for images. diff --git a/wp-includes/js/tinymce/tiny_mce_config.php b/wp-includes/js/tinymce/tiny_mce_config.php index 7651ec0900..d3f1c17aab 100644 --- a/wp-includes/js/tinymce/tiny_mce_config.php +++ b/wp-includes/js/tinymce/tiny_mce_config.php @@ -134,7 +134,7 @@ $no_captions = ( apply_filters( 'disable_captions', '' ) ) ? true : false; // TinyMCE init settings $initArray = array ( 'mode' => 'none', - 'onpageload' => 'wpEditorInit', + 'onpageload' => 'switchEditors.edInit', 'width' => '100%', 'theme' => 'advanced', 'skin' => 'wp_theme', @@ -214,7 +214,7 @@ if ( $compress && isset($_SERVER['HTTP_ACCEPT_ENCODING']) ) { // Setup cache info if ( $disk_cache ) { - $cacheKey = apply_filters('tiny_mce_version', '20080731'); + $cacheKey = apply_filters('tiny_mce_version', '20080830'); foreach ( $initArray as $v ) $cacheKey .= $v; diff --git a/wp-includes/script-loader.php b/wp-includes/script-loader.php index cf7ad0100a..79a8605bc3 100644 --- a/wp-includes/script-loader.php +++ b/wp-includes/script-loader.php @@ -35,12 +35,16 @@ require( ABSPATH . WPINC . '/functions.wp-styles.php' ); * @param object $scripts WP_Scripts object. */ function wp_default_scripts( &$scripts ) { + global $current_user; + if (!$guessurl = site_url()) $guessurl = wp_guess_url(); + + $userid = isset($current_user) ? $current_user->ID : 0; $scripts->base_url = $guessurl; $scripts->default_version = get_bloginfo( 'version' ); - $scripts->add( 'common', '/wp-admin/js/common.js', array('jquery'), '20080318' ); + $scripts->add( 'common', '/wp-admin/js/common.js', array('jquery', 'user-settings'), '20080318' ); $scripts->add( 'sack', '/wp-includes/js/tw-sack.js', false, '1.6.1' ); $scripts->add( 'quicktags', '/wp-includes/js/quicktags.js', false, '20080823' ); @@ -65,7 +69,7 @@ function wp_default_scripts( &$scripts ) { $scripts->add( 'editor_functions', '/wp-admin/js/editor.js', false, '20080823' ); // Modify this version when tinyMCE plugins are changed. - $mce_version = apply_filters('tiny_mce_version', '20080730'); + $mce_version = apply_filters('tiny_mce_version', '20080830'); $scripts->add( 'tiny_mce', '/wp-includes/js/tinymce/tiny_mce_config.php', array('editor_functions'), $mce_version ); $scripts->add( 'prototype', '/wp-includes/js/prototype.js', false, '1.6'); @@ -242,6 +246,13 @@ function wp_default_scripts( &$scripts ) { ) ); $scripts->add( 'farbtastic', '/wp-admin/js/farbtastic.js', array('jquery'), '1.2' ); + + $scripts->add( 'user-settings', '/wp-admin/js/user-settings.js', array(), '20080829' ); + $scripts->localize( 'user-settings', 'userSettings', array( + 'url' => SITECOOKIEPATH, + 'uid' => $userid, + 'time' => time() + ) ); } } @@ -334,7 +345,6 @@ function wp_prototype_before_jquery( $js_array ) { * @since 2.5.0 */ function wp_just_in_time_script_localization() { - wp_localize_script( 'tiny_mce', 'wpTinyMCEConfig', array( 'defaultEditor' => wp_default_editor() ) ); wp_localize_script( 'autosave', 'autosaveL10n', array( 'autosaveInterval' => AUTOSAVE_INTERVAL, 'previewPageText' => __('Preview this Page'),