Blog-Kategorien

Hat Ihnen dieser Beitrag gefallen?

t3n Social News ist ein offenes News- und Link-Portal rund um die Themenbereiche Open Source, Web 2.0, Webentwicklung, Apple, Linux und TYPO3.

 

Facebook

Gefällt Ihnen diese Seite? Dann teilen Sie das doch gleich ihren Facebook-Freunden mit.

Twitter

Folgen Sie Jürg Langhard, dem Inhaber und Geschäftsführer von GreenBanana GmbH, bei Twitter.

Flexform in Extension integrieren

Um Flexform in einer eigenen Extension zu verwenden, sind nur wenige Schritte von nöte. Hier ein kurzes, einfaches Tutorial:

Flexform aktivieren

In der Datei ext_tables.php folgende Zeilen implementieren:

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

Flexform aktivieren in einer Extension mit 'extbase'

$extensionName = t3lib_div::underscoredToUpperCamelCase($_EXTKEY);
$pluginSignature = strtolower($extensionName) . '_pi1';  
$TCA['tt_content']['types']['list']['subtypes_addlist'][$pluginSignature] = 'pi_flexform';
t3lib_extMgm::addPiFlexFormValue($pluginSignature, 'FILE:EXT:'.$_EXTKEY.'/Configuration/Flexforms/flexform_list.xml');    

XML erstellen

Im Rootverzeichnis der Extension das File flexform_ds_pi1.xml erfassen mit folgendem Inhalt:

<T3DataStructure>
    <sheets>
        <sheet1>
            <ROOT>
                <TCEforms>
                    <sheetTitle>Code</sheetTitle>
                </TCEforms>
                <type>array</type>
                <el>
                    *** Elemente ***
                </el>
            </ROOT>
        </sheet1>
        <sheet2>
            <ROOT>
                <TCEforms>
                    <sheetTitle>Settings</sheetTitle>
                </TCEforms>
                <type>array</type>
                <el>
                    *** Elemente ***
                </el>
            </ROOT>
        </sheet2>		
    </sheets>
</T3DataStructure>

Elemente

input

  <codesnipet>
    <TCEforms>
      <label>Code Snipet</label>
      <config>
        <type>text</type>
        <cols>30</cols>
        <rows>20</rows>
       </config>
     </TCEforms>
   </codesnipet>

select (statisch)

<language>
    <TCEforms>
        <label>Language</label>
		<config>
		 <type>select</type>
		 <items type="array">
		   <numIndex index="0" type="array">
		    <numIndex index="0">Plain</numIndex>
		    <numIndex index="1">plain</numIndex>
		   </numIndex>
		   <numIndex index="1" type="array">
		    <numIndex index="0">Bash</numIndex>
		    <numIndex index="1">bash</numIndex>
		    </numIndex>
		   <numIndex index="2" type="array">
		    <numIndex index="0">Cpp</numIndex>
		    <numIndex index="1">cpp</numIndex>
		   </numIndex>
		   <numIndex index="3" type="array">
		    <numIndex index="0">C-Sharp</numIndex>
		    <numIndex index="1">csharp</numIndex>
		   </numIndex>					   
		  </items>
		</config>
    </TCEforms>
</language>

select (aus foreign_table)

<language>
    <TCEforms>
        <label>Language</label>
		<config>
			<type>select</type>
			<foreign_table>my_table</foreign_table>
			<minitems>1</minitems>
			<maxitems>10</maxitems>
			<multiple>1</multiple>
			<size>5</size>
			<autoSizeMax>10</autoSizeMax>
			<itemListStyle>Width:250px</itemListStyle>
		</config>
    </TCEforms>
</language>

Werte im Frontend verwenden

Variante mit $this->lConf[]

Durch das Einbinden der init()-Funktion kann über $this->lConf[] direkt auf die Werte in der Flexform zugegriffen werden. In diesem Beispiel wird auf die "codesnipet" zugegriffen.

Alternative Methode

Durch den Aufruf der vererbten Methode "pi_getFFvalue" lassen sich Flexform-Parameter auch ohne "init()"-Methode aufrufen. Eine Anleitung finden Sie [hier]

/**
 * initializes the flexform and all config options ;-)
 */
function init(){
    $this->pi_initPIflexForm(); // Init and get the flexform data of the plugin
    $this->lConf = array(); // Setup our storage array...
    // Assign the flexform data to a local variable for easier access
    $piFlexForm = $this->cObj->data['pi_flexform'];

    // Traverse the entire array based on the language...
    // and assign each configuration option to $this->lConf array...
    foreach ( $piFlexForm['data'] as $sheet => $data ) {
        foreach ( $data as $lang => $value ) {
            foreach ( $value as $key => $val ) {
                $this->lConf[$key] = $this->pi_getFFvalue($piFlexForm, $key, $sheet);
            }
        }
    }
}
		
/**
* The main method of the PlugIn
*
* @param string  $content: The PlugIn content
* @param array  $conf: The PlugIn configuration
* @return The content that is displayed on the website
*/
function main($content, $conf) {
	$this->conf = $conf;
	$this->pi_setPiVarDefaults();
	$this->pi_loadLL();
	 
	$this->init();
	$content = $this->lConf['codesnipet'];
	 
	return $this->pi_wrapInBaseClass($content);
}

Achtung: Ohne die Initialisierung der Methode init() in der Zeile 33 wird die FlexForm nicht ausgelesen.

Kommentare

#1 Torsten.E schrieb am 03.12.2009 14:32

Super, ohne diese Anleitung hätte ich das nie geschaft.

 

DANKE

 

Torsten.E

# Stefan schrieb am 03.12.2009 14:32

Super! Klappt soweit gut! Danke schön!

Aber wie muss ich es anstellen, damit das Flexform in meiner eigenen Tabelle abspeichert und nicht in tt_content?

# Hauke schrieb am 03.12.2009 14:32

Wirklich sehr hilfreich.

Ich habe nur ewig dran gesessen herauszufinden, dass ich den Konfigurationscache leeren muss, damit eine Änderung sichtbar wird...

# Michael Finkenthei schrieb am 03.12.2009 14:32

Hallo allerseits,

 

erstmal vielen Dank für die elegante Kurzfassung des Tutorials unter wiki.typo3.org/index.php/Extension_Development%2C_using_Flexforms - soweit, so verständlich.

 

Ich komme bisher auf diesem Wege soweit, dass ich im Backend, wo ich das Modul konfigurieren kann, das entsprechende Flexform mit einem Reiter "Options" und dem Feld "Bereich" sehen kann, wo ich mich dann zwischen Autos und Motorrad entscheiden kann. Allerdings hätte ich genau diese Entscheidungsmöglichkeit gerne im Frontend auf einem "normalen" html-Formular. Dafür möchte ich einfach nur aus dem Flexform die entsprechenden Optionenn und Werte auslesen und einen Marker mit den nötigen html füllen.

 

Allerdings ist bei mir, nachdem ich

 

$this->pi_initPIflexForm();

 

einbinde, $this->cObj->data['pi_flexform'] zwar vorhanden, aber eindeutig leer, wenn ich es mit print_r ausgeben lasse.

 

Der Vollständigkeit halber sollte ich dabei die entsprechenden Teile aus meiner ext_tables.php zitieren:

 

$TCA['tt_content']['types']['list']['subtypes_addlist'][$_EXTKEY.'_pi2']='pi_flexform';

t3lib_extMgm::addPiFlexFormValue($_EXTKEY.'_pi2', 'FILE:'.t3lib_extMgm::extPath($_EXTKEY).'flexform_amo.xml');

$TCA['tt_content']['types'][$_EXTKEY.'_pi2']['showitem']='CType;;4;button;1-1-1,header;;3;;2-2-2,pi_flexform;;;;1-1-1';

 

Schöner bekomm ich das jetzt hier nicht dargestellt. Evtl. hat ja jemand eine Idee dazu? Mein Dank würde ihn auf ewig riechenden Socken verfolgen. Redface

# Martin schrieb am 03.12.2009 14:32

Ich bin fast verrückt geworden, es hat bei mir nicht funktioniert. Ich hab vorher noch nie mit Flexforms gearbeitet ...

 

Anmerkungen:

In PHP5 funktioniert der XML-Parser anders als in PHP4. Dort werden Kommentare in XML mit '<-- -->' (wie in html)gekennzeichnet. Ich bekam für die PHP-Kommentare '//'(2 Backslashes) ständig illegal charakters angezeigt.

 

Fürs Nutzen und Auslesen der Werte muss man in der Datei ext_tables.php lediglich die Zeilen "$this->pi_initPIflexForm();" und "$aktuellerWert = $this->pi_getFFvalue($this->cObj->data['pi_flexform'], 'bereich', 'sDEF');" eintragen.

# Sebastian Golasch schrieb am 03.12.2009 14:32

Vielen Dank für dieses mini Tutorial, es ist exakt das, wonach ich mir einen halben tag die Finger blutig gesucht habe.

 

Sehr verständlich & dank den beispielen auch sehr gut für die eigenen Bedürfnisse anzupassen.

 

Also abschließend nochmals Vielen Dank, das hat mir heute echt meinen Feierabend gerettet

Big Grins

# Manollo schrieb am 03.12.2009 14:32

Cuule sache! Gratulation zur einfachen beschreibung für t3 extensions!

 

habe noch ein kleines verständnisproblem... und zwar sind die schritte oben alle einleuchtend. nur... wie sieht es mit den schritten davor aus? wie komme ich zu diesem resultat? der kickstarter ist natürlich installiert...und extensions habe ich mittels kickstarter auch schon erstellt... aber die konfiguration in den einzelnen sites scheint für mich noch ein Rätsel... be-plugin?fe-plugin? oder was ist das? vielen dank für allfällige hilfestellung/inputs.

 

freundliche Grüsse

Manuel Thaler

einen Kommentar schreiben
Wenn Sie das Wort nicht lesen können, bitte hier klicken.
CAPTCHA Bild zum Spamschutz


Blog Netiquette

Dieses Blog ist eine offene Dialog-Plattform, auf der Mitarbeiter von GreenBanana Beiträge veröffentlichen.

Umgangston im Blog vom GreenBanana

  • Behandeln Sie andere hier im Blog immer so, wie Sie selbst behandelt werden möchten.
  • Jeder hat eine eigene Meinung und das Recht seine Meinung hier kundzutun. Sachliche Diskussionen, auch eine gesunde Streitkultur ist bei kritischen Themen wünschenswert. «Hart, aber fair», lautet die Devise hier im Blog.
  • In diesem Blog haben persönliche Angriffe, übertriebener Sarkasmus, Beleidigungen oder Beschimpfungen nichts zu suchen. 
  • Die Blog-Kommentarfunktion soll somit eine sachliche Diskussion ermöglichen. Um dies zu gewährleisten, behalten wir uns auch vor, Kommentare zu löschen, die einer Diskussion nicht dienlich sind und die sich nicht auf die Beiträge beziehen. Es besteht kein Anspruch auf Veröffentlichung.

Wir löschen bzw. sperren Kommentare bei:

  • Aufforderungen zu Gewalt gegen Personen, Institutionen oder Unternehmen
  • Pornografie
  • Missbrauch als Werbefläche für Webseiten oder Dienste
  • Rassismus und Hasspropaganda
  • Beleidigungen, Verletzungen, persönliche Angriffe oder Entwürdigungen von Personen oder Firmen in jeglicher Form.
  • Aufruf zu Demonstrationen und Kundgebungen jeglicher politischer Richtung
  • Kommentare, die sich nicht auf den kommentierten Beitrag beziehen

Ausschlussklausel für Haftung
Die Kommentare zu unseren Beiträgen spiegeln allein die Meinung einzelner Leser wider. Für die Richtigkeit und Vollständigkeit der Inhalte übernimmt GreenBanana keinerlei Gewähr.