Index: NEWS.txt =================================================================== --- NEWS.txt (Revision 7660) +++ NEWS.txt (Arbeitskopie) @@ -45,7 +45,10 @@ * The t3editor code completion DB was updated to reflect the latest additions. Also the syntax highlighting engine was now extracted from the system extension so it can be used in other places of the TYPO3 Core as well. + * A donate notice will be shown to admins in the TYPO3 backend after using it for more than three months. + This behaviour can be disabled completely - see $TYPO3_CONF_VARS[BE][allowDonateWindow]. + Frontend ======== Index: t3lib/config_default.php =================================================================== --- t3lib/config_default.php (Revision 7660) +++ t3lib/config_default.php (Arbeitskopie) @@ -260,6 +260,7 @@ 'elementVersioningOnly' => FALSE, // If true, only element versioning is allowed in the backend. This is recommended for new installations of TYPO3 4.2+ since "page" and "branch" versioning types are known for the drawbacks of loosing ids and "element" type versions supports moving now. 'versionNumberInFilename' => FALSE, // Boolean. If true, included CSS and JS files will have the timestamp embedded in the filename, ie. filename.1269312081.js. This will make browsers and proxies reload the files if they change (thus avoiding caching issues). IMPORTANT: this feature requires this .htaccess rule to work: RewriteCond %{REQUEST_FILENAME} !-f - RewriteCond %{REQUEST_FILENAME} !-d - RewriteRule ^(.+)\.(\d+)\.(php|js|css|png|jpg|gif|gzip)$ $1.$3 [L]. If false the filemtime will be appended as a query-string. 'spriteIconGenerator_handler' => '', // String: Used to register own/other spriteGenerating Handler, they have to implement the interface t3lib_spriteManager_spriteIconGenerator + 'allowDonateWindow' => TRUE, // Boolean. Defines whether to display a TYPO3 donate window to admin users that have been working with the system for more than three months. 'AJAX' => array( // array of key-value pairs for a unified use of AJAX calls in the TYPO3 backend. Keys are the unique ajaxIDs where the value will be resolved to call a method in an object. See ajax.php and the classes/class.typo3ajax.php for more information. 'SC_alt_db_navframe::expandCollapse' => 'typo3/alt_db_navframe.php:SC_alt_db_navframe->ajaxExpandCollapse', 'SC_alt_file_navframe::expandCollapse' => 'typo3/alt_file_navframe.php:SC_alt_file_navframe->ajaxExpandCollapse', @@ -282,6 +283,8 @@ 'BackendLogin::refreshLogin' => 'typo3/classes/class.ajaxlogin.php:AjaxLogin->refreshLogin', 'BackendLogin::isTimedOut' => 'typo3/classes/class.ajaxlogin.php:AjaxLogin->isTimedOut', 'BackendLogin::getChallenge' => 'typo3/classes/class.ajaxlogin.php:AjaxLogin->getChallenge', + 'DonateWindow::disable' => 'typo3/classes/class.donatewindow.php:DonateWindow->disable', + 'DonateWindow::postpone' => 'typo3/classes/class.donatewindow.php:DonateWindow->postpone', 'WorkspaceMenu::toggleWorkspacePreview' => 'typo3/classes/class.workspaceselector.php:WorkspaceSelector->toggleWorkspacePreview', 'WorkspaceMenu::setWorkspace' => 'typo3/classes/class.workspaceselector.php:WorkspaceSelector->setWorkspace', 'ExtDirect::getAPI' => 't3lib/extjs/class.t3lib_extjs_extdirectapi.php:t3lib_extjs_ExtDirectApi->getAPI', Index: t3lib/class.t3lib_beuserauth.php =================================================================== --- t3lib/class.t3lib_beuserauth.php (Revision 7660) +++ t3lib/class.t3lib_beuserauth.php (Arbeitskopie) @@ -281,6 +281,11 @@ $this->uc['lang']=$this->user['lang']; $U=1; } + // Setting the time of the first login: + if (!isset($this->uc['firstLoginTimeStamp'])) { + $this->uc['firstLoginTimeStamp'] = $GLOBALS['EXEC_TIME']; + $U = TRUE; + } // Saving if updated. if ($U) { Index: typo3/js/donate.js =================================================================== --- typo3/js/donate.js (Revision 0) +++ typo3/js/donate.js (Revision 0) @@ -0,0 +1,162 @@ +/*************************************************************** +* Copyright notice +* +* (c) 2010 Oliver Hader +* All rights reserved +* +* This script is part of the TYPO3 project. The TYPO3 project is +* free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2 of the License, or +* (at your option) any later version. +* +* The GNU General Public License can be found at +* http://www.gnu.org/copyleft/gpl.html. +* A copy is found in the textfile GPL.txt and important notices to the license +* from the author is found in LICENSE.txt distributed with these scripts. +* +* +* This script is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* This copyright notice MUST APPEAR in all copies of the script! +***************************************************************/ + +/** + * Donate window appearing in the backend + */ +Ext.namespace('Ext.ux.TYPO3'); + +Ext.ux.TYPO3.donate = Ext.extend(Ext.util.Observable, { + isUnloading: false, + logoutButton: null, + ajaxRequestDefault: null, + donateUrl: 'http://typo3.org/donate/', + + constructor: function(config) { + this.ajaxRequestDefault = { + url: TYPO3.configuration.PATH_typo3 + 'ajax.php', + success: function() {}, + failure: function() {} + }; + + config = config || {}; + Ext.apply(this, config); + + this.initComponents(); + this.execute.defer(3000, this); + this.logoutButton = Ext.DomQuery.selectNode('#logout-button input'); + + Ext.ux.TYPO3.donate.superclass.constructor.call(this, config); + }, + + execute: function() { + this.donateWindow.show(); + }, + + initComponents: function() { + this.donateWindow = new Ext.Window({ + width: 450, + autoHeight: true, + closable: false, + resizable: false, + plain: true, + border: false, + modal: true, + draggable: false, + closeAction: 'hide', + id: 'donateWindow', + cls: 't3-window', + title: TYPO3.LLL.core.donateWindow_title, + html: TYPO3.LLL.core.donateWindow_message, + buttons: [{ + scope: this, + icon: this.getDonateIcon(), + text: TYPO3.LLL.core.donateWindow_button_donate, + handler: this.donateAction + }, { + scope: this, + text: TYPO3.LLL.core.donateWindow_button_disable, + handler: this.disableAction + }, { + scope: this, + text: TYPO3.LLL.core.donateWindow_button_postpone, + handler: this.postponeAction + }] + }); + }, + + unloadEventHandler: function(event) { + event.stopEvent(); + this.isUnloading = true; + this.donateWindow.show(); + this.removeUnloadEventListener(); + }, + + donateAction: function() { + this.submitDisableAction(); + this.donateWindow.hide(); + window.open(this.donateUrl).focus(); + this.continueUnloading(); + }, + + disableAction: function() { + this.submitDisableAction(); + this.donateWindow.hide(); + this.continueUnloading(); + }, + + postponeAction: function() { + this.submitPostponeAction(); + this.donateWindow.hide(); + this.addUnloadEventListener(); + this.continueUnloading(); + }, + + submitDisableAction: function() { + Ext.Ajax.request(Ext.apply( + this.ajaxRequestDefault, { + params: { 'ajaxID': 'DonateWindow::disable' } + } + )); + }, + + submitPostponeAction: function() { + Ext.Ajax.request(Ext.apply( + this.ajaxRequestDefault, { + params: { 'ajaxID': 'DonateWindow::postpone' } + } + )); + }, + + getDonateIcon: function() { + return TYPO3.configuration.PATH_typo3 + 'sysext/t3skin/images/icons/status/dialog-ok.png'; + }, + + addUnloadEventListener: function() { + if (!this.isUnloading) { + Ext.EventManager.addListener(this.logoutButton, 'click', this.unloadEventHandler, this); + } + }, + + removeUnloadEventListener: function() { + Ext.EventManager.removeListener(this.logoutButton, 'click', this.unloadEventHandler, this); + }, + + continueUnloading: function() { + if (this.isUnloading && this.logoutButton) { + this.logoutButton.click(); + } + } +}); + + + +/** + * Initialize the donate widget + */ +Ext.onReady(function() { + TYPO3.donate = new Ext.ux.TYPO3.donate(); +}); Index: typo3/classes/class.donatewindow.php =================================================================== --- typo3/classes/class.donatewindow.php (Revision 0) +++ typo3/classes/class.donatewindow.php (Revision 0) @@ -0,0 +1,122 @@ + +* All rights reserved +* +* This script is part of the TYPO3 project. The TYPO3 project is +* free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2 of the License, or +* (at your option) any later version. +* +* The GNU General Public License can be found at +* http://www.gnu.org/copyleft/gpl.html. +* A copy is found in the textfile GPL.txt and important notices to the license +* from the author is found in LICENSE.txt distributed with these scripts. +* +* +* This script is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* This copyright notice MUST APPEAR in all copies of the script! +***************************************************************/ +/** + * AJAX handler for the donate window shown in the TYPO3 backend. + * + * @author Oliver Hader + */ +class DonateWindow implements t3lib_Singleton { + const FLAG_DonateWindowDisabled = 'DonateWindowDisabled'; + const FLAG_DonateWindowPostponed = 'DonateWindowPostponed'; + const VALUE_DonateWindowAppearsAfterDays = 90; + const VALUE_DonateWindowPostponeDays = 14; + + /** + * @var t3lib_beUserAuth + */ + protected $backendUser; + + /** + * Constructs this object. + */ + public function __construct() { + $this->setBackendUser($GLOBALS['BE_USER']); + } + + /** + * Sets the backend user. + * + * @param t3lib_beUserAuth $backendUser + * @return void + */ + public function setBackendUser(t3lib_beUserAuth $backendUser) { + $this->backendUser = $backendUser; + } + + /** + * Disables the donate window - thus it won't be shown again for this user. + * + * @param array $parameters: Parameters (not used) + * @param TYPO3AJAX $ajaxObj: The calling parent AJAX object + * @return void + */ + public function disable(array $parameters, TYPO3AJAX $ajaxObj) { + $this->backendUser->uc[self::FLAG_DonateWindowDisabled] = TYPO3_version; + $this->backendUser->writeUC(); + } + + /** + * Postpones the donate window - thus it will be shown again at a later time. + * + * @param array $parameters: Parameters (not used) + * @param TYPO3AJAX $ajaxObj: The calling parent AJAX object + * @return void + */ + public function postpone(array $parameters, TYPO3AJAX $ajaxObj) { + $this->backendUser->uc[self::FLAG_DonateWindowPostponed] = $GLOBALS['EXEC_TIME']; + $this->backendUser->writeUC(); + } + + + /** + * Determines whether the donate window is allowed to be displayed. + * + * @return boolean Whether the donate window is allowed to be displayed. + */ + public function isDonateWindowAllowed() { + $uc = $this->backendUser->uc; + $isAdmin = $this->backendUser->isAdmin(); + $firstLogin = $this->getFirstLoginTimeStamp(); + $isTriggered = ($firstLogin && $GLOBALS['EXEC_TIME'] - $firstLogin > self::VALUE_DonateWindowAppearsAfterDays * 86400); + $isAllowed = (bool) $GLOBALS['TYPO3_CONF_VARS']['BE']['allowDonateWindow']; + $isCancelled = (isset($uc[self::FLAG_DonateWindowDisabled]) && !empty($uc[self::FLAG_DonateWindowDisabled])); + $isPostponed = (isset($uc[self::FLAG_DonateWindowPostponed]) && $uc[self::FLAG_DonateWindowPostponed] > $GLOBALS['EXEC_TIME'] - self::VALUE_DonateWindowPostponeDays * 86400); + + return ($isAdmin && $isAllowed && !$isCancelled && !$isPostponed); + } + + /** + * Gets the timestamp of the first login of the current backend user. + * + * @return integer Timestamp of the first login + */ + public function getFirstLoginTimeStamp() { + $firstLogin = NULL; + + if (isset($this->backendUser->uc['firstLoginTimeStamp'])) { + $firstLogin = $this->backendUser->uc['firstLoginTimeStamp']; + } + + return $firstLogin; + } +} + +if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['typo3/classes/class.donatewindow.php']) { + include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['typo3/classes/class.donatewindow.php']); +} + +?> \ No newline at end of file Index: typo3/backend.php =================================================================== --- typo3/backend.php (Revision 7660) +++ typo3/backend.php (Arbeitskopie) @@ -31,6 +31,7 @@ require('classes/class.typo3logo.php'); require('classes/class.modulemenu.php'); +require_once('classes/class.donatewindow.php'); // core toolbar items require('classes/class.workspaceselector.php'); @@ -78,7 +79,7 @@ /** * Pagerenderer * - * @var $pageRenderer t3lib_PageRenderer + * @var t3lib_PageRenderer */ protected $pageRenderer; @@ -185,6 +186,10 @@ */ public function render() { + if (t3lib_div::makeInstance('DonateWindow')->isDonateWindowAllowed()) { + $this->pageRenderer->addJsFile('js/donate.js'); + } + // prepare the scaffolding, at this point extension may still add javascript and css $logo = t3lib_div::makeInstance('TYPO3Logo'); $logo->setLogo('gfx/typo3logo_mini.png'); @@ -393,6 +398,11 @@ 'tabs_closeAll' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:tabs.closeAll'), 'tabs_closeOther' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:tabs.closeOther'), 'tabs_close' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:tabs.close'), + 'donateWindow_title' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:donateWindow.title'), + 'donateWindow_message' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:donateWindow.message'), + 'donateWindow_button_donate' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:donateWindow.button_donate'), + 'donateWindow_button_disable' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:donateWindow.button_disable'), + 'donateWindow_button_postpone' => $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xml:donateWindow.button_postpone'), ); $t3LLLfileUpload = array( 'windowTitle' => $GLOBALS['LANG']->getLL('fileUpload_windowTitle'), Index: typo3/sysext/t3skin/extjs/xtheme-t3skin.css =================================================================== --- typo3/sysext/t3skin/extjs/xtheme-t3skin.css (Revision 7660) +++ typo3/sysext/t3skin/extjs/xtheme-t3skin.css (Arbeitskopie) @@ -2205,7 +2205,8 @@ #loginRefreshWindow .x-panel-body.x-panel-body-noheader.x-panel-body-noborder, #loginRefreshWindow .x-panel-header.x-unselectable, -#loginformWindow .x-panel-header.x-unselectable { +#loginformWindow .x-panel-header.x-unselectable, +.t3-window .x-panel-body.x-panel-body-noheader.x-panel-body-noborder { background-image: none; background-color: transparent; color: #000; @@ -2228,3 +2229,17 @@ #loginformWindow .x-window-ml { background-color: #E4E4E4; } + +.t3-window .x-window-body.x-window-body-noborder { + padding: 10px; +} + +.t3-window .x-btn button { + padding-left: 3px; + padding-right: 3px; +} + +#donateWindow.t3-window .x-window-body.x-window-body-noborder { + padding-left: 100px; + background: url(../images/general/donate_teaser.png) no-repeat 25px 10px !important; +} Index: typo3/sysext/t3skin/images/general/donate_teaser.png =================================================================== Kann nicht anzeigen: Dateityp ist als binär angegeben. svn:mime-type = application/octet-stream Eigenschaftsänderungen: typo3/sysext/t3skin/images/general/donate_teaser.png ___________________________________________________________________ Hinzugefügt: svn:mime-type + application/octet-stream Index: typo3/sysext/lang/locallang_core.xml =================================================================== --- typo3/sysext/lang/locallang_core.xml (Revision 7660) +++ typo3/sysext/lang/locallang_core.xml (Arbeitskopie) @@ -266,6 +266,11 @@ + + + + +