Zum Inhalt springen

Hook Problem

Erstellt am 21. März 2007 · 32 Antworten · letzte Antwort am 23. März 2007 · Seite 1 von 2

Tags: Frage

just2b ·

Hallo,

dieser hook greift wie gesagt erst nach dem Absenden und vor dem Speichern in die DB.

Das ganze sollte ca so ausschauen, das ganze war in einer Extension, die pro Datensatz ein Art Logfile anlegt wer was gemacht hat, wobei schon lange her, könnte möglicherweise auch optimiert werden
Datei class.tx_rgreise_tcemainprocdm.php

<?php
class tx_rgreise_tcemainprocdm {
    function processDatamap_postProcessFieldArray ($status, $table, $id, &$fieldArray, &$this) {

			if ($table == 'tx_rgreise_reise' && $status = 'update') {
				
				global $TYPO3_DB;
			$fields = $fields?$fields:$this->fieldList;
			$sort = $sorting?$this->sorting:'';
			$tables = $this->tables;
			$fields = 'realName';
			$tables = 'be_users';
			$temp_where='uid = '.$this->userid;
	
			$res = $TYPO3_DB->exec_SELECTquery($fields, $tables, $temp_where);
			$row = $TYPO3_DB->sql_fetch_assoc($res);
			
			$name = $row['realName'];
			#-------------------------------------#
			$fields = 'log';
			$tables = 'tx_rgreise_reise';
			$temp_where='uid = '.$id;
	
			$res = $TYPO3_DB->exec_SELECTquery($fields, $tables, $temp_where);
			$row = $TYPO3_DB->sql_fetch_assoc($res);	
			$logAlt = $row['log'];
				
				
				$values = array_values($fieldArray);
				$key = array_keys($fieldArray);

				$fieldArray['cruser_id'] = $this->userid;
				$count = 0;
				foreach ($key as $tmp) {
					if ($tmp != 'tstamp') {
						
							switch ($tmp) {
								case "land": $a = "Land"; break;
								...
								case "sonstigesks": $a = "Sonstiges KS"; break;
								default: $a=$tmp;
							}
						
						
						$neu .= $a.', ';
						$count++;
					}
				}
				
				if ($count = 0) {
					$x = $logAlt; 
				} else {
					$x = $name.' am '.date("d.m.Y H:i", $fieldArray['tstamp']).': '.$neu.'<br/>'.$logAlt;
				}
				$fieldArray['log'] = $x;
			}
    }
} 
?>

Du siehst, es wird ein $fieldArray['log'] zurückgegeben falls der Datensatz aktualisiert wird (lass dir auch mal $status ausgeben). Das ganze landet dann im Feld "log".

Nun musst du noch die Datei bekanntgeben bzw dass du den hook nützen möchtest. Das geschieht in der Datei ext_localconf.php mit

$GLOBALS ['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['processDatamapClass'][] = 'EXT:rgreise/class.tx_rgreise_tcemainprocdm.php:tx_rgreise_tcemainprocdm';

Pfade müssen natürlich angepasst werden.

Viel Erfolg
georg

mab82 ·

cool vielen Dank für eure Hilfe es hat geklappt.
Also diesen Hook habe ich jetzt auch verstanden nur kennt ihr einen Hook der
ausgeführt wenn man auf 'New Record'. Wenn man auf 'New Record' klickt wird ja die Tabellen Struktur von der jeweiligen Extension gerendert (z.B tt_news, also textfelder, selectfelder usw). Vor diesem Rendern und nach dem Klick auf 'New Record' kennt ihr da einen Hook welches ich benutzen kann?
Oder habt ihr da eine Idee wie ich dazwischen greifen kann?

mab82 ·

Will folgendes machen. Ich will datensätze von Extension kategorisieren.
Es existiert eine tabelle z.B mit dem namen tx_globaleCats in dennen vordefinierte Kateogrien sind wie z.B Sport,Wirtschaft,Wissenschaft,Gesundheit usw.

Wenn der Redakteur für eine Extension die ich Programmiert habe oder ein anderer Programmierer programmiert hat einen Datensatz anlegt, soll beim anlegen des Datensatzes außer denn von der Extension festgelegten Feldern noch eine Selectorbox angezeigt werden. Diese Selectorbox bekommt denn Inhalt aus der globalen Kategorie Tabelle tx_globaleCats. Nach dem der User auf speichern klickt (oben der Hook ist an der richtigen stelle) wird die ID des Datensatzes ausgelesen und die Kategorie die der Redakteur ausgewählt hat.

Nur wie kann ich es so beeinflussen das die Selectorbox erscheint?

Es ist schwer zu beschreiben hoffe ich habe es aber verständlich beschrieben

just2b ·

Hallo,

du willst also einfach noch eine Selectorbox in einem Datensatz haben? kickstarter > extend existing table > auswählen und deine selectorbox erstellen

georg

mab82 ·

Ja genau, im Prinzip hast du recht nur es gibt folgendes Problem.
Es muss dynamisch laufen, also ich werde noch eine Backendextension machen, wo der
Redakteur komfortabel die Extension wählen kann die Kategorisiert werden.

Für die Extension die der Redakteur auswählt wird eine Selectorbox im Datensatz noch angezeigt bei den restlichen nicht.
Das Problem ist halt das es Benutzerfreundlich sein muss und mir ist als einzige Lösung dies eingefallen das es Automatisch eingeblendet wird bei den Extension die ausgewählt worden sind.

Gibt es einen anderen Ansatz? Oder wie kann ich meinen Ansatz realisieren?

just2b ·

Hallo,

nun das Problem ist halt, dass du für die Kategorie ja ein DB-Feld brauchst, das erstmal ein Admin anlegen muss... von dem her ist das dynamische einfach etwas ein Problem

georg

mab82 ·

Nein, es wird so sein. Nachdem der Redakteur auf speichern klickt, werde ich die Datensatz ID auslesen und denn Tabellennamen zu diesem Datensatz. Dies wird dann in einer spezifischen Tabelle gespeichert. Hatte mir gedacht das ich bei dem Render Prozess von Typo3 noch eine Selectorbox anhänge, aber denke dies ist relativ schwer zu realisieren wenn überhaupt.

Oder mir Fällt eben ein, das ich villeicht bei denn Extensions die Kategorisiert werden, nachdem der Redakteur auf Speichern klickt noch ein Formular ausgebe in dem er eine Kategorie auswählt, wobei diese Lösung denke Probleme mit sich bringen kann.

just2b ·

Ok,

du vergisst hier aber, dass das zwei große Probleme mitsichbringt:
- Speichert der Redakteur neu, hättest du wieder einen neuen Eintrag in deiner Tabelle (ok könnte man lösen), aber
- Der Redakteur sieht nicht, welche Kategorie nun ausgewählt ist, weil bei dem Datensatz selbst die Verbindung nicht gespeichert wird.

georg

mab82 ·

Zunächst mal danke dir vielmals für deine Hilfestellung.
Ja das stimmt hast vollkommen recht, vorallem der zweite punkt ist
ausschlaggebend.
Bin villeicht seit 10 tagen daran habe leider keinen anderen Ansatz
gefunden, habe auch viel in Forums gesucht leider erfolgslos.

Ich muss dies Lösen aber wie? Hast du eine Idee?

just2b ·

wie schon vorher erwähnt, es geht nur mit einer erweiterung der jeweiligen tabellen. natürlich kannst du im hook dann auch noch in deine 2. tabelle schreiben

georg

mab82 ·

Hallo just2b,

ich werde es jetzt so machen wie du es auch empfohlen hast also mit der erweiterung der Tabellen.
Es werden Parameter per TS übergeben welche Tabellen zu erweitern sind.

Und daraufhin wird die ext_tables.sql, ext_tables.php und locallang_db.xml
der Extension modifiziert.

z.B in ext_tables.sql

#
# Table structure for table 'tt_content'
#
CREATE TABLE tt_content (
	tx_myExtension2_catsfromcontents blob NOT NULL
);

in ext_tables.php

<?php
if (!defined ('TYPO3_MODE')) 	die ('Access denied.');
$tempColumns = Array (
	"tx_myExtension2_catsfromcontents" => Array (		
		"exclude" => 1,		
		"label" => "LLL:EXT:myExtension2/locallang_db.xml:tt_content.tx_myExtension2_catsfromcontents",		
		"config" => Array (
			"type" => "select",	
			"foreign_table" => "tx_abfachbeitraege_kategorien",	
			"foreign_table_where" => "ORDER BY tx_abfachbeitraege_kategorien.uid",	
			"size" => 10,	
			"minitems" => 0,
			"maxitems" => 5,
		)
	),
);


t3lib_div::loadTCA("tt_content");
t3lib_extMgm::addTCAcolumns("tt_content",$tempColumns,1);
t3lib_extMgm::addToAllTCAtypes("tt_content","tx_myExtension2_catsfromcontents;;;;1-1-1");
?>

Wenn jetzt der Redakteur per TS Parameter (also die jeweiligen Tabellennamen die zu Erweitern sind) an meine Extension 'MyExtension2' übergibt,
schreibt meine Extension 'MyExtension2' die ext_tables.php, ext_tables.sql und locallang_db.xml von der 'MyExtension2' neu.
Also er fügt die jeweiligen Erweiterungszeilen für die zuständingen Tabellen hinzu.
Da normalerweise solche Datein von der Extension Kickstarter erzeugt werden wäre meine Idee von der Kickstarter Klasse 'tx_kickstarter_compilefiles' ein Objekt erzeugen und versuchen über diese Klasse diese Datein neu zu erzeugen.
Leider habe ich denn Prozess in der Datei 'tx_kickstarter_compilefiles' nicht ganz verstanden.
Hättest du da eine Idee wie ich das über so ein Objekt realisieren kann?

just2b ·

das alles ist so absolut nicht sauber!
um soviele tabellen kanns ja gar nicht gehen...
mach eine normale tabelle mit allen erweiterungen, und dann kannst du zB über eine variable im extension manager (stichwort: ext_conf_template.txt) die tabellen angeben und auf diese variable kannst du in der ext_Tables.php zurückgreifen und die felder ausgeben die in frage kommen,... alles klar?

georg

mab82 ·

Auf jeden Fall hast schon recht ist sehr unsauber was ich
vorgeschlagen hatte 🙂

Aber wenn ich ehrlich bin ist es mir nicht ganz klar deine Beschreibung,
denke habe zu viel gearbeitet diese Woche 🙂 bzw. 'ext_conf_template.txt' sagt mir im mom. nicht richtig was.

Also folgende schritte:
1.Schritt:

'mach eine normale tabelle mit allen erweiterungen'

Also eine globale Tabelle Anlegen unabhängig von jeglicher Extension und deren
Inhalt mit denn Tabellennamen der vorhandenden Extension füllen. Richtig ?

2.Schritt:

und dann kannst du zB über eine variable im extension manager (stichwort: ext_conf_template.txt) die tabellen angeben

Hier habe ich leider nichts verstanden 🙁

3.Schritt:

und auf diese variable kannst du in der ext_Tables.php zurückgreifen und die felder ausgeben die in frage kommen

Hier leider auch nichts

Hoffe die Fragerei nervt nicht, aber ist halt etwas was gelöst werden muss für denn Betrieb und ich blicke leider nicht mehr durch 🙂[/quote]

just2b ·

Ok,

also statt lieber kurz danach zu suchen eine Antwort schreiben mit "kenn mich nicht aus" 😉

Erstelle in der Extension die Datei ext_conf_template.txt mit dem Inhalt

# cat=basic; type=string; label=Development, forget it
tables = tt_address,fe_users

Nun geh in den Extension Manager zu der Ext, klick auf titel, da siehst den Eintag, klick 1x update

====
zum Auslesen
====
in der ext_tables_php

$tmp_confArr = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['deinExtKey!!']);

und dann mit

$tmp_confArr['tables']

erhältst du die Einstellungen vom Extension Manager, machst mit explode ein array draus und dann kannst du das ganze angeben, ca so

<?
$tables = explode(',',$tmp_confArr['tables']);
foreach ($tables as $key=>$value) {
  $value = trim($value);
  t3lib_div::loadTCA($value);
  t3lib_extMgm::addTCAcolumns($value,$tempColumns,1);
  t3lib_extMgm::addToAllTCAtypes($value,"tx_rggooglemap_lng;;;;1-1-1, tx_rggooglemap_lat, tx_rggooglemap_display,  tx_rggooglemap_cat2, tx_rggooglemap_ce");
}
?>

Wichtig, die Ext, in der du dich gerade befindest muss nach den installiert sein, die du erweiterst!

lg georg

mab82 ·

Vielen Dank für die ausführliche Antwort, doch habe zwar gesucht
wurde mir aber nicht so ganz klar wie und wo 😉

Aber ne schlechte Nachricht es geht irgendwie nicht.

1. 'ext_conf_template.txt' Datei angelegt mit folgendem Inhalt
# cat=basic; type=string; label=Development, forget it
tables = tx_autoren
2. Im ExtManager auf denn Titel der Ext geklickt dannach auf Update
3. In ext_tables.php
$tmp_confArr = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['meinExtKey']);
4. In der localconf.php wird folgender Eintrag erstellt
$TYPO3_CONF_VARS['EXT']['extConf']['meinExtKey'] = 'a:1:{s:6:"tables";s:26:"tx_autoren";}'; // Modified or inserted by TYPO3 Extension Manager.
// Updated by TYPO3 Extension Manager 23-03-2007 15:00:02
5. Folgendes noch in die ext_tables.php eingefügt
$tables = explode(',',$tmp_confArr['tables']);

foreach ($tables as $key=>$value) {
$value = trim($value);
t3lib_div::loadTCA($value);
t3lib_extMgm::addTCAcolumns($value,$tempColumns,1);
t3lib_extMgm::addToAllTCAtypes($value,"tx_meineExtension_globalCats;;;;1-1-1");

}

Aber es gibt keinerlei Änderung in der Tabelle tx_autoren ich hätte jetzt gedacht das diese Tabelle um das Feld tx_meineExtension_globalCats erweitert wäre. Alle Extension waren vor dieser Extensio installiert.

Werde bald wahnsinnig ich weis nicht was ich falsch mache #angry#

just2b ·

Hallo,

- steht denn was in "$tmp_confArr['tables']" drin?
- was ist wenn du $value manuell auf tx_autoren setzt?
- tabelle selbst heißt auch tx_autoren? sicher?
- tx_meineExtension_globalCats gibts auch?

georg

mab82 ·

Habe nur fürs testen am Anfang nur tx_autoren angegeben.
Und $tmp_confArr['tables'] sowie $value liefert als Ausgabe: tx_autoren

Habe folgendes mal eingetragen:

t3lib_div::loadTCA("tt_content");
t3lib_extMgm::addTCAcolumns("tt_content",$tempColumns,1);
t3lib_extMgm::addToAllTCAtypes("tt_content","tx_abdiplExtension_cats;;;;1-1-1");

Und da ging es. Wenn ich statt $value tx_autoren schreibe und es Manuell eingebe
geht es auch nicht.
Dein Ansatz ist Perfekt genau das was ich suche, nur ich bekomme
es irgendwie nicht hin weis auch nicht Falsch mache #angry# #angry# #angry#

just2b ·

dann schau mal in die localconf.php in die extList, ob auch wirklich dort die ext, die die anderen manipuliert, nach den anderen eingetragen ist... das hat mich mal ein paar tage gekostet

georg