Zum Inhalt springen

Cache Problem bei Ext?

Erstellt am 30. Juni 2010 · 2 Antworten · letzte Antwort am 5. Juli 2010

Tags: Frage

tobyte ·

Hallo,

seit einigen Tagen befasse ich mich mit der Erstellung eigener Extensions. Ich habe nun eine Extension erstellt welche eine List + Single Ansicht hat. Irgendwie klappt der Übergang zwischen den beiden Ansichten allerdings nicht reibungslos.

Wenn ich in der Listen-Ansicht einen Datensatz auswähl, lädt der Browser und es wird auch eine neue Adresse in der Adresszeile angezeigt, aber die Seite bleibt unverändert. Wenn ich jetzt allerdings einfach nur Strg + F5 drücke wird korrekt die Single Ansicht geladen, ohne das ich auf einen Link klicken musste.

Mein erster Gedanke war, dass es irgendwie mit dem Caching zusammenhängt, daher hab ich eine TS-Template auf der Seite mit meiner Ext Erstellt, mit dem Inhalt:
config.no_cache = 1
page.config.no_cache = 1

Das Problem bleibt allerdings unverändert.

tobyte ·

evtl hab ich ja auch mit meinen weniger als rudimentären php kentnissen direkt in der php datei einen fehler eingebaut? Evtl. kann ja jemand der ein wenig bewanderter ist einmal den Code überfliegen?

<?php
require_once(PATH_tslib.'class.tslib_pibase.php');


class tx_tobyte_pi1 extends tslib_pibase {
	var $prefixId      = 'tx_to_byte_pi1';		// Same as class name
	var $scriptRelPath = 'pi1/class.tx_tobyte_pi1.php';	// Path to this script relative to the extension dir.
	var $extKey        = 'to_byte';	// The extension key.
	var $pi_checkCHash = true;
	var $template;
  var $id;
	
	/**
     * The main method of the PlugIn
     *
     * @param    string        $content: The PlugIn content
     * @param    array        $conf: The PlugIn configuration
     * @return    The content that is displayed on the website
     */
    function main($content,$conf)    {
        $this->conf=$conf;
        $this->pi_setPiVarDefaults();
        $this->pi_loadLL();
        
        #ein paar Vorbelegungen
        $this->id=$GLOBALS['TSFE']->id;
        $this->template=$this->cObj->fileResource('EXT:to_byte/template.html');
        
        #welche Ansicht?
        if($this->piVars['item']) {
            $content = $this->detailView();
        } else {
            $content = $this->listView();
        }
    
        return $this->pi_wrapInBaseClass($content);
    }
    
    function listView() {
				$pidlist =$this->cObj->data[pages];

        $subpart=$this->cObj->getSubpart($this->template,'###LISTVIEW###'); 
        $singlerow=$this->cObj->getSubpart($subpart,'###ROW###'); 
        				
        #Datensätze holen
        $res=$GLOBALS['TYPO3_DB']->exec_SELECTquery(
        '*',   #select
        'tx_tobyte_kurse', #from
        'hidden=0 and deleted=0 and pid='.$pidlist,  #where
        $groupBy='',
        $orderBy='',
        $limit='');
				################
        
        if($res) {
            $liste='';
            while($row=$GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
                $markerArray['###LINK###']=$this->pi_linkTP($row['titel'],array($this->prefixId.'[item]'=> $row['uid']));
                $liste .= $this->cObj->substituteMarkerArrayCached($singlerow,$markerArray); 
            }
            $subpartArray['###ROW###']=$liste;
        } else {
            return $this->pi_getLL('nodata');
        }
        
        
        return $this->cObj->substituteMarkerArrayCached($subpart,$markerArray,$subpartArray,array());     
    }
    
    function detailView() {
       
			 #Datensatz holen
			 $record=$this->pi_getRecord('tx_tobyte_kurse',$this->piVars['item']);

			 #Template-Auswahl
			  if($record['onlineanmeldung'] == "1") {
					$subpart=$this->cObj->getSubpart($this->template,'###DETAILVIEWLINK###'); 
				}	elseif ($record['onlineanmeldung'] == "0") {
					$subpart=$this->cObj->getSubpart($this->template,'###DETAILVIEWNOLINK###'); 
				}

        #Marker füllen
        $markerArray['###TITEL###']=$record['titel'];
				$markerArray['###KURSNUMMER###']=$record['kursnummer'];
				$markerArray['###KATEGORIE###']=$record['kategorie'];
				$markerArray['###DOZENT###']=$record['dozent'];
				$markerArray['###TERMIN###']=$record['termin'];
				$markerArray['###ORT###']=$record['ort'];
				$markerArray['###PREIS###']=$record['preis'];
				$markerArray['###BESCHREIBUNG###']=$record['beschreibung'];
				$markerArray['###BILDUNGSURLAUB###']=$record['bildungsurlaub'];
				$markerArray['###ONLINEANMELDUNG###']=$record['onlineanmeldung'];

				/**/
        
        #backlink als einfachen Link ohne Parameter
        $markerArray['###BACKLINK###']=$this->pi_linkToPage($this->pi_getLL('back'),$this->id);
        
        return $this->cObj->substituteMarkerArrayCached($subpart,$markerArray,array(),array());     
    } 
}  

if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/to_byte/pi1/class.tx_tobyte_pi1.php'])	{
	include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/to_byte/pi1/class.tx_tobyte_pi1.php']);
}
?>
GoSnA ·

Also was mir aufgefallen ist:

$markerArray['###LINK###']=$this->pi_linkTP($row['titel'],array($this->prefixId.'[item]'=> $row['uid']));
$markerArray['###BACKLINK###']=$this->pi_linkToPage($this->pi_getLL('back'),$this->id);

Der Aufbau von pi_linkTP ist wie folgt Dokumentiert:

tslib_pibase.pi_linkTP ($ str,
		$urlParameters = array(),
		$cache = 0,
		$altPageId = 0	 
	)

hier linkToPage

tslib_pibase.pi_linkToPage ($str,
		$id,
		$target = '',
		$urlParameters = array()	 
	)

Ich würde also den Backlink ebenfalls mit pi_linkTP benutzen, allerdings würde ich in beiden Varianten den cache flag setzen.

bei dem hier würde ich vielleicht noch auf ein integer überprüfen lassen:

if($this->piVars['item']) {
            $content = $this->detailView();
        } else {
            $content = $this->listView();
        }