Zum Inhalt springen

Hook - Hilfe

Erstellt am 18. Juni 2008 · 4 Antworten · letzte Antwort am 19. Juni 2008

Tags: Frage

Winddancer ·

Hallo zusammen,

ich habe jetzt schon den ganzen Tag an einem Hook rumgefummelt und komme einfach nicht darauf, was ich falsch mache. Wahrscheinlich habe ich einfach nur ein Brett vorm Kopf und die Lösung ist ganz einfach.

In der Datei /lib/class.tx_commerce_product.php gibt es folgenden Abschnitt (line 123 ff)

/**
	 * @param integer uid of product
	 * @param integer integer language_uid , default 0
	 */
	function init($uid,$lang_uid=0) {
		
		 $this->database_class='tx_commerce_db_product';
		 $this->fieldlist=array('uid','title','subtitle','description','teaser','images','teaserimages','relatedpage','l18n_parent','manufacturer_uid');
		
		 if  ($uid > 0) {
		 	
			$this->uid=$uid;
			$this->lang_uid=$lang_uid;
	  		$this->conn_db=new $this->database_class;
	  		$hookObjectsArr = array();
			if (is_array ($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['commerce/lib/class.tx_commerce_product.php']['postinit'])) {
					foreach ($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['commerce/lib/class.tx_commerce_product.php']['postinit'] as $classRef) {
							$hookObjectsArr[] = &t3lib_div::getUserObj($classRef);
					}
			}
			foreach($hookObjectsArr as $hookObj)	{
					if (method_exists($hookObj, 'postinit')) {
						$hookObj->postinit($this);
				}
			}
	  		return true;
		 }
		 else
		 {
		 	return false;	
		 }
		
	}

Ich möchte das fieldlistarray einfach um ein paar Felder erweitern ohne dafür den Quellcode der Datei zu verändern.

Da es hier einen Hook gibt, dachte ich mir ich könnte es dafür nutzen.

Also habe ich in meine commerce Erweiterung eine ext_localconf.php angelegt und folgendes reingeschrieben:

require_once(t3lib_extMgm::extPath($_EXTKEY).'lib/class.tx_ofcpainit.php');
$TYPO3_CONF_VARS['EXTCONF']['commerce/lib/class.tx_commerce_product.php']['postinit'][] = 'ofcpainit';

Dann habe ich entsprechende Datei angelegt und die Klasse ofcpainit mit der Methode postinit angelegt, welche das fieldarray um meine Felder erweitern soll.

Das sieht dann so aus:

class ofcpainit {
	
		function postinit() {
			$additionalfields=array('tx_ofcommerceproductsaddon_setup','tx_ofcommerceproductsaddon_constants','tx_ofcommerceproductsaddon_template');
			$this->fieldlist=array_merge($additionalfields,$this->fieldlist);
		}
		
}

Allerdings wird diese Datei nicht aufgerufen und ich habe keinen Plan wieso.

Bitte nagelt mir das Brett vorm Kopf weg!!!

Grüße

Sven

LuP ·

Hi Sven !

Versuch mal den relativen Pfad anzugeben, gefolgt von dem Klassennamen.
Also in der Form: 'EXT:pFAD_ZU_HOOK_DATEI:KLASSENNAME';

Zum Beispiel (alles in einer Linie):

$TYPO3_CONF_VARS['EXTCONF']['commerce/lib/class.tx_commerce_product.php']['postinit'][] = 'EXT:commerce/hooks/class.tx_commerce_product_hook_ofcpainit.php:tx_commerce_product_hook_ofcpainit';

class tx_commerce_product_hook_ofcpainit {

function postinit() {
$additionalfields=array('tx_ofcommerceproductsaddon_setup','tx_ofcommerceproductsaddon_constants','tx_ofcommerceproductsaddon_template');
$this->fieldlist=array_merge($additionalfields,$this->fieldlist);
}

}

Dann schön alle Caches löschen und nochmal probieren.

saschae ·

Wie LuP schon geschrieben hat ist dieser Teil hier falsch

Winddancer schrieb
require_once(t3lib_extMgm::extPath($_EXTKEY).'lib/class.tx_ofcpainit.php');
$TYPO3_CONF_VARS['EXTCONF']['commerce/lib/class.tx_commerce_product.php']['postinit'][] = 'ofcpainit';

Du musst den Pfad zu deiner Datei angeben, die die Klasse enthält.

require_once(t3lib_extMgm::extPath($_EXTKEY).'lib/class.tx_ofcpainit.php');
$TYPO3_CONF_VARS['EXTCONF']['commerce/lib/class.tx_commerce_product.php']['postinit'][] = 'EXT:DEIN_EXTENSIONNAME/class.DEINE_DATEI_MIT_DER_KLASSE.php:ofcpainit';
Winddancer ·

Hallo zusammen,

erstmal Danke für Eure Hilfe.

Ich habe jetzt mal versucht das entsprechend einzubinden:

require_once(t3lib_extMgm::extPath($_EXTKEY).'lib/class.tx_ofcpainit.php');
$TYPO3_CONF_VARS['EXTCONF']['commerce/lib/class.tx_commerce_product.php']['postinit'][] = 'EXT:of_commerce_products_addon/lib/class.tx_ofcpainit.php:&ofcpainit';

Inkludieren tut er die Datei jetzt.

Leider wird jedoch nicht die postinit ausgeführt. Korrigiert mich wenn ich hier falsch liege, aber prüft er hier nicht ob eine Methode mit Namen "postinit" existiert?

if (method_exists($hookObj, 'postinit')) {

Wieso ruft er diese denn dann nicht auf?

Ein Blick in die t3lib div Erklärung sagt, dass die "function &getUserObj($classRef,$checkPrefix='user_',$silent=0)" eine Refernz zu einem User Objekt erstellt und zurückgibt. Und eine Objekt Referenz, sofern der Klasesname mit & prefixed ist.

Gesagt getan. Ich bekomme beim Aufruf eben dieser Funktion jedoch nur bool / false zurück und keine Referenz.

Ich scheine also etwas grundlegend falsch zu machen. :/ Nur was...

Winddancer ·

omg... ich hätte nie gedacht, dass es mit den Naming Conventions zusammenhängt, aber es ist scheinbar so.

Ich habe die Klasse und den Aufruf in der Localconf in tx_ofcpainit umbenannt und siehe da: Es funktioniert!!! Sehr schade, dass das weder in der Hooks Erklärung noch in der t3lib_div api vermerkt ist! Hätte ich mir 1 1/2 Tage sinnlose Sucherei sparen können! ://