Erstellen einer Extension

Hinweis: hier bin ich aktuell am arbeiten, dieser Artikel ist noch unvollständig. Leider - oder zum Glück - sind momentan zu viele Projekte am laufen, so dass die Arbeit hier wieder etwas stagniert.

Vorgehen

Zunächst das Grundgerüst mit dem extbase_kickstarter erstellen und die erste Tabelle im kickstarter modellieren (damit die Verzeichnisstruktur schon mal angelegt wird). Dann speichern und im Extension Manager die neu angelegte Extension aktivieren. Dann kann das Domänenmodell im Kickstarter ausgebaut werden und bei jedem Speichern werden die benötigten Dateien generiert.

Domain Model

User

Entity User anlegen und Is aggregate root setzen. Dann müsste man alle User nochmal anlegen.

mapping

Um hier die fe_users tabelle zu verwenden folgendes in ein TS Template (später dann in Configuration/TypoScript/setup.txt - aber das wird zunächst noch vom Kickstarter überschrieben):

# Rsys Coop
config.tx_extbase.persistence.classes {
    Tx_Rsyscoop_Domain_Model_User {
        mapping {
            tableName = fe_users
        }
    }
}

Es wird dann zwar eine Tabelle tx_rsyscoop_domain_model_user (vom Kickstarter) angelegt aber diese wird nicht verwendet. Stattdessen wird die fe_users tabelle verwendet. Man muss in der Domäne jedoch alle benötigten Felder anlegen (d.h. Properties mit den Feldnamen der fe_users Tabelle).

Eigene Felder ergänzen

Für Felder die nicht in der fe_users sind muss man noch zusätzlich die TCA setzen in ext_tables.php:

Achtung: Dies wird vom Kickstarter wieder überschrieben, muss also zuletzt nochmal eingefügt werden. Ich habe es bis dahin in die typo3conf/ext_tables.php geschrieben.

t3lib_div::loadTCA('fe_users');

$tempColumns = array(
    'comments' => array(
        'exclude' => 0,
        'label'   => 'LLL:EXT:rsyscoop/Resources/Private/Language/locallang_db.xml:tx_rsyscoop_domain_model_user.comments',
        'config'  => array(
            'type' => 'input',
            'size' => 30,
            'eval' => 'trim'
        )
    ),
    'rsyscoop_agb' => array(
        'exclude' => 0,
        'label'   => 'LLL:EXT:rsyscoop/Resources/Private/Language/locallang_db.xml:tx_rsyscoop_domain_model_user.rsyscoop_agb',
        'config'  => array(
            'type' => 'check',
            'default' => 0
        )
    ),
    'role' => array(
        'exclude' => 0,
        'label'   => 'LLL:EXT:rsyscoop/Resources/Private/Language/locallang_db.xml:tx_rsyscoop_domain_model_user.role',
        'config'  => array(
            'type' => 'inline',
            'foreign_table' => 'tx_rsyscoop_domain_model_role',
            'minitems' => 0,
            'maxitems' => 1,
            'appearance' => array(
                'collapse' => 0,
                'newRecordLinkPosition' => 'bottom',
            ),
        )
    )
);
t3lib_extMgm::addTCAcolumns('fe_users', $tempColumns, 1);

t3lib_extMgm::addToAllTCAtypes('fe_users', 'comments');
$TCA['fe_users']['ctrl']['type'] = 'comments';

t3lib_extMgm::addToAllTCAtypes('fe_users', 'rsyscoop_agb');
$TCA['fe_users']['ctrl']['type'] = 'rsyscoop_agb';

t3lib_extMgm::addToAllTCAtypes('fe_users', 'role');
$TCA['fe_users']['ctrl']['type'] = 'role';

Und damit die Felder in der Datenbank angelegt werden, muss man noch die ext_tables.sql ergänzen.

Achtung: Dies wird vom Kickstarter wieder überschrieben, muss also zuletzt nochmal eingefügt werden.

CREATE TABLE fe_users (
    comments tinytext,
    rsyscoop_agb tinyint(1) unsigned DEFAULT '0' NOT NULL,
    role int(11) unsigned DEFAULT '0',
);

Role

Ein Value Object namens Role anlegen und eine Relation zu User herstellen.

 

Hier gibt es noch Probleme: Beim Editieren der Role wird ein Fehler ausgelöst:

#1249479819: The "modified object" is does not have an existing counterpart in this repository. 

Lösung habe ich hierfür noch keine - nur einen Workaround: wenn es eine Entity ist tritt das Problem nicht auf, also habe ich es eben zu einer solchen gemacht.

Controller

Scaffolding

Über der Klasse des Controllers steht folgendes:

// TODO: As your extension matures, you should use Tx_Extbase_MVC_Controller_ActionController as base class, instead of the ScaffoldingController used below.

Das heisst zunächst werden die actions index, show, new, create, edit, update, delete geerbt von ScaffoldingController. Wenn man später im Kickstarter Convert Dynamic to Static Scaffolding wählt, wird die Klasse ersetzt mit Tx_Extbase_MVC_Controller_ActionController und die Actions werden in den Code der Klasse generiert - sowie alle weiteren Dateien des Models und die Templates.

Plugin

Ein Plugin auf der Seite plazieren.

Achtung: Nach Änderung der von Tx_Extbase_Utility_Extension::configurePlugin in der ext_localconf.php muss dass Plugin gelöscht und neu eingefügt werden - sonst erkennt es den Controller nicht.

Controller Auswahl per Flexform

Um den Controller per Flexform im Plugin auswählen zu können, folgendes in ext_tables.php:

$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/ControllerActions.xml'); 

Achtung: Dies wird vom Kickstarter wieder überschrieben, muss also zuletzt nochmal eingefügt werden. Ich habe es bis dahin in die typo3conf/ext_tables.php geschrieben.

Die Datei /Configuration/FlexForms/ControllerActions.xml enthält dann folgendes:

<T3DataStructure>
  <sheets>
  <sDEF>
     <ROOT>
      <TCEforms>
      <sheetTitle>Verhalten</sheetTitle>
      </TCEforms>
      <type>array</type>
      <el>
      <switchableControllerActions>
         <TCEforms>
          <label>Standardaktion des Plugins</label>
          <config>
          <type>select</type>
          <items>
            <numIndex index="0">
               <numIndex index="0">User</numIndex>
               <numIndex index="1">User->index;User->show;User->new;User->create;User->edit;User->update;User->delete</numIndex>

            </numIndex>
            <numIndex index="1">
               <numIndex index="0">Rolle</numIndex>
               <numIndex index="1">Role->index;Role->show;Role->new;Role->create;Role->edit;Role->update;Role->delete</numIndex>

            </numIndex>
            </items>
          </config>
         </TCEforms>
      </switchableControllerActions>
      </el>
     </ROOT>
  </sDEF>
  </sheets>
</T3DataStructure>

Es müssen alle Actions aufgelistet werden. Falls nur eine action da steht wird immer diese Action ausgeführt (und es geht z.B. das Editieren dann nicht mehr).

Templates

Solange man am modellieren ist, werden die templates auch noch vom Kickstarter gestellt. Später werden sie dann im Ordner Resources/Private/Templates/ generiert und man kann sie anpassen.

Convert Dynamic to Static Scaffolding

Das hat bei mir nicht funktioniert - Grund war, dass ich symbolische Links verwende für meine Extensions um sie alle in einer location zu haben von wo aus ich mit SVN arbeite. Also musste ich leider die Extension direkt im ext Verzeichnis anlegen.

Wichtig: Schreibrechte für alle Files vergeben, sonst wird ohne Fehlermeldung nichts generiert.

 

Erstellt: 09/2010| Geändert: 10/2015