Tutorials

Einige nützliche Hilfen und Code-Schnipsel, die ich immer wieder benötige und deshalb hier für alle sammle.

Zurück zur Übersicht

TYPO3: Flexform erweitern (extenden) am Beispiel von tt_news

#Tutorials#TYPO3

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

  • Schumiel
    Wenn addPiFlexFormValue zweimal aufgerufen wird, wird das zweite Mal nicht genommen. Das heißt, das mergen kann hier gar nicht stattfinden, weil es in der anderen Extension (durch addPiFlexFormValue ) bereits angewendet wird. Das addPiFlexFormValue aus der anderen Extension raus nehmen, macht es updateunfähig.
    Antworten
  • Footrotflat
    Hallo André
    Funktioniert dies noch mit Typo3 8.7.x ?
    Gruss Footrotflat
    Antworten
    • Andre Rinas
      Hallo Footrotflat,
      das ist eine gute Frage. Es könnte evtl. gehen, wenn man die richtigen Namespaces wieder findet.
      Grüße André
      Antworten

Hinterlasse einen Kommentar

Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

Kommentar wird gespeichert
Danke für deinen Kommentar! Sobald er freigegeben wurde erscheint er hier.