Zum Inhalt springen

Frage zu Hooks

Erstellt am 16. Juni 2008 · 10 Antworten · letzte Antwort am 16. Juni 2008

Tags: Frage

schani ·

Hallo,

ich habe eine eigene Extension. Dort werden Datensätze angelegt. Sobald ein neuer Datensatz gespeichert wird, soll nun eine page erstellt werden. Also im Verzeichnisbaum ein neuer Eintrag hinzukommen.

Soweit hab ich das mal umgesetzt:
In meiner ext_localconf.php habe ich dies eingetragen:

$GLOBALS ['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['processDatamapClass'][] = 'EXT:xxx_kunden/class.tx_xxx_kunden.php:tx_xxx_kunden_hook';

$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['processDatamap_afterDatabaseOperations'][] = 'EXT:xxx_kunden/class.tx_xxx_kunden.php:tx_xxx_kunden_hook';

In der class.tx_xxx_kunden.php steht folgendes:

<?php
class tx_xxx_kunden_hook {

  public function processDatamap_afterDatabaseOperations ($status,$table,$id,&$fieldArray,&$reference) {

			$tce = t3lib_div::makeInstance('t3lib_TCEmain');
			$tce->stripslashes_values = 0;   
			$hash = strtolower(md5(uniqid(rand(), true)));
			$data['pages']['NEW' . substr($hash, 0, 8-)] = array(
				'uid' => $page_uid,
				'title' => $fieldArray['title'],
				'hidden' => 0,
				'pid' => 26,  
				'doktype' => 254, 
				'perms_userid' => 2,
				'perms_groupid' => 2,
				'perms_user' => 31,
				'perms_group' => 27,
				'cruser_id' => 1,
					 
			);
			$tce->start($data, array());
			$tce->process_datamap();
			unset($data); 
			
			debug(func_get_args(),'TEST5');
					
    }
}
?>

Jetzt wird beim speichern eines Datensatzes meiner Extension, zwar ein das Hook angestoßen, aber es werden 1400 pages angelegt. Eigentlich sollte nur eines angelegt werden.

Könnt Ihr mir sagen was ich falsch mache?

Besten Dank für Hilfe

Christian

steffenk ·

ja - der hook wird ja bei jeder Operation ausgeführt.
Du darfst dort nicht speichern, das macht TCE ja eh. Der Hook dient nur der manipulation der daten

if ($table == $mytable) {
$fieldArray[whatever] = 'xyz';
}

mehr nicht.

schani ·

Meinst Du in der Funktion?

Wo muss ich das den anwenden?
Wo wird da genau gespeichert?

Bitte um Hilfe

Christian

#
public function processDatamap_afterDatabaseOperations ($status,$table,$id,&$fieldArray,&$reference) { 
                        $tce = t3lib_div::makeInstance('t3lib_TCEmain');
                        $tce->stripslashes_values = 0;   
                        $hash = strtolower(md5(uniqid(rand(), true)));
                        $data['pages']['NEW' . substr($hash, 0, 8-)] = array(
                                'uid' => $page_uid,
                                'title' => $fieldArray['title'],
                                'hidden' => 0,
                                'pid' => 26, 
                                'doktype' => 254,
                                'perms_userid' => 2,
                                'perms_groupid' => 2,
                                'perms_user' => 31,
                                'perms_group' => 27,
                                'cruser_id' => 1,
                                        
                        );
                        $tce->start($data, array());
                        $tce->process_datamap();
                        unset($data);
                       
                        debug(func_get_args(),'TEST5');
                                       
    }
}
steffenk ·

ja klar in der Funktion.

Bei Dir wird bei jedem! Aufruf des hooks eine Seite angelegt, und das soll doch wohl nicht sein.

Was willst Du überhaupt erreichen, und vor allem in welcher Situation genau?

schani ·

Ja genau, nur bin ich mir jetzt nicht klar wo ich die die Beschränkung reinmache. Ist die Funktion aber generell so richtig?

Reicht es wenn ich es um
$tce->start($data, array());
$tce->process_datamap();

mache?

Was passiert wenn der Datensatz schon mal gespeichert ist? Wird dann ein neuer angelegt, oder der alte überschreiben ?

Christian

steffenk ·

also, da ich nicht weiss wann die Seite angelegt werden soll, kann ich auch nichts zur Beschränkung sagen
'uid' => $page_uid, ???
uid wird ermittelt, was Du aber setzen must ist pid für das Elternelement
$page_uid ist nirgends vorhanden

Und sicher, es wird immer eine neue angelegt, da musst Du Dich schon selber drum kümmern

t3lib_BEfunc::getSetUpdateSignal('updatePageTree');
sollte auch immer nach page-Anlegen aufgerufen werden.

schani ·

Kann ich das steuern? Also wann die Seite angelegt werden soll?

Eigentlich sobald ich in meiner ext einen neuen Datensatz abspeichere. Dann hab ich eine eingene ID auf die ich verweisen kann.
Was ich nicht weis ist, wie das gesteuert wird.

Und wenn der Datensatz meiner ext nur editiert wird soll natürlich kein neuer pages Eintrag angelegt werden.

1. Anlegen speicher
2. nur Speichern

Das müsste ich ja dann in meiner ext_localconf.php festlegen, oder?

Christian

schani ·

Kannst Du mir noch einen Tipp geben?

Warum kann ich denn in der Funktion keinen debug($table,'Table') setzen?

Christian

steffenk ·

wenn das über Ajax aufgerufen wird, gibts keine Ausgaben, da der Header anders ist.
Ich helfe mir dann mit so einer Ausgabe:

file_put_contents('c:\t3log.txt',print_r($var,true));