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

  1. fe_users-Repository per Dependency Injection zu Verfügung stellen
  2. Auslesen der Userdaten
  3. 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: FE User in eigener Extension speichern

Am Beispiel der Extension gbrma. Der aktuell angemeldete User soll im Feld rma_user gespeichert werden. Dieses gehört zum Model 'Rma'

Vorgehen

  • Feld in ext_tables.sql anlegen -> Datenbank
  • Feld in TCA anlegen -> Backend
  • Feld in Model anlegen und Controller bearbeiten:
    • mit Getter und Setter ergänzen-> Extbase Handling
    • aktuell angemeldeter User abfragen
    • User speichern (in create Action)
  • Templates anpassen (wird hier nicht gezeigt)

ext_tables.sql

...
rma_user int(11) unsigned DEFAULT '0' NOT NULL,
...

TCA

Configuration/TCA/Rma.php

...
		'rma_user' => array(
			'exclude' => 1,
			'label' => 'LLL:EXT:gbrma/Resources/Private/Language/locallang_db.xlf:tx_gbrma_domain_model_rna.rma_user',
			'config' => array(
				'type' => 'select',
				'items' => array (
					array('',0),
				),
				'foreign_table' => 'fe_users',
				'foreign_class' => '\TYPO3\CMS\Extbase\Domain\Model\FrontendUser',
				'minitems' => 0,
				'maxitems' => 1,
				'size' => 1,
				'appearance' => array(
					'collapseAll' => 0,
					'levelLinksPosition' => 'top',
					'showSynchronizationLink' => 1,
					'showPossibleLocalizationRecords' => 1,
					'showAllLocalizationLink' => 1
				),
			),
		),
...

Model

Geobit\Gbrma\Domain\Model Rma.php

...
	/**
	 * rmaUser
	 *
	 * @var integer
	 */
	protected $rmaUser = 0;

...
	/**
	 * Returns the rmaUser
	 *
	 * @return integer $rmaUser
	 */
	public function getRmaUser() {
		return $this->rmaUser;
	}

	/**
	 * Sets the rmaUser
	 *
	 * @param integer $rmaUser
	 * @return void
	 */
	public function setRmaUser($rmaUser) {
		$this->rmaUser = $rmaUser;
	}
...

Controller

FrontendUser Repository bereitstellen (wir erweitern das von Extbase vorbereitete FrontendUser Repository, damit stehen uns dessen Objekte zur Verfügung:

Geobit\Gbrma\Controller RmaController.php

...
	/**
	* FrontendUser Repository
	*
	* @var \TYPO3\CMS\Extbase\Domain\Repository\FrontendUserRepository
	* @inject
	*/
	protected $userRepository;
...

Testen ob die fe_user jetzt zur Verfügung stehen kann man das z.B. in der List Action:

		$user = $this->userRepository->findByUid(1);
		print \TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump( $user );

Achtung: findAll() geht nicht !

Jetzt wollen beim anlegen eines Datensatzes den aktuell angemeldeten User hinterlegen.


Auch in der Listenansicht möchten wir nur die Datensätze des aktuellen Users anzeige.

Beispiel: Erweitern der fe_user um eigene Felder

FE-users um eigene Felder erweitern (http://t3-developer.com/extbase-fluid/cheats-extbase/model/verwendung-der-fe-users-in-extbase/ 2015-06)

Soll die Tabelle FE-Users um eigene Felder erweitert werden, sind folgende Dateien anzupassen:

MeineExtension/extension_tables.sql -> SQL Anweisung um die Tabellle FE-Users in der Datenbank um eigene Felder zu ergänzen • MeineExtension/extension_tables.php -> Neue Felder im Backend verfügbar machen • MeineExtension/Configuration/TypoScript/setup.txt -> Mapping der eigenen Tabellenfelder für Extbase • MeineExtension/Classes/Domain/Model/MeinFeUserModel.php -> Objekte initialisieren und Setter/Getter setzen

In den nachfolgenden Beispiellistings wird die fe-users Tabelle um ein Textfeld "Meinfeld" ergänzt.

Datei: MeineExtension/extension_tables.sql

CREATE TABLE fe_users {
    mein_feld varchar(255) DEFAULT '' NOT NULL,
};

Datei: MeineExtension/ext_tables.php

...
//**************************************************//
// USER | Erweiterung fe_users um Feld MeinFeld
//**************************************************//
t3lib_div::loadTCA('fe_users');
$addColumnArray = array(
    'mein_feld' => array(
        'exclude' => 0,
        'label' => 'Feldbeschriftung:',
        'config' => array(
        'type' => 'input',
        'size' => 20,
        'eval' => 'trim',
        )
    ),
);
t3lib_extMgm::addTCAcolumns('fe_users', $addColumnArray);
t3lib_extMgm::addToAllTCAtypes('fe_users', '--div--;NeuerReiter , mein_feld');

Beispiel: 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.

Wenn wir von anderen Extension erweiterte Felder aus fe_users nutzen, oder Felder selbst erweitern wollen, können wir nciht wie oben vorgehen und direkt in den Controller injecten. Wir müssen wir für unsere User in unserer Extension ein eigenes Model und ein eigenes Repository einbauen. Und dieses injectn. Zum Glück ist in Extbase für fe_users einiges bereitgestellt, das wir durch erweitern direkt übernehmen können.

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

Fallstricke

Extbase Model ab 6.0

TYPO3\CMS\Extbase\Domain\Model\FrontendUser

Im Seiten TS der Rootseite habe ich folgenden Eintrag: TCAdefaults.fe_users.tx_extbase_type = TYPO3\CMS\Extbase\Domain\Model\FrontendUser TCAdefaults.fe_groups.tx_extbase_type = TYPO3\CMS\Extbase\Domain\Model\FrontendUserGroup

FE-User müssen einer Gruppe zugeordnet sein