Zum Inhalt springen

USER_FUNC und cObjGetSingle

Erstellt am 16. September 2013 · 4 Antworten · letzte Antwort am 17. September 2013

Tags: PHP, TYPO3 6.x, Frage

Chrissli ·

Hallo zusammen,

ich versuche gerade Inhalte per USER_INT selbst zu rendern, i.d.R. klappt das auch sehr gut, allerdings habe ich nun ein Problem mit den übergebenen werten, vielleicht kann mir hier jemand weiterhelfen.

So sieht mein USER_INT aus:

lib.externalRender = USER_INT
#lib.externalRender.if < lib.internalRender.if
#lib.externalRender.if.negate = 1
lib.externalRender {
  userFunc = user_imagedb->load_ext_image  
  websrc = TEXT
  websrc.field = title  
}

Und so mein php

<?php
class user_imagedb {
	public function load_ext_image($content,$conf) {
		
		
		$x = $GLOBALS['TSFE']->cObj->cObjGetSingle($conf['userFunc.']['websrc'],$conf['userFunc.']['websrc.']);
		var_Dump($x);
	}
}
?>

Lustigerweise sagt mit var_dump() immer das $x keinen Inhalt hätte.
Weiß da jemand zufällig was ich falsch mache?

einpraegsam.​net ·

Auf den ersten Blick sehe ich kein groben Fehler.

Das könntest du ausprobieren:

  • Was ist wenn du USER statt USER_INT nutzt (gibt Probleme wenn man eine _INT innerhalb einer anderen _INT nutzt

  • Was ist wenn du testweise das cObj instanzierst (Bsp siehe unten)?

...
$cObj = t3lib_div::makeInstance('tslib_cObj');
$x = $cObj->cObjGetSingle($conf['userFunc.']['websrc'], $conf['userFunc.']['websrc.']);
...
Chrissli ·

Hat leider nicht geholfen.
Die Ausgabe var_dump($x,$conf) ergibt immer nur

string(0) ""
array(3) {
  ["userFunc"]=>
  string(28) "user_imagedb->load_ext_image"
  ["websrc"]=>
  string(4) "TEXT"
  ["websrc."]=>
  array(1) {
    ["field"]=>
    string(5) "title"
  }
}

Ich hab irgendwo gelesen, dass cObjGetSingle() nur innerhalb einer Extension/Plugin funktioniert.
Das klingt für mich zwar etwas unlogisch aber könnte es evtl. doch daran liegen?

einpraegsam.​net · · Beste Antwort

Nein das stimmt nicht, bzw. ist eine Extension auch nur eine UserFunc. Was auch dagegen spricht, ist die Tatsache, dass ich das auch schon hundertmal so verwendet habe.

Hier mal ein funktionierendes Beispiel von einem unserer Projekte:

lib.cObject = USER
lib.cObject {
  userFunc = user_stristr->stristrTypoScript
  userFunc {
    titleField = TEXT
    titleField.field = image_link
    searchFor = fileadmin
    foundText = TEXT
    foundText.value = class="download"
    notFoundText = TEXT
    notFoundText.value = class="extern"
  }
}
class user_stristr {

	/**
	 * Extends the cObj possibilities with a stristr method
	 *
	 * @param string $content
	 * @param array $conf
	 * @return string
	 */
	public function stristrTypoScript($content = '', $conf = array()) {
		// config
		global $TSFE;
		$local_cObj = $TSFE->cObj; // cObject
		$conf = $conf['userFunc.']; // ts config
		$searchFor = $conf['searchFor']; // get string
		$titleField = $local_cObj->cObjGetSingle($conf['titleField'], $conf['titleField.']); // stdWrap for title
		$foundText = $local_cObj->cObjGetSingle($conf['foundText'], $conf['foundText.']); // stdWrap for alternative Text
		$notFoundText = $local_cObj->cObjGetSingle($conf['notFoundText'], $conf['notFoundText.']); // stdWrap for alternative Text 2

		// let's go
		if (stristr($titleField, $searchFor)) { // if keyword found
			return $foundText; // return alternative text
		} else { // keyword not found
			return $notFoundText;
		}
	}
}
Chrissli ·

Danke, sowas hatte ich mir schon gedacht, aber man weiß ja nie.

Ich habe soeben den Fehler gefunden.

Ich hatte zuerst getestet, ob es einen Unterschied macht, ob ich die
Parameter direkt dem USER-Objekt zuordne oder der userFunc und hatte dabei keinen Unterschied bemerkt.

Natürlich besteht der Unterschied zumindest darin, dass der Parameterzugriff dann nicht
über

$conf['parameter'] bzw. $conf['parameter.']

erfolgt sondern über

$conf['userFunc.']['parameter'] bzw. $conf['userFunc.']['parameter.']

bzw. andersherum je nach Verwendung, dann klappt's auch mit dem Nachbarn.
Soll heissen ich habe auf Parameter zugegriffen die in diesem Kontext nicht gesetzt ( NULL ) waren.

Vielen Dank für deine Hilfe.

P.S.:
cObjGetSingle liefert das selbe Ergebnis, sowohl mit Zugriff über

$GLOBALS['TSFE']->cObjGetSingle();
als auch mit 
$cObj = t3lib_div::makeInstance('tslib_cObj');
$cObj->cObjGetSingle();

falls es Jemanden interessiert ( Zumindest hat mein Test das so ergeben )