Erweiterung des Model

In diesem Kapitel lernen Sie, wie Sie im Model und der Datenbank neue Felder zu bestehenden Models hinzufügen können.

Die Erweiterung ermöglicht die dynamische Überschreibung der Basismodels Entry, Category und Demand ohne dass diese über Vererbung erweitert werden. Dafür wird eine Proxy-Klasse unter Verwendung des TYPO3 Caching Frameworks im Ordner typo3temp/Cache/Code/bzga_beratungsstellensuche abgespeichert. Es ist wichtig zu wissen, dass dieses Konzept existiert.

Warnung

Dieses Konzept hat folgende Nachteile:

  • Benutzen Sie keine use statements am Anfang der Datei. Diese werden ignoriert!
  • Es ist nicht möglich eine bestehende Methode zu überschreiben.

1) Neue Felder hinzufügen

Der Extension-Key in diesem Beispiel lautet: bzga_beratungsstellensuche_extended.

Bemerkung

Wir gehen in diesem Beispiel davon aus, dass Sie die grundlegenden Kenntnisse zur Erstellung einer TYPO3-Erweiterung besitzen.

Es werden grundsätzlich 2 Dateien benötigt.

SQL

Erstellen Sie die Datei ext_tables.sql im Root-Verzeichnis Ihrer Erweiterung mit folgendem Inhalt:

#
# Table structure for table 'tx_bzgaberatungsstellensuche_domain_model_entry'
#
CREATE TABLE tx_bzgaberatungsstellensuche_domain_model_entry (
        alternative_email varchar(255) DEFAULT '' NOT NULL,
);

TCA

Erstellen Sie eine Datei namens tx_bzgaberatungsstellensuche_domain_model_entry.php im Ordner Configuration/TCA/Overrides/.

<?php
defined('TYPO3_MODE') or die();

$fields = array(
        'alternative_email' => array(
                'exclude' => 1,
                'label' => 'Alternative E-Mail Adresse',
                'config' => array(
                        'type' => 'input',
                        'size' => 30,
                        'eval' => 'trim',
                        'wizards' => array(
                                '_PADDING' => 2,
                                'link' => array(
                                        'type' => 'popup',
                                        'title' => 'LLL:EXT:cms/locallang_ttc.xlf:header_link_formlabel',
                                        'icon' => 'link_popup.gif',
                                        'module' => array(
                                                'name' => 'wizard_element_browser',
                                                'urlParameters' => array(
                                                        'mode' => 'wizard'
                                                )
                                        ),
                                        'JSopenParams' => 'height=600,width=800,status=0,menubar=0,scrollbars=1'
                                )
                        ),
                ),
        )
);

\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTCAcolumns('tx_bzgaberatungsstellensuche_domain_model_entry', $fields);
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addToAllTCAtypes('tx_bzgaberatungsstellensuche_domain_model_entry', 'alternative_email');

2) Klasse registrieren

Damit die Erweiterung bzga_beratungsstellensuche Kenntnis über Ihre Erweiterung hat, erstellen Sie bitte im Ordner Configuration/DomainModelExtension eine Datei namens BzgaBeratungsstellensuche.txt mit folgendem Inhalt:

Domain/Model/Entry

Eigene Klasse

Erstellen Sie nun eine Datei typo3conf/ext/bzga_beratungsstellensuche_extended/Classes/Domain/Model/Entry.php.

<?php

namespace Bzga\BzgaBeratungsstellensucheExtended\Domain\Model;

/**
 * Entry
 */
class Entry extends \Bzga\BzgaBeratungsstellensuche\Domain\Model\Entry {

        /**
         * @var string
         */
        protected $alternativeEmail;

        /**
         * @return string
         */
        public function getAlternativeEmail()
        {
                return $this->alternativeEmail;
        }

        /**
         * @param string $alternativeEmail
         */
        public function setAlternativeEmail($alternativeEmail)
        {
                $this->alternativeEmail = $alternativeEmail;
        }
}

Clear system cache

Jetzt müssen Sie nur noch den system cache leeren. Danach können Sie überall auf dieses Feld zurückgreifen.

Hinweis

In den meisten Fällen wird die Anforderung doch etwas komplexer sein. Sollten Sie nicht weiterkommen, stellen wir Ihnen gerne eine Erweiterung zu Anschauungszwecken zur Verfügung.

XML-Importer

Möchten Sie das neue Feld aus dem obigen Beispiel aus dem XML auslesen und in der Datenbank abspeichern, müssen Sie in unserem Beispiel noch einen Slot erstellen.

Hinweis

Zum Thema Slots schauen Sie auch hier: Signals.

Zunächst registrieren Sie den Slot für das entsprechende Signal in der ext_localconf.php

<?php

// Extend name converter
$signalSlotDispatcher->connect(
        \Bzga\BzgaBeratungsstellensuche\Domain\Serializer\NameConverter\EntryNameConverter::class,
        \Bzga\BzgaBeratungsstellensuche\Events::SIGNAL_MapNames,
        \YOUR_VENDOR\YOUR_EXTKEY\Slots\EntryNameConverter::class,
        'mapNames'
);

Jetzt müssen Sie noch die dazugehörige Slot-Klasse schreiben:

<?php
namespace YOUR_VENDOR\YOUR_EXTKEY\Slots;

class EntryNameConverter
{

        /**
        * @param array $mapNames
        * @return array
        */
        public function mapNames(array $mapNames = array())
        {
                $mapNames = array_merge($mapNames, array(
                        'alt_email' => 'alternative_email',
                ));

                return array(
                        'extendedMapNames' => $mapNames,
                );
        }
}

Hinweis

In diesem Beispiel enthält das XML im Knoten entry einen weiteren Unterknoten mit der Bezeichnung alt_email und wird dem neuen Feld alternative_email zugeordnet. Der restliche Ablauf ist Magie.