Zum Inhalt springen

Flexform in einem "totally new content Element" vom Type = CType verwenden

Erstellt am 4. August 2008 · 5 Antworten · letzte Antwort am 10. Oktober 2009

Tags: TCA, FlexForms, Frage

m.​z.​ ·

Hallo liebe TYPO3 Gemeinde,

ich schlage mich seit einiger Zeit mit folgendem Problem herum.

Frage: Kann eine Flexform in einem "totally new content Element" vom Type = CType erstellt werden?

1) Im Kickstarter erstelle ich ein neues Contentelement (FE "totally new content Element"). Sie hat den Testnamen "YXZ".

2) Die ext_tables.php sieht so aus.

<?php
if (!defined ('TYPO3_MODE')) 	die ('Access denied.');

t3lib_div::loadTCA('tt_content');
$TCA['tt_content']['types'][$_EXTKEY.'_pi1']['showitem']='CType;;4;button;1-1-1,header;;3;;2-2-2';

t3lib_extMgm::addPlugin(array('LLL:EXT:XYZ/locallang_db.xml:tt_content.CType_pi1',$_EXTKEY.'_pi1'),'CType');
?>

Bitte beachten: Sie ist vom Type "CType"!

3) Nun füge ich eine Flexform-Definition hinzu:

<?php
if (!defined ('TYPO3_MODE')) 	die ('Access denied.');

t3lib_div::loadTCA('tt_content');
$TCA['tt_content']['types'][$_EXTKEY.'_pi1']['showitem']='CType;;4;button;1-1-1,header;;3;;2-2-2,';

// + NEU ======================
$TCA['tt_content']['types']['list']['subtypes_addlist'][$_EXTKEY.'_pi1']='pi_flexform';
t3lib_extMgm::addPiFlexFormValue($_EXTKEY.'_pi1','FILE:EXT:'.$_EXTKEY.'/flexform.xml');
// - NEU ======================

t3lib_extMgm::addPlugin(array('LLL:EXT:XYZ/locallang_db.xml:tt_content.CType_pi1',$_EXTKEY.'_pi1'),'CType');
?>

Ergebnis: Die Flexform ist NICHT im BE zu sehen.

4) Also habe ich die Zeile einfach mal wie folgt am Ende mit pi_flexform erweitert:

<?php
$TCA['tt_content']['types'][$_EXTKEY.'_pi1']['showitem']='CType;;4;button;1-1-1,header;;3;;2-2-2,pi_flexform';
?>

Ergebnis: Es wird ein Flexform-Formular für eine Zugängliche Tabelle angezeigt. :o

Plugin Options:
Accessibility Table parsing
Table caption (<caption>)
Table summary ("summary" attribute in <table> tags)
Use table-footer (<tfoot> around last table row)
usw...

Meine Flexform-Definion aus der "/flexform.xml" wird also völlig ignoriert.

Wie kann ich das verhindern?

Ich habe schon tagelang alle Suchmaschinen rauf und runter gesucht. Und das Problem scheint wohl zu sein, dass Flexforms nicht mit Contentelementen vom Type CType zusammenarbeiten sondern nur mit list_type.

Für meinen Zweck brauche ich aber unbedingt eine Extension CType ("totally new content Element") + Flexform.

Wisst Ihr wie das zu bewerkstelligen ist?

Ich freue mich auf Euer Feedback!

Matthias

Seppo3 ·

Hallo m.z.
…diese Tabelle von der Du sprichst, wird auch nur unter Typo3 4.1.x angezeigt unter 4.2.x wird nur noch DEF:
The Title:
ausgegeben.
*Confused*
Viele Grüße Sepp

Isnej ·

Hallo, arbeite derzeit am gleichen Problem und habe es mittlerweile wohl im Griff:

Setzt in ext_tables.php folgendes zusätzlich ein:

$TCA['tt_content']['columns']['pi_flexform']['config']['ds'][','.$_EXTKEY.'_pi1'] = 'FILE:EXT:'.$_EXTKEY.'/flexform_ds.xml';

Damit wird Eure Flexform-Definition aus der XML Datei (hier: flexform_ds.xml) dem neuen CType aus Eurer Extension zugewiesen. Das Komma in [','.$_EXTKEY.'_pi1'] trennt den ersten Wert (hier ist der Wert einfach leer!), der die XML-Datei dem Feld "list_type" zuweisen , vom zweiten Wert (hier meine Extension). Dieser zweite Wert wird dem Feld "CType" zugewiesen.

Voraussetzung ist allerdings, das im $TCA das ds_pointerField auf list_type UND CType gesetzt ist:

$TCA['tt_content']['columns']['pi_flexform']['config']['ds_pointerField'] = 'list_type,CType';

Gruß
Isnej

speedprogs ·

Hallo Isnej,

deine Lösung ist super, allerdings ist sie erst seit TYPO3 4.2 möglich, da in den alten Versionen nicht auf mehrere Pointer geprüft wird, sondern immer EIN Pointer erwartet wird. Im PHP sieht das vereinfacht so aus:

function getFlexFormDS($conf,$row,$table,$fieldName='',$WSOL=TRUE,$newRecordPidValue=0) {
  
  ...
  
  $ds_pointerField = $conf['ds_pointerField'];
  $ds_array        = $conf['ds'];
  
  ...
  
  if ($ds_pointerField) {
    $srcPointer = $row[$ds_pointerField];
    $srcPointer = isset($ds_array[$srcPointer]) ? $srcPointer : 'default';
  } else {
    $srcPointer = 'default';
  }
  
  ...

  if (substr($ds_array[$srcPointer],0,5)=='FILE:') {
    $file = t3lib_div::getFileAbsFileName(substr($ds_array[$srcPointer],5));
    if ($file && @is_file($file)) {
      $dataStructArray = t3lib_div::xml2array(t3lib_div::getUrl($file));
    } else {
      $dataStructArray = 'The file "'.substr($ds_array[$srcPointer],5).'" in ds-array key "'.$srcPointer.'" was not found ("'.$file.'")';   // Error message.
    }
  } else {
    $dataStructArray = t3lib_div::xml2array($ds_array[$srcPointer]);
  }
  
  ...
  
}

Wichtig ist Zeile 11 "$srcPointer = $row[$ds_pointerField];". Wenn das Datenbankfeld, welches als "ds_pointerField" angegeben ist, nicht existiert, dann wird dem "$srcPointer" nicht der Name deiner Extension zugewiesen, welcher im Feld "CType" stehen würde, sondern der Wert "Default". Somit wird dein Flexform auch nicht geladen.

Man könnte diese Hürde überwinden, indem man als Pointer das Feld "CType" setzt und dem Schlüssel im DS-Array kein Komma voranstellt:

$TCA['tt_content']['columns']['pi_flexform']['config']['ds'][$_EXTKEY.'_pi1'] = 'FILE:EXT:'.$_EXTKEY.'/flexform_ds.xml';
$TCA['tt_content']['columns']['pi_flexform']['config']['ds_pointerField'] = 'CType';

Allerdings wird von TYPO3 vorausgesetzt, dass das Feld, welches die Flexform-Daten enthält auch vom Typ "flex" ist, was für das Feld "CType" nun mal leider nicht zutrifft.

Daher vielen Dank an das TYPO3-Core Team für die Implementierung der verbesserten Handhabung des "ds_pointerField".

Die einzig funktionierende Lösung für TYPO3 vor Version 4.2 ist ein eigenes Feld in der Tabelle "tt_content". Nennt es einfach "pi_flexform_CType" und gebt ihm folgende Konfiguration:

$myNewFleyField = array(
  'pi_flexform_CType' => array(
    'exclude' => 1,
    'label'   => 'LLL:EXT:cms/locallang_ttc.php:pi_flexform',
    'config'  => array(
      'type'     => 'flex',
      'ds'	 => array(
        'default'   => 'FILE:EXT:'.$_EXTKEY.'/flexform_ds.xml',
      )
    )
  )
);

Anschließend das neue Feld noch zum TCA hinzufügen und die Felder für eigene Datensätze konfigurieren:

t3lib_div::loadTCA('tt_content');
t3lib_extMgm::addTCAcolumns('tt_content', $myNewFleyField, 1);
$TCA['tt_content']['types'][$_EXTKEY.'_pi1']['showitem'] = 'CType;;4;button,hidden,1-1-1, header;;3;;2-2-2, linkToTop;;;;3-3-3, --div--;LLL:EXT:cms/locallang_ttc.xml:tabs.plugin,pi_flexform_CType;;;;1-1-1, --div--;LLL:EXT:cms/locallang_tca.xml:pages.tabs.access,starttime, endtime, cPos';

Hoffe das hilft allen, die Extensions auch für ältere TYPO3-Versionen verfügbar machen wollen.

Beste Grüße

m.​z.​ ·

Wow, nach gut einem Jahr doch noch eine Lösung.
Darum "liebe" ich dieses so aktive Forum. 😃

Ich werde die Lösung von speedprogs mal demnächst austesten; denke aber, der Thread kann nun auf gelößt gesetzt werden.

Danke an die fleißigen Autoren! 8-)

Matthias