Extbase fe_users auslesen klappt nicht?

  • typonewbe typonewbe
    Sternenflotten-Admiral
    0 x
    197 Beiträge
    3 Hilfreiche Beiträge
    12. 01. 2011, 16:33

    Hallo,

    stehe hier vor einem Problem und komme nicht mehr weiter.
    Ich habe eine kleine Test Extension gschrieben die nichts weiter machen soll, ausser die FE-User Tabelle auszulesen.

    Jetzt hab ich das Tutorial von dieser Seite [url=http://typo3.sfroemken.de/index.php?id=81]typo3.sfroemken.de[/url] quasi 1:1 in meine Extension übernommen.

    Bis zum Punkt "[b]fe_users und neue Felder[/b]" da ich keine anderen Felder auslesen möchte.

    Habe das Plugin Konfiguriert
    den Controller Angelegt einziger Unterschied statt User heißt er FeUser
    Das Template angelegt.

    Plugin installiert und den Startpunkt auf die Seite mit den FeUsern gesetzt (Ja sind welche angelegt :) )

    Der Tabellenkopf wird angezeigt aber die Datensätze nicht.

    ich hatte schon mal das Problem, das der Startpunkt nicht gesetzt wurde also hab ich das nochmal im TS verankert.

    1. plugin.tx_mytestext {
    2. persistence {
    3. storagePid = 10
    4. }
    5. }

    Auf weiteren TS Code habe ich verzichtet da laut Tutorial das nicht gebraucht wird.
    Gemappt wurde somit auch nichts, da ich ja kein eigenes Model oder Repository benutze.

    Nun stehe ich aber auf dem schlauch hat irgendjemand zufälig enen Tipp wie ich das Repo bewegen kann daten an den Controller zu senden damit ich weiter komme.

    PS: Auch wenn ich nicht auf andere Felder zugreifen möchte so wurde die fe_users mit anderen Feldern erweiter ist eventuell da der Hund begraben?

    Danke schon mal im Voraus

    Viele Grüße typonewbe


  • typonewbe typonewbe
    Sternenflotten-Admiral
    0 x
    197 Beiträge
    3 Hilfreiche Beiträge
    17. 01. 2011, 17:16

    Hallo,

    kann es sein dass das Mappen der Tabellen nicht richtig funktioniert?

    Mir ist folendes Aufgefallen wenn ich per TypoScript einmal folgndes lösche

    1. config.tx_extbase.persistence.classes >

    Kommt folgender Fehler:

    mydb.tx_extbase_domain_model_frontenduser' doesn't exist: SELECT tx_extbase_domain_model_frontenduser.* FROM tx_extbase_domain_model_frontenduser

    Was ja im Grunde logisch ist da das Mapping auf die fe_users Tabelle gelöscht wurde.

    Da die fe_users Tabelle mit neuen Feldern erweitert wurde wollte ich jetzt statt über extbase auf meine eigene Extension Mappen also habe ich folgendes angegeben.

    1. plugin.tx_testext {
    2. persistence {
    3. storagePid = 10
    4. enableAutomaticCacheClearing = 1
    5. updateReferenceIndex = 0
    6.  
    7. classes {
    8. Tx_Testext_Domain_Model_FeUser {
    9. mapping {
    10. tableName = fe_users
    11. recordType = Tx_Testext_Domain_Model_FeUser
    12. columns {
    13. lockToDomain.mapOnProperty = lockToDomain
    14. }
    15. }
    16. }
    17. }
    18.  
    19. }
    20. }

    Im Model habe ich folgendes gesagt:

    1. class Tx_Testext_Domain_Model_FeUser extends Tx_Extbase_DomainObject_AbstractEntity {
    2. /**
    3. * @var string
    4. */
    5. protected $username;
    6.  
    7. public function __construct() {
    8.  
    9. }
    10.  
    11. /**
    12. * Sets the username value
    13. *
    14. * @param string $username
    15. * @return void
    16. * @api
    17. */
    18. public function setUsername($username) {
    19. $this->username = $username;
    20. }
    21.  
    22. /**
    23. * Returns the username value
    24. *
    25. * @return string
    26. * @api
    27. */
    28. public function getUsername() {
    29. return $this->username;
    30. }
    31. }

    mehr nicht es soll nur der username ausgegeben werden.

    Wenn ich alles richtig verstanden habe dient das Model zum holen und setzen der Informationen und mt dem Mappen sage ich das er nicht auf die Tabelle zugreifen soll die wie die Klasse geschrieben wird sondern auf die fe_users. Somit sollte doch das Repo wissen das ich die fe_users nutzen möchte.

    Aber nein ich erhalte mit findAll ein leeres Ergebnis, erst wenn ich die findAll() überschreibe.

    1. public function findAll() {
    2. $extbaseFrameworkConfiguration = Tx_Extbase_Dispatcher::getExtbaseFrameworkConfiguration();
    3. $pidList = implode(', ', t3lib_div::intExplode(',', $extbaseFrameworkConfiguration['persistence']['storagePid']));
    4. $query = $this->createQuery();
    5. $query->statement('SELECT * from fe_users where 1 AND pid IN ('.$pidList.')');
    6. return $query->execute();
    7. }

    Aber das kann doch nicht der Weisheit letzter Schluß sein, dass ich mein eigenes Repo schreiben muss zumal ich mich dann frage wozu mappe ich wenn er doch nicht auf die Tabelle zugreift?

    Hat jemand von euch eine Idee was ich falsch mache?

    Gruß typonewbe

  • 0 x
    13 Beiträge
    0 Hilfreiche Beiträge
    18. 01. 2011, 21:27

    Dein Ansatz geht in die richtige Richtung.

    1. config.tx_extbase.persistence.classes {
    2. Tx_Extbase_Domain_Model_FrontendUser {
    3. subclasses {
    4. Tx_Testext_Domain_Model_FeUser = Tx_Testext_Domain_Model_FeUser
    5. }
    6. }
    7. }
    8.  
    9.  
    10. plugin.tx_testext.persistence {
    11.  
    12. classes {
    13. Tx_Testext_Domain_Model_FeUser {
    14. mapping {
    15. tableName = fe_users
    16. recordType = Tx_Testext_Domain_Model_FeUser
    17. }
    18. }
    19. }
    20. }

    Jetzt musst du beim Frontend User den recordType nur noch auf Tx_Testext_Domain_Model_FeUser setzen. Damit du das direkt im Backend machen kannst, musst du noch das TCA erweitern.

    Edit: Für findAll() reicht ein:

    1. return $this->createQuery()->execute();

  • typonewbe typonewbe
    Sternenflotten-Admiral
    0 x
    197 Beiträge
    3 Hilfreiche Beiträge
    20. 01. 2011, 17:16

    Hallo SilentGhost,

    danke das hat wunderbar geklappt.

    Das mit den Subclasses hab ich aber noch in keiner Doku. gesehn :)

    und der RecordType musste noch in der ext_tables gändert werden da Stand noch der Extensionname und nicht das Model.

    Grüße typonewbe

  • onyx_no1 onyx_no1
    T3PO
    0 x
    23 Beiträge
    0 Hilfreiche Beiträge
    10. 02. 2011, 22:49

    Ich möchte mit der beschriebenen Weise mit meiner Extension Daten in tt_address ablegen und auslesen.
    Mit der Herangehensweise hab ich noch so meine Probleme:

    Muss ich das Model, das die Daten aus tt_address aufnimmt, 1 zu 1 so aufbauen, wie tt_address aussieht oder sind die - für mich - revalanten Felder aussreichend?

    Weiterhin hab ich in der Literatur gefunden, dass das Mapping so aussehen soll:

    1. plugin.tx_myextension.persistence.classes {
    2. Tx_MyExtension_Domain_Model_Address {
    3. mapping {
    4. tableName = tt_address
    5. recordType = Tx_MyExtension_Domain_Model_Person
    6. columns {
    7. birthday.mapOnProperty = dateOfBirth
    8. street.mapOnProperty = thouroughfare
    9. }
    10. }
    11. }
    12. }

    Das Repository sieht so aus:

    1. class Tx_MyExtension_Domain_Model_PersonsRepository extends Tx_Extbase_Persistence_Repository {
    2. }

    Fehlt mir jetzt noch eine mm-Zwischentabelle, damit die Daten im Backend pflegbar werden? Wenn ja, nach welchem Schema muss die im TCA integriert werden?

    Für ein paar Tipps wäre ich dankbar.

  • r0n r0n
    TYPO3-Anwärter
    0 x
    7 Beiträge
    0 Hilfreiche Beiträge
    17. 02. 2011, 10:27

    Hallo,
    ich habe leider gleiches Problem. Nur versuche ich Daten aus der pages Tabelle zu lesen.

    Model:

    1. <?php
    2.  
    3. class Tx_Myext_Domain_Model_Page extends Tx_Extbase_DomainObject_AbstractValueObject {
    4.  
    5. /**
    6. *
    7. * @var string
    8. * @validate NotEmpty
    9. */
    10.  
    11. protected $title;
    12.  
    13. /**
    14. * Getter for title
    15. * @return string title
    16. */
    17. public function getTitle() {
    18. return $this->title;
    19. }
    20.  
    21. }
    22.  
    23. ?>

    Repo:

    1. <?php
    2. class Tx_Myext_Domain_Repository_PageRepository extends Tx_Extbase_Persistence_Repository {
    3.  
    4. }
    5.  
    6. ?>

    1. plugin.tx_myext {
    2.  
    3. persistence.classes {
    4. Tx_Myext_Domain_Model_Page {
    5. mapping {
    6. tableName = pages
    7. recordType = Tx_Myext_Domain_Model_Page
    8. }
    9. }
    10. }
    11. }

    Durch

    1. $this->pageRepository->findAll();

    Müsste ich doch alle Seitentitel bekommen oder nicht?

    Könnte mir da jemand helfen, oder vielleicht einen Link geben, wo das Mapping auf andere Tabellen vom Start bis Ende beschrieben ist?

    Ich bin für jede Hilfe dankbar.

  • r0n r0n
    TYPO3-Anwärter
    0 x
    7 Beiträge
    0 Hilfreiche Beiträge
    18. 02. 2011, 13:41

    Hallo Leute,

    ich habe mir ein wenig selbst geholfen und bin ein Stück weiter gekommen:
    Jedoch habe ich ein weiteres Problem:

    In meiner Tabelle soll unter der Spalte 'page' die uid der gespeicherten Seite erfasst werden.

    Lasse ich mir das Objekt direkt vor der Datenübergabe add() ausgeben bekomme ich folgendes:

    1. Tx_Myext_Domain_Model_Collection Object
    2. (
    3. [cookie:protected] => 79b4b6f0b7016f4fc5618e63cee2f8c3
    4. [sorting:protected] =>
    5. [page:protected] => Tx_Myext_Domain_Model_Page Object
    6. (
    7. [title:protected] => Content
    8. [uid:protected] => 21
    9. [_localizedUid:protected] => 21
    10. [_languageUid:protected] =>
    11. [_isClone:private] =>
    12. )
    13.  
    14. [last:protected] =>
    15. [uid:protected] =>
    16. [_localizedUid:protected] =>
    17. [_languageUid:protected] =>
    18. [_isClone:private] =>
    19. )

    Sprich, er hat die ausgewählte Seite als Objekt. Leider wird die Uid der Seite, nicht in der DB gespeichert.?!

    Ich habe mir nun mehrere Extensions angeschaut, jedoch konnte ich keinen Fehler entdecken. Muss ich eventuell noch was im TS oder im TCA ändern?

    Für eine Hilfe wäre ich dankbar.

  • sunixzs sunixzs
    R2-D2
    0 x
    123 Beiträge
    2 Hilfreiche Beiträge
    03. 03. 2011, 22:49

    N'Abend,

    ein kleiner Hinweis am Rande, damit man sich nicht möglicherweise den Wolf nach einem Fehler absucht:

    Beim FE-User-/FE-Group-Datensatz unter "Erweitert -> Datensatztyp" "Tx_Extbase_Domain_Model_FrontendUser" auswählen.

    Extbase schaut erst, ob "$TCA['fe_groups']['ctrl']['type']" gesetzt ist. Wenn nicht, wird dieser und der "fe_users" Wert auf "tx_extbase_type" gesetzt. Zusätzlich wird das TCA geändert, damit man obiges Auswahl-Feld im Datensatz bekommt.

    Gesehen hatte ich das nicht im Backend, sondern erst, als ich nach stundenlangem Testen und Fehlersuche die Extension Extbase durchforstet habe und in ext_tables.php fündig wurde.

    Kennt jemand den Grund, dass Extbase erst Zugriff auf die Users/Groups bekommt, nachdem ein Redakteur dies im Datensatz ändert? Kann man das irgendwie übergehen? Ich stelle mir gerade vor, dass alle alten User und Groups geändert werden müssen, wenn eine Extbase-Extension mit User/Group-Zugriff in die Typo3-Installation einzug hält. Für neue User/Groups könnte man den Wert im BE-User-TS voreinstellen:

    1. # TCAdefaults.TABELLE.SPALTE = WERT
    2. TCAdefaults.fe_users.tx_extbase_type = Tx_Extbase_Domain_Model_FrontendUser
    3. TCAdefaults.fe_groups.tx_extbase_type = Tx_Extbase_Domain_Model_FrontendUserGroup

    Schönen Abend

    sun

  • typonewbe typonewbe
    Sternenflotten-Admiral
    0 x
    197 Beiträge
    3 Hilfreiche Beiträge
    09. 03. 2011, 14:15

    [quote="r0n"]
    Hallo,
    ich habe leider gleiches Problem. Nur versuche ich Daten aus der pages Tabelle zu lesen.

    Model:

    1. <?php
    2.  
    3. class Tx_Myext_Domain_Model_Page extends Tx_Extbase_DomainObject_AbstractValueObject {
    4.  
    5. /**
    6. *
    7. * @var string
    8. * @validate NotEmpty
    9. */
    10.  
    11. protected $title;
    12.  
    13. /**
    14. * Getter for title
    15. * @return string title
    16. */
    17. public function getTitle() {
    18. return $this->title;
    19. }
    20.  
    21. }
    22.  
    23. ?>

    Repo:

    1. <?php
    2. class Tx_Myext_Domain_Repository_PageRepository extends Tx_Extbase_Persistence_Repository {
    3.  
    4. }
    5.  
    6. ?>

    1. plugin.tx_myext {
    2.  
    3. persistence.classes {
    4. Tx_Myext_Domain_Model_Page {
    5. mapping {
    6. tableName = pages
    7. recordType = Tx_Myext_Domain_Model_Page
    8. }
    9. }
    10. }
    11. }

    Durch

    1. $this->pageRepository->findAll();

    Müsste ich doch alle Seitentitel bekommen oder nicht?

    Könnte mir da jemand helfen, oder vielleicht einen Link geben, wo das Mapping auf andere Tabellen vom Start bis Ende beschrieben ist?

    Ich bin für jede Hilfe dankbar.

    [/quote]
    Hallo bist du schon weiter bzw. hast eine Lösung?
    Hab abgesehen von fe_users nicht wieder damit gearbeitet.
    Mir aber mal meine pages angesehen.
    dort gibt es kein Feld recordType also wird das wahrscheinlich so nicht klappen denke mal du müsstest das Feld noch zu pages hinzufügen und dann bei jeder Seite diesen RecordType auswählen.
    Desweiteren müsstes du vielleicht

    1. $TCA['fe_users']['columns']['tx_extbase_type']['config']['items'] = "Tx_MyExt_FeUserModel"

    dort dein Page Model eintragen.
    PS: hab absichtlich fe_users dringelassen weil ich dort mein Model definiert habe
    Also auf Pages um bauen.
    Eventuell hilft das weiter

    Gruß typonewbe

  • typonewbe typonewbe
    Sternenflotten-Admiral
    0 x
    197 Beiträge
    3 Hilfreiche Beiträge
    09. 03. 2011, 14:16

    [quote="r0n"]
    Hallo,
    ich habe leider gleiches Problem. Nur versuche ich Daten aus der pages Tabelle zu lesen.

    Model:

    1. <?php
    2.  
    3. class Tx_Myext_Domain_Model_Page extends Tx_Extbase_DomainObject_AbstractValueObject {
    4.  
    5. /**
    6. *
    7. * @var string
    8. * @validate NotEmpty
    9. */
    10.  
    11. protected $title;
    12.  
    13. /**
    14. * Getter for title
    15. * @return string title
    16. */
    17. public function getTitle() {
    18. return $this->title;
    19. }
    20.  
    21. }
    22.  
    23. ?>

    Repo:

    1. <?php
    2. class Tx_Myext_Domain_Repository_PageRepository extends Tx_Extbase_Persistence_Repository {
    3.  
    4. }
    5.  
    6. ?>

    1. plugin.tx_myext {
    2.  
    3. persistence.classes {
    4. Tx_Myext_Domain_Model_Page {
    5. mapping {
    6. tableName = pages
    7. recordType = Tx_Myext_Domain_Model_Page
    8. }
    9. }
    10. }
    11. }

    Durch

    1. $this->pageRepository->findAll();

    Müsste ich doch alle Seitentitel bekommen oder nicht?

    Könnte mir da jemand helfen, oder vielleicht einen Link geben, wo das Mapping auf andere Tabellen vom Start bis Ende beschrieben ist?

    Ich bin für jede Hilfe dankbar.

    [/quote]
    Hallo bist du schon weiter bzw. hast eine Lösung?
    Hab abgesehen von fe_users nicht wieder damit gearbeitet.
    Mir aber mal meine pages angesehen.
    dort gibt es kein Feld recordType also wird das wahrscheinlich so nicht klappen denke mal du müsstest das Feld noch zu pages hinzufügen und dann bei jeder Seite diesen RecordType auswählen.
    Desweiteren müsstes du vielleicht

    1. $TCA['fe_users']['columns']['tx_extbase_type']['config']['items'] = "Tx_MyExt_FeUserModel"

    dort dein Page Model eintragen.
    PS: hab absichtlich fe_users dringelassen weil ich dort mein Model definiert habe
    Also auf Pages um bauen.
    Eventuell hilft das weiter

    Gruß typonewbe