Hallo habe nach der Anleitung bei Typo3.org
(http://typo3.org/development/articles/how-to-use-existing-hooks/?tx_rlmpofficedocuments_pi1%5Bview%5D=single&cHash=45a565e1de)
versucht so ein Hook zu machen.
Habe eine Extension im Kickstarter angelegt. Habe eine FE und BE Extension erzeugt in die aber im Moment keine Funktion haben. Dannach habe ich im Root Verzeichtnis (da wo sich auch die 'ext_localconf.php' befindet)der Extension eine Datei erstellt mit dem Namen 'class.tx_myextension_tcemainprocdm.php' in der folgendes steht.
<?php
class tx_myextension_tcemainprocdm {
function processDatamap_postProcessFieldArray ($status, $table, $id, &$fieldArray, &$this) {
echo '<h1>Hello World</h1>';
}
}
?>
In der Datei 'ext_localconf.php' habe ich folgendes eingetragen:
$GLOBALS ['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['processDatamapClass'][] = 'EXT:myextension/class.myextension_tcemainprocdm.php:tx_myextension_tcemainprocdm';
So das habe ich nach der Anleitung gemacht ist es bis hier hin ok? Oder etwas an falscher stelle?
Wenn man jetzt in der Listenansicht einen neuen Datensatz anlegen will müsste doch mein Hello World ausgegeben werden oder?
Oder habe ich es Falsch verstanden, dieser Hook wird doch ausgeführt wenn man einen neuen Inhalt anlegt stimmts?
mab82 schrieb
Oder habe ich es Falsch verstanden, dieser Hook wird doch ausgeführt wenn man einen neuen Inhalt anlegt stimmts?
Interessant wäre vielleicht erstmal zu wissen,
auf welchen Hook in welcher Extension du dich eigentlich beziehst
#paralyzed# #paralyzed# #paralyzed#
Der Hook ist in der Datei 'class.t3lib_tcemain.php'.
Auf folgenden Codeschnippsel:
// Hook: processDatamap_postProcessFieldArray
foreach($hookObjectsArr as $hookObj) {
if (method_exists($hookObj, 'processDatamap_postProcessFieldArray')) {
$hookObj->processDatamap_postProcessFieldArray($status, $table, $id, $fieldArray, $this);
}
}
Ich beschäftige ich mich zum ersten mal mit Hooks und habe das der o.g Anleitung gefolgt. Mein Ziel war es also das wenn man neue Datensätze über die Listenansicht anlegt (also nachdem klick auf 'New Record') sollte meine Funktion eingreifen. Da habe ich mir gedacht das dieses Tutorial dazu passend wär.
Oder liege ich komplett falsch?
mab82 schrieb
Ich beschäftige ich mich zum ersten mal mit Hooks und habe das der o.g Anleitung gefolgt. Mein Ziel war es also das wenn man neue Datensätze über die Listenansicht anlegt (also nachdem klick auf 'New Record') sollte meine Funktion eingreifen. Da habe ich mir gedacht das dieses Tutorial dazu passend wär.
Oder liege ich komplett falsch?
Nö, du liegst schon einigermaßen richtig (glaube ich, habe mich selber noch nicht wirklich mit hooks beschäftigen müssen).
Nur greift der Hook in tcemain erst nach Absenden des Formulars, sprich: es findet ein post-processing der gesendeten Daten statt, bevor diese in die db geschrieben werden.
echo-Anweisungen sind sowieso keine gute Idee (im konkreten Fall dürfte sie sowieso keine Folgen haben, da eh keine Ausgabe erfolgt),
nutze stattdessen z.B.
debug($fieldArray,'$fieldArray');
Hmm ok verstehe, die Daten werden ja erst mit dem speichern in die DB geschrieben, also müsste dieser Debug Prozess nachdem speichern geschehen stimmts?
Leider habe ich nachdem speichern oder speichern_schließen keine Ausgabe bekommen.
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
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?
Hallo,
sag lieber was du vorhast
georg
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
Hallo,
du willst also einfach noch eine Selectorbox in einem Datensatz haben? kickstarter > extend existing table > auswählen und deine selectorbox erstellen
georg
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?
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
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.
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
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?
Keiner einen Ansatz für dieses Problem ?
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
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?
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
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]