* Added API in tslib_pibase for checking availability of the cHash value when plugins...
authorKasper Skårhøj <kasper@typo3.org>
Thu, 28 Apr 2005 21:25:36 +0000 (21:25 +0000)
committerKasper Skårhøj <kasper@typo3.org>
Thu, 28 Apr 2005 21:25:36 +0000 (21:25 +0000)
git-svn-id: https://svn.typo3.org/TYPO3v4/Core/trunk@692 709f56b5-9817-0410-a4d7-c38de5d9e867

ChangeLog
t3lib/class.t3lib_install.php
typo3/sysext/cms/tslib/class.tslib_fe.php
typo3/sysext/cms/tslib/class.tslib_pibase.php
typo3/sysext/indexed_search/modfunc2/locallang.xml

index 51a486a..a76588f 100755 (executable)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2005-04-28  Kasper Skårhøj,,,  <kasper@typo3.com>
+
+       * Added API in tslib_pibase for checking availability of the cHash value when plugins are running as USER cObjects. This is a VERY IMPORTANT thing for plugin writers to acquaint themselves with. I suggest reading the article "The Mysteries of &cHash" which was written about this tricky issue.
+
 2005-04-28  Rupert Germann  <rupi@gmx.li>
 
        * fix for bug 416: now the wrong default values in autoincrement lines will be removed from .sql files before they are written to the database.
index 8ff0060..9742e22 100755 (executable)
@@ -180,8 +180,8 @@ class t3lib_install {
         * @return      mixed           If $inlines is not an array it will return an array with the lines from localconf.php. Otherwise it will return a status string, either "continue" (updated) or "nochange" (not updated)
         * @see setValueInLocalconfFile()
         */
-       function writeToLocalconf_control($inlines='',$AbsFullPath='')  {
-               $writeToLocalconf_dat['file'] = $fileFullPath?$fileFullPath:PATH_typo3conf.'localconf.php';
+       function writeToLocalconf_control($inlines='',$absFullPath='')  {
+               $writeToLocalconf_dat['file'] = $absFullPath ? $absFullPath : PATH_typo3conf.'localconf.php';
 
                        // Checking write state of localconf.php:
                if (!$this->allowUpdateLocalConf)       {
index a8f272f..228ff50 100755 (executable)
        }
 
        /**
-        * Analyzes the second part of a id-string (after the "+"), looking for B6 or M5 encoding and if found it will resolve it and restore the variables in global $_GET (but NOT $_GET - yet)
+        * Analyzes the second part of a id-string (after the "+"), looking for B6 or M5 encoding and if found it will resolve it and restore the variables in global $_GET
         * If values for ->cHash, ->no_cache, ->jumpurl and ->MP is found, they are also loaded into the internal vars of this class.
         *
         * @param       string          String to analyze
         * Calculates a hash string based on additional parameters in the url. This is used to cache pages with more parameters than just id and type
         *
         * @return      void
+        * @see reqCHash()
         */
        function makeCacheHash()        {
                $GET = t3lib_div::_GET();
        }
 
        /**
+        * Will disable caching if the cHash value was not set.
+        * This function should be called to check the _existence_ of "&cHash" whenever a plugin generating cachable output is using extra GET variables. If there _is_ a cHash value the validation of it automatically takes place in makeCacheHash() (see above)
+        *
+        * @return void
+        * @see makeCacheHash(), tslib_pibase::pi_cHashCheck()
+        */
+       function reqCHash()     {
+               if (!$this->cHash)      {
+                       $this->set_no_cache();
+                       $GLOBALS['TT']->setTSlogMessage('TSFE->reqCHash(): No &cHash parameter was sent for GET vars though required so caching is disabled ',2);
+               }
+       }
+
+       /**
         * Splits the input query-parameters into an array with certain parameters filtered out.
         * Used to create the cHash value
         *
index b5ae862..6f3203c 100755 (executable)
@@ -167,7 +167,8 @@ class tslib_pibase {
        var $pi_autoCacheFields=array();
        var $pi_autoCacheEn=0;
 
-       var $pi_USER_INT_obj = 0;       // If set, then links are 1) not using cHash and 2) allowing pages to be cached.
+       var $pi_USER_INT_obj = FALSE;   // If set, then links are 1) not using cHash and 2) allowing pages to be cached. (Set this for all USER_INT plugins!)
+       var $pi_checkCHash = FALSE;             // If set, then caching is disabled if piVars are incoming while no cHash was set (Set this for all USER plugins!)
 
        /**
         * Should normally be set in the main function with the TypoScript content passed to the method.
@@ -211,8 +212,17 @@ class tslib_pibase {
         * @return      void
         */
        function tslib_pibase() {
+
+                       // Setting piVars:
                if ($this->prefixId)    {
                        $this->piVars = t3lib_div::GParrayMerged($this->prefixId);
+
+                               // cHash mode check
+                               // IMPORTANT FOR CACHED PLUGINS (USER cObject): As soon as you generate cached plugin output which depends on parameters (eg. seeing the details of a news item) you MUST check if a cHash value is set.
+                               // Background: The function call will check if a cHash parameter was sent with the URL because only if it was the page may be cached. If no cHash was found the function will simply disable caching to avoid unpredictable caching behaviour. In any case your plugin can generate the expected output and the only risk is that the content may not be cached. A missing cHash value is considered a mistake in the URL resulting from either URL manipulation, "realurl" "grayzones" etc. The problem is rare (more frequent with "realurl") but when it occurs it is very puzzling!
+                       if ($this->pi_checkCHash && count($this->piVars))       {
+                               $GLOBALS['TSFE']->reqCHash();
+                       }
                }
                if ($GLOBALS['TSFE']->config['config']['language'])     {
                        $this->LLkey = $GLOBALS['TSFE']->config['config']['language'];
@@ -245,8 +255,6 @@ class tslib_pibase {
 
 
 
-
-
        /***************************
         *
         * Link functions
@@ -414,7 +422,6 @@ class tslib_pibase {
 
 
 
-
        /***************************
         *
         * Functions for listing, browsing, searching etc.
@@ -464,7 +471,7 @@ class tslib_pibase {
                $results_at_a_time = t3lib_div::intInRange($this->internal['results_at_a_time'],1,1000);
                $totalPages = ceil($count/$results_at_a_time);
                $maxPages = t3lib_div::intInRange($this->internal['maxPages'],1,100);
-               $pi_isOnlyFields = $this->pi_isOnlyFields($this->pi_isOnlyFields); 
+               $pi_isOnlyFields = $this->pi_isOnlyFields($this->pi_isOnlyFields);
 
                        // $showResultCount determines how the results of the pagerowser will be shown.
                        // If set to 0: only the result-browser will be shown
@@ -482,7 +489,7 @@ class tslib_pibase {
                        if (strtoupper($this->internal['pagefloat']) == 'CENTER') {
                                $pagefloat = ceil(($maxPages - 1)/2);
                        } else {
-                               // pagefloat set as integer. 0 = left, value >= $this->internal['maxPages'] = right 
+                               // pagefloat set as integer. 0 = left, value >= $this->internal['maxPages'] = right
                                $pagefloat = t3lib_div::intInRange($this->internal['pagefloat'],-1,$maxPages-1);
                        }
                } else {
@@ -505,7 +512,7 @@ class tslib_pibase {
 
                        // now overwrite all entries in $wrapper which are also in $wrapArr
                $wrapper = array_merge($wrapper,$wrapArr);
-               
+
                if ($showResultCount != 2) { //show pagebrowser
                        if ($pagefloat > -1) {
                                $lastPage = min($totalPages,max($pointer+1 + $pagefloat,$maxPages));
@@ -515,7 +522,7 @@ class tslib_pibase {
                                $lastPage = t3lib_div::intInRange($totalPages,1,$maxPages);
                        }
                        $links=array();
-       
+
                                // Make browse-table/links:
                        if ($showFirstLast) { // Link to first page
                                if ($pointer>0) {
@@ -573,7 +580,7 @@ class tslib_pibase {
                        if ($wrapper['showResultsNumbersWrap']) {
                                // this will render the resultcount in a more flexible way using markers (new in TYPO3 3.8.0).
                                // the formatting string is expected to hold template markers (see function header). Example: 'Displaying results ###FROM### to ###TO### out of ###OUT_OF###'
-                               
+
                                $markerArray['###FROM###'] = $this->cObj->wrap($this->internal['res_count'] > 0 ? $pR1 : 0,$wrapper['showResultsNumbersWrap']);
                                $markerArray['###TO###'] = $this->cObj->wrap(min($this->internal['res_count'],$pR2),$wrapper['showResultsNumbersWrap']);
                                $markerArray['###OUT_OF###'] = $this->cObj->wrap($this->internal['res_count'],$wrapper['showResultsNumbersWrap']);
index 11f396d..b6573ed 100644 (file)
@@ -4,7 +4,7 @@
                <description></description>
                <type>module</type>
                <csh_table></csh_table>
-               <fileId>EXT:dkd_isearch_stats/modfunc1/locallang.xml</fileId>
+               <fileId>EXT:indexed_search/modfunc2/locallang.xml</fileId>
                <labelContext type="array">
                        <label index="title"></label>
                        <label index="title2"></label>