Zum Inhalt springen

content mit eigener Extension rendern

Erstellt am 27. Februar 2008 · 4 Antworten · letzte Antwort am 13. September 2011

Tags: Frage

Mr.​TRTD ·

Ich habe mit dem Kickstarter ein Frontendplugin erstellt,
dass mir aus einem Storage Folder bestimmte Datensätze anzeigt.
Nun möchte ich anhand eines GET Parameters lediglich einen Datensatz auslesen und gerendert zwischen anderen tt_content Objekten anzeigen.

Ich habe also zusätzlich die Extension lumophpinclude installiert und dort eingebunden, wo ich den Inhalt anzeigen will.
Das Plugin holt sich also eine Datei aus fileadmin, die folgenden Inhalt hat:

//mein GET Parameter
if(isset($_GET['cid'])){
  $cid = $_GET['cid'];

// Abfrage an die Datenbank
  $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery('*','tx_ozauthors_table','cid='. $cid);
// Nur ein Treffer erwünscht
  if($GLOBALS['TYPO3_DB']->sql_num_rows($res) == 1){
// da sind meine Daten
    $data = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res);
  }
}

Und nun?

wie kann ich meine Daten nun anhand meiner Extension gerendert anzeigen ?

PS.: Freu mich schon darauf, wieder etwas dazu zu lernen ;-)

Desmond ·

ähmm.... was meinst du genau?

In Plugins wird Content mit return ausgeben.

In der Extension lumophpinclude reicht schon ein normales echo.

Mr.​TRTD ·

Nach langem Lesen und vielen Tutorials / Videos habe ich es nun selber geschafft, das Problem zu lösen.
Ich musste mein eigenes Plugin erweitern und dort die Abfrage auf meine cid einbauen.

Nun brauche ich nur an beliebiger Stelle mein Plugin aufzurufen und anhand des Get Parameters kann ich nun meinen Datensatz anzeigen.

Für alle interessierten hier meine Script:
vorher gem. Kickstarter:

	function main($content,$conf)	{
		switch((string)$conf['CMD'])	{
			case 'singleView':
				list($t) = explode(':',$this->cObj->currentRecord);
				$this->internal['currentTable']=$t;
				$this->internal['currentRow']=$this->cObj->data;
				return $this->pi_wrapInBaseClass($this->singleView($content,$conf));
			break;
			default:
				if (strstr($this->cObj->currentRecord,'tt_content'))	{
					$conf['pidList'] = $this->cObj->data['pages'];
					$conf['recursive'] = $this->cObj->data['recursive'];
				}
				return $this->pi_wrapInBaseClass($this->listView($content,$conf));
			break;
		}
	}

Nacher:

function main($content,$conf){
    $this->conf = $conf;
    $content="";
    $GLOBALS["TSFE"]->set_no_cache();
    if(t3lib_div::GPvar("cid")){
      $this->internal['currentRow'] = $this->getSingle(t3lib_div::GPvar("cid"));

      if (strstr($this->cObj->currentRecord,'tt_content'))	{
        $conf['pidList'] = $this->cObj->data['pages'];
  			$conf['recursive'] = $this->cObj->data['recursive'];
  		}
  		return $this->pi_wrapInBaseClass($this->singleView($content,$conf));

    } else {
  		switch((string)$conf['CMD'])	{
  			case 'singleView':
  				list($t) = explode(':',$this->cObj->currentRecord);
  				$this->internal['currentTable']=$t;
  				$this->internal['currentRow']=$this->cObj->data;
  				return $this->pi_wrapInBaseClass($this->singleView($content,$conf));
  			break;
  			default:
  				if (strstr($this->cObj->currentRecord,'tt_content'))	{
  					$conf['pidList'] = $this->cObj->data['pages'];
  					$conf['recursive'] = $this->cObj->data['recursive'];
  				}
  				return $this->pi_wrapInBaseClass($this->listView($content,$conf));
  			break;
  		}
    }
    #t3lib_div::debug($conf);
    return $content;
  }

  /**
   * function.
   */
  function getSingle($cid){
    $query = "SELECT * FROM tx_ozauthors_table WHERE cid = ".$cid." ORDER BY sorting";

    $res = mysql(TYPO3_db,$query);
    $row = array();
    $row = mysql_fetch_assoc($res);
    return $row;

  }

Der Rest ist überwiegend identisch mit dem Source des Kickstarters.

Also doch wieder etwas gelernt ;-)

lisardo ·

Ist ja schon ein Weilchen alt ... trotzdem, weil ich gerade drüberstolper: bitte nicht nachmachen, der Code enthält schwerwiegende Sicherheitslücken: der GET-Parameter cid wird völlig ungeprüft an eine SQL-Abfrage übergeben, womit einer SQL-Injection Tür und Tor geöffnet wird. Ein Angreifer kann mit wenig Mühe die TYPO3-Instanz komplett übernehmen. Das ist geradezu klassisch hier ...

Ansonsten: die IDs für Datensätze lauten in TYPO3 grundsätzlich uid und nicht cid. Übergeben wird für den Aufruf der Single-Darstellung dieser GET-Parameter: tx_myExt_pi1[uid]=xyz . Wenn man sich daran hält, funktioniert der Beispielcode des Kickstarters.

Ach ja: $GLOBALS["TSFE"]->set_no_cache(); schaltet den Cache für immer und für die gesamte TYPO3-Installation aus, das geht gar nicht.

Peter, TYPO3 @ lisardo (Augsburg)