Tutorials
Einige nützliche Hilfen und Code-Schnipsel, die ich immer wieder benötige und deshalb hier für alle sammle.
TYPO3: Flexform erweitern (extenden) am Beispiel von tt_news
Für ein Projekt musste ich letztens das Ausgabe-Plugin von tt_news erweitern. Da dies eine Flexform ist, lässt sich dieses nicht so einfach über TCA oder ext_tables bewerkstelligen. Nach ein wenig Recherche und rumprobieren habe ich hier die perfekte Lösung gefunden. Man erstellt eine Flexform für seine neuen Felder und dann wird diese in die zu bearbeitende reingemerged. Das Ganze geht so:
ext_tables.php
Erweitert die ext_tables.php um folgende Zeilen. Die Datei included eine Klasse der 2 benötigten Dateien um die Flexform mergen zu können. Die Klassen könnt ihr benennen, wie ihr wollt. meine Extension nenne ich mal ak_test.
require_once(t3lib_extMgm::extPath($_EXTKEY).'/classes/class.tx_ak_test_ext_ttnews_flexform.php');
$old_flexform = $TCA['tt_content']['columns']['pi_flexform']['config']['ds']['9,list'];
$new_flexform = tx_ak_test_ext_ttnews_flexform::merge($old_flexform, 'EXT:' . $_EXTKEY . '/tt_news_flexform_ext.xml');
t3lib_extMgm::addPiFlexFormValue(9, $new_flexform);
tx_ak_test_ext_ttnews_flexform.php
<?php
/*Merge 2 Flexform-Files*/
require_once(t3lib_extMgm::extPath('ak_test').'classes/class.tx_ak_test_fexform_merge.php');
class ak_test_ext_ttnews_flexform {
static function merge($flexform_ttnews, $flexform_add) {
$flexform = $flexform_ttnews;
// get LastIndex
$lastIndex = 0;
if (substr($flexform, 0, 5) == 'FILE:')
$flexform = substr($flexform, 5);
if (substr($flexform, 0, 4) == 'EXT:')
$flexform = file_get_contents(t3lib_div::getFileAbsFileName($flexform));
$flexform = t3lib_div::xml2array($flexform);
$items = $flexform['sheets']['sDEF']['ROOT']['el']['listOrderBy']['TCEforms']['config']['items'];
if (is_array($items) && !empty($items)) {
foreach ($items as $index => $item) {
if ($index > $lastIndex)
$lastIndex = $index;
}
}
$lastIndex++;
// replace index in new flexform
if (substr($flexform_add, 0, 5) == 'FILE:')
$flexform_add = substr($flexform_add, 5);
if (substr($flexform_add, 0, 4) == 'EXT:')
$flexform_add = file_get_contents(t3lib_div::getFileAbsFileName($flexform_add));
$flexform_add = str_replace('###LASTINDEX###' , $lastIndex, $flexform_add);
// merge
$new_flexform = tx_ak_test_fexform_merge::merge($flexform_ttnews, $flexform_add);
return $new_flexform;
}
}
class.tx_ak_test_fexform_merge.php
<?php
class tx_ak_test_flexform_merge {
static function merge ($file1, $file2) {
$base1 = $file1;
// remove FILE:
if (substr($file1, 0, 5) == 'FILE:')
$file1 = substr($file1, 5);
if (substr($file2, 0, 5) == 'FILE:')
$file2 = substr($file2, 5);
// extract xml to file if EXT:
if (substr($file1, 0, 4) == 'EXT:')
$file1 = file_get_contents(t3lib_div::getFileAbsFileName($file1));
if (substr($file2, 0, 4) == 'EXT:')
$file2 = file_get_contents(t3lib_div::getFileAbsFileName($file2));
if (!$file1 || !$file2)
return $base1;
// convert to array
$flex1 = t3lib_div::xml2array($file1);
$flex2 = t3lib_div::xml2array($file2);
if (!is_array($flex1) ||!is_array($flex2))
return $base1;
$final = tx_ak_test_flexform_merge::array_merge_recursive($flex1, $flex2);
$flex = t3lib_div::array2xml($final);
return $flex;
}
/**
* based of cv_merge_flexform extension
*/
static function array_merge_recursive($array, $array2) {
$tab_out=$array;
if (!is_array($array2)) return $array2;
if (!is_array($array)) return $array;
foreach ($array2 as $key => $value) {
// The process repeats recursively:
if (is_array($value)) {
if (!isset($array[$key])) {
$array[$key] = array();
}
$tab_out[$key] = tx_ak_test_flexform_merge::array_merge_recursive($array[$key], $value);
// Else, it is a value
} else {
$tab_out[$key] = $value;
}
}
return $tab_out;
}
}
So was macht das Ganze nun?
In der ext_tables laden wir unsere Klasse die wiederrum eine Klasse lädt in der 2 Flexformen gemerged werden können. Das Ergebnis wird dann zurück an Typo3 geliefert und man im BE die hinzugefügten Felder sehen.
Das wars auch schon.
Kommentare
Funktioniert dies noch mit Typo3 8.7.x ?
Gruss Footrotflat
das ist eine gute Frage. Es könnte evtl. gehen, wenn man die richtigen Namespaces wieder findet.
Grüße André
Hinterlasse einen Kommentar