Extbase - Zugriff auf die fe user Tabelle

Aus Wikizone
Wechseln zu: Navigation, Suche

http://wiki.zone30.info/wikizone/index.php/Extbase_Extensions_-_Snippets_und_Glossar#Auf_Daten_andererer_Modelle_.2F_Repositorys_im_Controller_zugreifen._.28verkn.C3.BCpfte_Daten_auflisten.29

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

Übersicht

  1. fe_users-Repository per Dependency Injection zu Verfügung stellen
  2. Auslesen der Userdaten

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. Lösung s.u.

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

$user = $this->userRepository->findByUid($uid);

Problem: User werden nicht ausgegeben weil record type nicht gesetzt ist

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 erwartet das bei einem fe_users Eintrag dieser Wert geetzt ist.

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
        }
    }
}