Extbase - Zugriff auf die fe user Tabelle
http://www.derhansen.de/2012/06/zugriff-auf-frontend-user-tabelle-aus.html
http://www.derhansen.de/2012/12/typo3-extbase-mapping-existing-fields.html
Einleitung
Wie kriege ich die Daten
Wir möchten die Daten der fe_users Tabelle, also die Frontenduser in unserer eigenen Extension verwenden. Extbase hat ein eigenes Domain Model und ein eigenes Repository vorbereitet um auf die Standard Felder der fe_users Tabelle zuzugreifen. Das bedeutet man kann die Daten einfach nutzen, wenn man sein eigenes Model erweitert. Ich brauche keine Getter und Setter Methoden etc. mehr. Zu definieren.
fe_users extended
Allerdings wird gerade die Tabelle fe_users oftmals von anderen Extensions um weitere Felder erweitert (z.B. sr_feuser_register). Diese Felder sind natürlich nicht im Model von extbase enthalten. Deshalb muß man sie nochmal separat behandeln. Man erweitert einfach sein eigenes Datenmodell um diese Felder. So funktioniert das ganze.
Zu guter letzt möchten wir vielleicht auch noch die fe_users um eigene Felder erweitern.
Hinweise
- Nicht verwechseln: $user=$GLOBALS['TSFE']->fe_user->user; gibt den aktuell angemeldeten User zurück.
- findAll() soll laut einem Forumseintrag nicht funktionieren. $user = $this->userRepository->findByUid($uid); schon.
Beispiel 1: Einfacher Zugriff auf fe_users Daten in eigener Extension
Wenn man einfach nur ein paar Daten aus fe_users braucht, kann man das Standard Repository einfach injecten.
Übersicht
- fe_users-Repository per Dependency Injection zu Verfügung stellen
- Auslesen der Userdaten
- Mapping beachten
fe_user Tabelle Injecten
Im Controller deiner Extension Ab 6.0
/**
* @var \TYPO3\CMS\Extbase\Domain\Repository\FrontendUserRepository
* @inject
*/
protected $frontendUserRepository;
Old School (<4.7)
/**
* @var Tx_Extbase_Domain_Repository_FrontendUserRepository
*/
protected $userRepository;
/**
* Inject the user repository
*
* @param Tx_Extbase_Domain_Repository_FrontendUserRepository $userRepository
* @return void
*/
public function injectFrontendUserRepository(Tx_Extbase_Domain_Repository_FrontendUserRepository $userRepository) {
$this->userRepository = $userRepository;
}
Userdaten holen
Z.B. im Controller:
$user = $this->userRepository->findByUid($uid);
Problem: User werden nicht ausgegeben weil record type nicht gesetzt ist
Hinweis: In neueren Versionen von Extbase ist das Mapping anders definiert -> nur bei alten Versionen wichtig (nicht verifiziert)
Achtung: Extbase erweitert die fe_users und fe_groups um das Feld tx_extbase_type (Record Type) Ist dies nicht vorhanden gibt es nichts zurück. Im TypoScript definiert Extbase
config.tx_extbase.persistence.classes {
Tx_Extbase_Domain_Model_FrontendUser {
mapping.recordType = Tx_Extbase_Domain_Model_FrontendUser
}
}
Im Mapping ist der recordType gesetzt d.h. es sucht nur fe_user mit dem recordType Tx_Extbase_Domain_Model_FrontendUser
Lösung:
- Recordtype setzen
- oder Mapping löschen
config.tx_extbase.persistence.classes {
Tx_Extbase_Domain_Model_FrontendUser {
mapping.recordType >
}
}
- zusätzlich evtl. Recordtype automatisch vorbelegen -> im PageTS
TCAdefaults.fe_users.tx_extbase_type = Tx_Extbase_Domain_Model_FrontendUser TCAdefaults.fe_groups.tx_extbase_type = Tx_Extbase_Domain_Model_FrontendUserGroup
Beispiel 2: FE User durch erweitern von Extbase in eigener Extension nutzen
Siehe auch http://www.derhansen.de/2012/12/typo3-extbase-mapping-existing-fields.html (2015-06) dort wird noch die alte Schreibweise statt der Namespace Schreibweise genutzt.
Model für die fe_user
In der eigenen Extension zuerst ein Model anlegen. Normalerweise wird dazu Abstract Entity erweitert. Wir erweitern diesmal das bereits von Extbase angelegte Model, somit haben wir dessen Eigenschaften bereits (kann man schön in der extbase extension im Quelltext sehen.)
class RmaUser extends TYPO3\CMS\Extbase\Domain\Model\FrontendUser {
}
Repository für die fe_user
Auch hier erweitern wir das bereits vorhandene Repository. Also statt \TYPO3\CMS\Extbase\Persistence\Repository zu erweitern. Nehmen wir:
class RmaUser extends TYPO3\CMS\Extbase\Domain\Model\FrontendUser {
}
Mapping für die fe_user
Wir haben in unserer Extension jetzt das Datenmodell und die Datenrepository also das Behältnis. Extbase weiß aber noch nicht welche Tabelle es nehmen soll, wenn eine Anfrage unserer Extension kommt. Deshalb mappen wir unser Model auf die Tabelle fe_user. Das erledigen wir mit TypoScript:
config.tx_extbase.persistence.classes {
Geobit/Gbrma/Domain/Model/RmaUser {
mapping {
tableName = fe_users
}
}
}
Erweiterte Felder der fe_users nutzen
ToDo
- Im Prinzip einfach getter und setter im Model definieren
Eigene Felder erweitern
Todo