Zum Inhalt springen

Funktion "fgetcsv" einbinden

Erstellt am 5. Juni 2007 · 3 Antworten · letzte Antwort am 6. Juni 2007

Tags: Frage

frankonly ·

Hallo zusammen,

ich habe folgendes Problem und hoffe jemand kann mir den entscheidenden Tipp geben.
Ich möchte das meine Extension neben einem Bild auch den Inhalt einer .csv Datei ausgibt.
Dafür gibt es ja die Funktion "fgetcsv":

$row = 1;
$handle = fopen("fileadmin/data.csv", "r");
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$num = count($data);
$row++;
for ($c=0; $c < $num; $c++) {
   echo $data[$c] . "<br />\n";
    }
}
fclose($handle);

Aber wie und wo soll ich die Funktion "fgetcsv" speichern? In einer neuen Klasse oder lieber in der gleichen? Wie könnte denn sowas ausschauen wenn ich die Funktion zum Bsp. hier für den Marker ###DATEI### einbauen will???

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

class user_rmmitarbeiter_pi1 extends tslib_pibase {
	var $prefixId = 'user_rmmitarbeiter_pi1';		// Same as class name
	var $scriptRelPath = 'pi1/class.user_rmmitarbeiter_pi1.php';	// Path to this script relative to the extension dir.
	var $extKey = 'user_rmmitarbeiter';	// The extension key.
	
	/**
	 * 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();
   $this->pi_USER_INT_obj=1;
   
   // Variablen setzen
   $content = "";
   $marker = array();
   $img_pfad = "uploads/tx_userrmmitarbeiter/";
   
   // Die Designvorlage laden
   $tmpl = $this->cObj->fileResource($conf["templateFile"]);
   // Einen Teilbereich der Designvorlage auslesen
   $tmpl = $this->cObj->getSubpart($tmpl, "###MITARBEITER###");
   // Einen weiteren Teilbereich aus dem Teilbereich auslesen
   $tmpl_eintrag = $this->cObj->getSubpart($tmpl, "###EINTRAG###");
   
   // Ggf. einen Parameter auslesen, ansonsten die aktuelle Seite verwenden
   $mitarbeiterPageId = $conf["mitarbeiterPageId"];
   if (!intval($mitarbeiterPageId)) $mitarbeiterPageId = $GLOBALS["TSFE"]->id;
   
   // Die Datenbankabfrage inkl. Unterstützung von Datenbankabstraktion
   $res =$GLOBALS["TYPO3_DB"]->exec_SELECTquery("*","user_rmmitarbeiter_main", "deleted = 0 AND hidden = 0 AND pid = '".$mitarbeiterPageId."'");
   while ($row = $GLOBALS["TYPO3_DB"]->sql_fetch_assoc($res)) {
      // Ein Array mit Platzhaltern als Schlüssel mit den Werten füllen
      $marker["###NAME###"] = $row["nachname"]." ".$row["vorname"];
      // Das Bild auslesen und verarbeiten
      $conf["bild."]["file."]["10."]["file"]= $img_pfad.$row["bild"];
      if ($this->cObj->fileResource($img_pfad.$row["bild"])) {
         $marker["###BILD###"] = $this->cObj->cObjGetSingle($conf["bild"], $conf["bild."]);
      } else {
         $marker["###BILD###"] = $this->cObj->cObjGetSingle($conf["bild_default"], $conf["bild_default."]);
      }
	  // Die Datei auslesen und verarbeiten
      $conf["bild."]["file."]["10."]["file"]= $img_pfad.$row["bild"];
      if ($this->cObj->fileResource($img_pfad.$row["bild"])) {
         $marker["###DATEI###"] = $this->cObj->cObjGetSingle($conf["bild"], $conf["bild."]);
      } else {
         $marker["###DATEI###"] = $this->cObj->cObjGetSingle($conf["bild_default"], $conf["bild_default."]);
      }
      // Den Teilbereich ###EINTRAG### und das Array miteinander "vereinen"
      $content.=$this->cObj->substituteMarkerArrayCached($tmpl_eintrag, $marker);
   }
   // Letztmalig den umhüllenden Teilbereich ersetzen und Ergebnis ausgeben
   $content =$this->cObj->substituteSubpart($tmpl, "###EINTRAG###", $content);
   return $content;
}
}



if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/user_rmmitarbeiter/pi1/class.user_rmmitarbeiter_pi1.php'])	{
	include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/user_rmmitarbeiter/pi1/class.user_rmmitarbeiter_pi1.php']);
}

?>

Da ich leider nicht so fit bin in PHP bin ich für jeden Tipp dankbar.
Vielen Dank im Voraus.

Gruß
Enzo

NickD ·

hallo,

ich glaube du gehst da völlig falsch ran,...
fgetcsv ist eine funktion von php, also ist es egal wo du die aufrufst.
schreib dir einfach ne funktion:

function genMyCSV()

und hau da deinen code rein.

frankonly ·

Hallo Nick,

erstmal vielen Dank für deine Antwort.
Eine eigene Funktion habe ich mir schon geschrieben.
Aber da meine Funktion die Daten mit ECHO ausgibt werden diese nicht durch TYPO3 gerendert.
Im Browser sind die dann oberhalb von meiner Seite zu sehen.
So habe ich bis jetzt versucht den marker anzusprechen: (bitte nicht lachen wenn es völlig falsch ist) #giggle# bin echt ein blutiger Anfänger 😢

$marker["###DATEI###"] = $this->cObj->cObjGetSingle("TEXT", csvGen($data));

Gruß
Enzo

NickD ·

ich nehme mal an, dass du ein frontend-plugin erstellen willst.
ich würde dir den tip geben, die marker erst mal außen vor zu lassen. ich würde dir ebenfalls das tutorial auf www.php.net empfehlen, um php zu vertiefen.

als erstes:

eine funktion kann nur einen wert zurückgeben! du brauchst deine daten nicht per echo ausgeben, dann werden sie wie von dir schon erkannt ganz oben ausgegeben.
hier mal ein beispiel:

die main funktion ruft alle weiteren funktionen auf und das was die main funktion zurück liefert, wird auch auf deiner seite gezeigt (das geschieht aber nicht mit echo, sondern mit return.
alles was du ausgeben willst, kommt in eine variable (hier $content) und diese wird dann zurück gegeben.

function main($content,$conf)	
{
		$this->conf=$conf;
		$this->pi_setPiVarDefaults();
		$this->pi_loadLL();
		$this->pi_USER_INT_obj=1;	
 
$content .= $this->meineFunktion();

//die scv daten sollten nun ganz normal auf deiner seite auftauchen, sofern du alle ts konfigurationen richtig getätigt hast.
du kannst auch die csv daten an eine weitere funktion schicken, die die daten weiterverarbeitet (z.b. in die datenbank schreibt)

beispiel: $this->writeToDB($content);

return $content;
}

function meineFunktion()
{
  //hier kannst du die funktion z.b. nutzen

      $row = 1;

      $handle = fopen("fileadmin/data.csv", "r");
 
      while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {

      $num = count($data);

      $row++;

      for ($c=0; $c < $num; $c++) {
         
         //hier werden die csv daten in ein array geschrieben
         $csv_data[] = $data[$c] . "\n";
          }
      }
      fclose($handle); 

      return $csv_data; //die csv daten werden an die main geliefert und in 
                          $content geschrieben
}

function writeToDB($content)
{
  //schreib daten in db
}

ich hoffe das hilft dir ein wenig weiter!

lg, nick