Mapping von Tabellen - So klappts TYPO3-Version: -

  • getit getit
    Jedi-Ritter
    1 x
    137 Beiträge
    4 Hilfreiche Beiträge
    12. 07. 2014, 11:38

    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

    1. plugin.tx_<extkey> {
    2. persistence {
    3. storagePid = 2
    4. classes {
    5. <Vendor>\<Extkey>\Domain\Model\Page {
    6. mapping {
    7. tableName = pages
    8. }
    9. }
    10. }
    11. }
    12. }

    2. Das Model anlegen

    1. namespace <Vendor>\<Extkey>\Domain\Model;
    2.  
    3. /**
    4.  * Class Page
    5.  * @package <Vendor>\<Extkey>\Domain\Model
    6.  */
    7. class Page extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity {
    8.  
    9. /**
    10.   * @var string
    11.   */
    12. protected $title;
    13.  
    14. /**
    15.   * @var string
    16.   */
    17. protected $subtitle;
    18.  
    19. public function getTitle() {
    20. return $this->title;
    21. }
    22.  
    23. public function getSubtitle() {
    24. return $this->subtitle;
    25. }
    26. }

    WICHTIG: Die Annotations bei den Eigenschaften.

    3. Das Repository

    1. namespace <Vendor>\<Extkey>\Domain\Repository;
    2.  
    3. /**
    4.  * Class PageRepository
    5.  *
    6.  * @package <Vendor>\<Extkey>\Domain\Repository
    7.  */
    8. class PageRepository extends \TYPO3\CMS\Extbase\Persistence\Repository {
    9.  
    10. public function findPages() {
    11. $query = $this->createQuery();
    12. // $query->getQuerySettings()->setRespectStoragePage(FALSE);
    13.  
    14. return $query->execute();
    15. }
    16. }

    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.


  • getit getit
    Jedi-Ritter
    0 x
    137 Beiträge
    4 Hilfreiche Beiträge
    09. 11. 2014, 00:08

    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:

    1. \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.

    Anhänge (1)
    efempty.zip application/zip 0,00 B 276 heruntergeladen
  • OnkelEdi OnkelEdi
    Jedi-Ritter
    0 x
    129 Beiträge
    2 Hilfreiche Beiträge
    10. 11. 2014, 09:33

    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

  • OnkelEdi OnkelEdi
    Jedi-Ritter
    0 x
    129 Beiträge
    2 Hilfreiche Beiträge
    13. 11. 2014, 10:19

    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:

    1. plugin.tx_wuwwaddressmap {
    2. view {
    3. templateRootPath = {$plugin.tx_wuwwaddressmap.view.templateRootPath}
    4. partialRootPath = {$plugin.tx_wuwwaddressmap.view.partialRootPath}
    5. layoutRootPath = {$plugin.tx_wuwwaddressmap.view.layoutRootPath}
    6. }
    7. persistence {
    8. storagePid = {$plugin.tx_wuwwaddressmap.persistence.storagePid}
    9.  
    10.  
    11.  
    12.  
    13. classes {
    14. WUWW\Wuwwaddressmap\Domain\Model\Location{
    15. #Tx_Wuwwaddressmap_Domain_Model_Location{
    16. mapping {
    17. tableName = tx_nnaddress_domain_model_person
    18. columns {
    19. first_name.mapOnProperty = firstName
    20. organisation.mapOnProperty = organisation
    21. last_name.mapOnProperty = lastName
    22. }
    23. }
    24. }
    25. }
    26. features {
    27. # uncomment the following line to enable the new Property Mapper.
    28. #rewrittenPropertyMapper = 1
    29. }
    30. }

    Model/Location.php:

    1. class Location extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity {
    2.  
    3. /**
    4.   * title
    5.   *
    6.   * @var string
    7.   */
    8. protected $title = '';
    9.  
    10. /**
    11. * firstName
    12. *
    13. * @var string
    14. */
    15. protected $firstName = '';
    16.  
    17. /**
    18. * lastName
    19. *
    20. * @var string
    21. */
    22. protected $lastName = '';
    23.  
    24. /**
    25. * organisation
    26. *
    27. * @var string
    28. */
    29. protected $organisation = '';
    30.  
    31.  
    32. /**
    33. * Returns the title
    34. *
    35. * @return string $title
    36. */
    37. public function getTitle() {
    38. return $this->title;
    39. }
    40.  
    41. /**
    42. * Sets the title
    43. *
    44. * @param string $title
    45. * @return void
    46. */
    47. public function setTitle($title) {
    48. $this->title = $title;
    49. }
    50.  
    51. /**
    52. * Returns the firstName
    53. *
    54. * @return string $firstName
    55. */
    56. public function getFirstName() {
    57. return $this->firstName;
    58. }
    59.  
    60. /**
    61. * Sets the firstName
    62. *
    63. * @param string $firstName
    64. * @return void
    65. */
    66. public function setFirstName($firstName) {
    67. $this->firstName = $firstName;
    68. }
    69.  
    70.  
    71.  
    72. /**
    73. * Returns the lastName
    74. *
    75. * @return string $lastName
    76. */
    77. public function getLastName() {
    78. return $this->lastName;
    79. }
    80.  
    81. /**
    82. * Sets the lastName
    83. *
    84. * @param string $lastName
    85. * @return void
    86. */
    87. public function setLastName($lastName) {
    88. $this->lastName = $lastName;
    89. }
    90.  
    91. /**
    92. * Returns the organisation
    93. *
    94. * @return string $organisation
    95. */
    96. public function getOrganisation() {
    97. return $this->organisation;
    98. }
    99.  
    100. /**
    101. * Sets the organisation
    102. *
    103. * @param string $organisation
    104. * @return void
    105. */
    106. public function setOrganisation($organisation) {
    107. $this->organisation = $organisation;
    108. }
    109. }

    LocationController.php:

    1. class LocationController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController {
    2.  
    3. /**
    4. * locationRepository
    5. *
    6. * @var \WUWW\Wuwwaddressmap\Domain\Repository\LocationRepository
    7. * @inject
    8. */
    9. protected $locationRepository = NULL;
    10.  
    11. /**
    12. * action list
    13. *
    14. * @return void
    15. */
    16. public function listAction() {
    17. $locations = $this->locationRepository->findAll();
    18. #\TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($locations);
    19. $this->view->assign('locations', $locations);
    20. }
    21. }

    List.html:

    1. ...
    2.  
    3. <p>{locations.title}</p>
    4.  
    5. <p>{locations.firstName}</p>
    6.  
    7. <p>{locations.lastName}</p>
    8.  
    9. <p>{locations.organisation}</p>
    10.  
    11. ...

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

  • getit getit
    Jedi-Ritter
    0 x
    137 Beiträge
    4 Hilfreiche Beiträge
    20. 11. 2014, 19:52

    Hallo Eduard,

    so wie ich das überblicke fehlt bei Dir in der setup.txt vor dem Classes-Array was:

    Mal meine komplette txt:

    1. plugin.tx_pagemap {
    2. persistence {
    3. storagePid = 1
    4. classes {
    5. Getit\Pagemap\Domain\Model\Page {
    6. mapping {
    7. tableName = pages
    8. }
    9. }
    10. }
    11. }
    12. }

    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.

  • OnkelEdi OnkelEdi
    Jedi-Ritter
    0 x
    129 Beiträge
    2 Hilfreiche Beiträge
    21. 11. 2014, 08:09

    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:

    1. protected function initStorageObjects() {
    2. $this->phone = new \TYPO3\CMS\Extbase\Persistence\ObjectStorage();
    3. $this->mail = new \TYPO3\CMS\Extbase\Persistence\ObjectStorage();
    4. $this->address = new \TYPO3\CMS\Extbase\Persistence\ObjectStorage();
    5. $this->group = new \TYPO3\CMS\Extbase\Persistence\ObjectStorage();
    6. }
    7.  
    8. /**
    9. * Returns the phone
    10. *
    11. * @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\WUWW\Wuwwaddressmap\Domain\Model\Phone> $phone
    12. */
    13. public function getPhone() {
    14. return $this->phone;
    15. }
    16.  
    17.  
    18. /**
    19. * Returns the mail
    20. *
    21. * @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\WUWW\Wuwwaddressmap\Domain\Model\Mail> $mail
    22. */
    23. public function getMail() {
    24. return $this->mail;
    25. }
    26.  
    27.  
    28. /**
    29. * Returns the address
    30. *
    31. * @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\WUWW\Wuwwaddressmap\Domain\Model\Address> $address
    32. */
    33. public function getAddress() {
    34. return $this->address;
    35. }
    36.  
    37. /**
    38. * Returns the group
    39. *
    40. * @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\WUWW\Wuwwaddressmap\Domain\Model\Group> $group
    41. */
    42. public function getGroup() {
    43. return $this->group;
    44. }

    und im Controller dann noch jeweils sowas wie:

    1. /**
    2. * phoneRepository
    3. *
    4. * @var WUWW\Wuwwaddressmap\Domain\Repository\PnoneRepository
    5. * @inject
    6. */
    7. 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

  • getit getit
    Jedi-Ritter
    0 x
    137 Beiträge
    4 Hilfreiche Beiträge
    21. 11. 2014, 10:10

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

  • OnkelEdi OnkelEdi
    Jedi-Ritter
    0 x
    129 Beiträge
    2 Hilfreiche Beiträge
    21. 11. 2014, 10:17

    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

  • getit getit
    Jedi-Ritter
    0 x
    137 Beiträge
    4 Hilfreiche Beiträge
    21. 11. 2014, 10:20

    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.

  • OnkelEdi OnkelEdi
    Jedi-Ritter
    0 x
    129 Beiträge
    2 Hilfreiche Beiträge
    21. 11. 2014, 10:25

    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.