TYPO3-Version: 6.2.3
In diesem Beispiel wird die Pages-Tabelle ausgelesen.
Der Inhalt in spitzen Klammer ('<>') muss entsprechend ersetzt werden.
1. in der setup.txt folgende Zeilen hinzufügen
plugin.tx_<extkey> {
persistence {
storagePid = 2
classes {
<Vendor>\<Extkey>\Domain\Model\Page {
mapping {
tableName = pages
}
}
}
}
}
2. Das Model anlegen
namespace <Vendor>\<Extkey>\Domain\Model;
/**
* Class Page
* @package <Vendor>\<Extkey>\Domain\Model
*/
class Page extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity {
/**
* @var string
*/
protected $title;
/**
* @var string
*/
protected $subtitle;
public function getTitle() {
return $this->title;
}
public function getSubtitle() {
return $this->subtitle;
}
}
WICHTIG: Die Annotations bei den Eigenschaften.
3. Das Repository
namespace <Vendor>\<Extkey>\Domain\Repository;
/**
* Class PageRepository
*
* @package <Vendor>\<Extkey>\Domain\Repository
*/
class PageRepository extends \TYPO3\CMS\Extbase\Persistence\Repository {
public function findPages() {
$query = $this->createQuery();
// $query->getQuerySettings()->setRespectStoragePage(FALSE);
return $query->execute();
}
}
Würden die Kommentarzeichen in Zeile 2 der Fkt. entfernt werden, würden alle Tabellenzeilen (nicht nur unterhalb von id = 2 - in setup.txt festgelegt) gelesen werden.
Vielen Dank an Herrn Lobacher.
Zusatz:
1. Die Extension muss als statisches Templates der Seite hinzugefügt werden!
Dazu folgende Zeile am Ende der Datei ext_tables.php hinzufügen:
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addStaticFile($_EXTKEY, 'Configuration/TypoScript', '<Dieser Name erscheint dann im Backend>');
2. Es muss keine zusätzliche Tabelle angelegt werden !
Falls eine Fehlermeldung kommt: Table 'typo3.tx_<extkey>_domain_model_page' doesn't exist, wurde warscheinlich die Extension nicht als statisches Template (s. 1.) hinzugefügt.
Im Anhang ist das funktionierende Plugin 'efempty', das an den beschriebenen Stellen angepasst wurde um auf die Pages-Tabelle zuzugreifen.
Hallo getit,
was ist den wenn ich mehrere Models hab - in meinem Fall nn_address - deren Daten ich in meiner Extension haben will.
Im Fall von nn_address:
Person
Phone
Address
Email
...
Muss ich das über subclasses in TS lösen?
Ich habs irgendwie noch nicht hingekriegt?
Gruß
Eduard
So hallo,
ich bins jetzt noch einmal.
Da mir die Anleitung da oben gerade recht kam, weil ich das seit Tagen probieren, hab
ich mich einfach noch einmal drangesetzt und nach der Anleitung probiert ganz simpel von meiner Extension auf die tabelle "tx_nnaddress_domain_model_person" zu mappen.
Außerdem hab ich mir noch die angehängte efempty angesehen und alles entfernt was wohl augenscheinlich nicht nötig ist. Leider ohne Erfolg. Hier jetzt mal die wichtigsten Schnippsel meiner Extension in der Hoffnung, dass vielleicht irgendjemand einen Fehler endeckt.
TS-Setup:
plugin.tx_wuwwaddressmap {
view {
templateRootPath = {$plugin.tx_wuwwaddressmap.view.templateRootPath}
partialRootPath = {$plugin.tx_wuwwaddressmap.view.partialRootPath}
layoutRootPath = {$plugin.tx_wuwwaddressmap.view.layoutRootPath}
}
persistence {
storagePid = {$plugin.tx_wuwwaddressmap.persistence.storagePid}
classes {
WUWW\Wuwwaddressmap\Domain\Model\Location{
#Tx_Wuwwaddressmap_Domain_Model_Location{
mapping {
tableName = tx_nnaddress_domain_model_person
columns {
first_name.mapOnProperty = firstName
organisation.mapOnProperty = organisation
last_name.mapOnProperty = lastName
}
}
}
}
features {
# uncomment the following line to enable the new Property Mapper.
#rewrittenPropertyMapper = 1
}
}
Model/Location.php:
class Location extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity {
/**
* title
*
* @var string
*/
protected $title = '';
/**
* firstName
*
* @var string
*/
protected $firstName = '';
/**
* lastName
*
* @var string
*/
protected $lastName = '';
/**
* organisation
*
* @var string
*/
protected $organisation = '';
/**
* Returns the title
*
* @return string $title
*/
public function getTitle() {
return $this->title;
}
/**
* Sets the title
*
* @param string $title
* @return void
*/
public function setTitle($title) {
$this->title = $title;
}
/**
* Returns the firstName
*
* @return string $firstName
*/
public function getFirstName() {
return $this->firstName;
}
/**
* Sets the firstName
*
* @param string $firstName
* @return void
*/
public function setFirstName($firstName) {
$this->firstName = $firstName;
}
/**
* Returns the lastName
*
* @return string $lastName
*/
public function getLastName() {
return $this->lastName;
}
/**
* Sets the lastName
*
* @param string $lastName
* @return void
*/
public function setLastName($lastName) {
$this->lastName = $lastName;
}
/**
* Returns the organisation
*
* @return string $organisation
*/
public function getOrganisation() {
return $this->organisation;
}
/**
* Sets the organisation
*
* @param string $organisation
* @return void
*/
public function setOrganisation($organisation) {
$this->organisation = $organisation;
}
}
LocationController.php:
class LocationController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController {
/**
* locationRepository
*
* @var \WUWW\Wuwwaddressmap\Domain\Repository\LocationRepository
* @inject
*/
protected $locationRepository = NULL;
/**
* action list
*
* @return void
*/
public function listAction() {
$locations = $this->locationRepository->findAll();
#\TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($locations);
$this->view->assign('locations', $locations);
}
}
List.html:
...
<p>{locations.title}</p>
<p>{locations.firstName}</p>
<p>{locations.lastName}</p>
<p>{locations.organisation}</p>
...
...so... das sollte ja eigentlich reichen um diese 4 Daten aus der nnaddress Tabelle auszugeben oder.
Das Template wird ausgegeben, von den Daten aber keine Spur. Debug/var_dump im Controller oder Template sind jeweils leer.
Hab ich da was übersehen?
Gruß
Eduard
Hallo Eduard,
so wie ich das überblicke fehlt bei Dir in der setup.txt vor dem Classes-Array was:
Mal meine komplette txt:
plugin.tx_pagemap {
persistence {
storagePid = 1
classes {
Getit\Pagemap\Domain\Model\Page {
mapping {
tableName = pages
}
}
}
}
}
Ansonsten siehts auf den ersten Blick gut aus. Tests mal mit der Änderung in der setup.txt.
Wenn du nicht klar kommst, kannst du mir ja mal deine Extension als zip/rar schicken. Dann schau ichs mir mal genauer an.
Hallöle,
Danke für die Antwort. Ich finde das TS sieht aus wie bei mir. Oder nicht?
Ist aber auch egal. Das mappen dieser einen Tabelle funktioniert jetzt nämlich.
Nur das mit den Relationen zu den anderen hab ich noch nicht so hingekriegt.
Ab mir das ungefähr so vorgestellt, das hab ich schon mal ohne Namespaces gemacht, da hats auch wunderbar funktioniert:
Die anderen Tabellen auch im TS mappen und dann für jede ein Model und ein Repository(wo eigentlich nix drin steht). Dann im Model der "Haupttabelle" mit storageobjects hantieren, ungefähr so:
protected function initStorageObjects() {
$this->phone = new \TYPO3\CMS\Extbase\Persistence\ObjectStorage();
$this->mail = new \TYPO3\CMS\Extbase\Persistence\ObjectStorage();
$this->address = new \TYPO3\CMS\Extbase\Persistence\ObjectStorage();
$this->group = new \TYPO3\CMS\Extbase\Persistence\ObjectStorage();
}
/**
* Returns the phone
*
* @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\WUWW\Wuwwaddressmap\Domain\Model\Phone> $phone
*/
public function getPhone() {
return $this->phone;
}
/**
* Returns the mail
*
* @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\WUWW\Wuwwaddressmap\Domain\Model\Mail> $mail
*/
public function getMail() {
return $this->mail;
}
/**
* Returns the address
*
* @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\WUWW\Wuwwaddressmap\Domain\Model\Address> $address
*/
public function getAddress() {
return $this->address;
}
/**
* Returns the group
*
* @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\WUWW\Wuwwaddressmap\Domain\Model\Group> $group
*/
public function getGroup() {
return $this->group;
}
und im Controller dann noch jeweils sowas wie:
/**
* phoneRepository
*
* @var WUWW\Wuwwaddressmap\Domain\Repository\PnoneRepository
* @inject
*/
protected $phoneRepository;
Ist das ungefähr sowas, was ich brauch? Und ist sonst noch irgendwas für die relationen nötig? in der ext_tables.php oder so?
Gruß
Eduard
>> Ich finde das TS sieht aus wie bei mir. Oder nicht?
Hast recht. Habe das nicht gesehen, weil da mehrere Leerzeilen dazwischen sind. Sorry
>> Die anderen Tabellen auch im TS mappen
würde ich so machen
>> für jede ein Model
ja
>> ein Repository
nö, da du ja die Daten der anderen Tabellen über die Haupttabelle ausliest (und dafür nen Repository hast)
Kriegst du das so nicht hin - würde ichs mal mit dem Extension Builder (Key: extension_builder) probieren.
Hi,
ja mit dem extension builder hab ichs auch probiert.
Der spuckt mir auch mehr oder weniger sowas aus... nur dass man noch das mapping im TS zufügen muss.
Aber irgendwie hats bis jetzt noch nicht geklappt. Ich probiers am Wochenende noch mal. Vielleicht fehlt da ja nicht viel. Irgendeine Kleinigkeit. Mal sehen.
Gruß
Eduard
Sorry das ich dir da nicht viel weiterhelfen kann. Bin selber Anfänger.
Aber falls du es nicht hinbekommst, kannst du mir gerne mal deine Extension als Archiv schicken. Dann probier ich es mal.
Kein Problem.
Hast mir eh schon geholfen. Zumindest bin ich nicht ganz aufm Holzweg 🙂
Mal sehen wies am Wochenende läuft. Vielleicht tut sich ja doch noch was.
So, ich bins wieder,
nach dem ich beim letzten mal erfolgreich die Haupttabelle mappen konnte, hab ich mich noch mal hingesetzt und das ganze von vorn mit dem Extension Builder aufgezogen (Beim rumschustern an der alten Extension ist zum Schluss nur noch das nötigste übrig geblieben).
Nun schein es, hat der ext. builder alles ausgeworfen was nötig ist. Jedoch ist nun wieder nix im FE zu sehen. Der Debug über var_dump zeigt nur "2 items" und sonst nichts.
Ich weiß jetzt nicht mehr weiter, aber ich hätte mal noch eine allgemeine Frage zum mapping.
Ich mach das ja immer in der setup.txt in Configuration/Typoscript/ beginnend mit plugin.tx_meineextension
Der extension builder legt fürs mapping jedoch im root-ordner der Extension eine ext_typoscript_setup beginnend mit config.tx_extbase an. Was ist der Unterschied, bzw. was ist besser? Oder ist das völlig egal?
>> Der extension builder legt fürs mapping jedoch im root-ordner der Extension eine ext_typoscript_setup beginnend mit config.tx_extbase an. Was ist der Unterschied, bzw. was ist besser? Oder ist das völlig egal?
Kann ich dir leider nicht beantworten. Aber ich habe das Buch von Patrick Lobacher "TYPO3 Extbase" gelesen und da wird das Mapping immer über die setup.txt gemacht:
"Die Konfiguration über TypoScript erfolgt meist in der Datei setup.txt im Verzeichnis Configuration/TypoScript/ der Extension — kann aber natürlich auch an jeder anderen Stelle geschehen.
Verwendet man diese Datei, muss man selbst dafür sorgen, dass sie im TypoScript-Template der Website inkludiert ist (Include from static)."
Aber da steht ja "...wird meist in der Datei setup.txt..." und ".. muss man selbst dafür sorgen, dass sie ... inkludiert ist" - s. dazu meinen 2. Post hier.
Vielleicht ist das mit der Datei ext_typoscript_setup eine weitere Möglichkeit bei der man das Template nicht inkludieren muss ?
Update von 2018:
Der "Extension Builder" legt das alles auch "fast" schon so an. Funktioniert aber nicht, daher Folgendes beachten:
config.tx_extbase {
persistence {
classes {
FMD\MyExt\Domain\Model\Pages {
mapping {
tableName = pages
// recordType = Tx_MyExt_Pages
}
}
}
}
}
Der recordType darf nicht gesetzt sein, sonst kommt nix zurück. Hat mich nen halben Tag gekostet das zum Laufen zu bekommen.
Weitere Hinweise:
* Die "storagePid" musste ich bei mir nicht setzen.
* Wenn man nur die TYPO3 Standardfelder braucht (uid, pid...) können Model und Repository leer bleiben, ansonsten braucht man die Variablendefinitionen und Getter Methoden für die notwendigen Felder