[Frage] Frontend Repository leer - TYPO3 6.1.3, Extension Builder 2.5.2

  • AxorAT AxorAT
    TYPO3-Anwärter
    0 x
    7 Beiträge
    0 Hilfreiche Beiträge
    17. 10. 2013, 12:41

    Hallo,

    ich versuche gerade, meine erste Extbase Fluid Extension mit dem Extension Builder zu erstellen.
    Das hat auch ganz gut funktioniert, habe meine Objekte modelliert und die Extension installiert.

    Domain Model (vereinfacht):
    Objekt "Auto"
    Property "Farbe"
    Relation "Hersteller" n:1

    Objekt "Hersteller"
    Property "Name"

    Im Backend habe ich in einem Ordner eine Hersteller angelegt und dazu dann ein Auto - soweit funktionierte das wie erwartet, auch mit den Relationen.

    Im Frontend ist mein Ziel nun, eine Suchfunktion einzubauen - mittels Select Formularelement soll nun ein Hersteller ausgewählt werden.

    Hier stehe ich nun an - wie bekomme ich alle möglichen Hersteller in das Select Element

    <f:form.select name="hersteller" options="{herstellerArray}" optionValueField="id" optionLabelField="name" />

    in der entsprechenden Action versuche ich nun auf die Hersteller zuzugreifen - leider ohne Erfolg.

    Was mir auch aufgefallen ist, dass selbst eine Auto listAction keine Datensätze liefert, obwohl im Backend angelegt. Greife ich hier überhaupt auf das richtige Repository zu?

    Freue mich auf Hinweise

    Liebe Grüße
    Andreas


  • 1
  • karlchen karlchen
    Jedi-General
    0 x
    1427 Beiträge
    30 Hilfreiche Beiträge
    17. 10. 2013, 15:44

    in der Frontend Extension muss immer noch gesagt werden von welcher Seite die Datensätze kommen sollen.
    Am einfachsten wohl wenn du im FrontendPLugin unter dem Reiter "Verhalten" die Option "Datensatzsammlung" nutzt und dort angibst wo deine Datensätze liegen.

  • AxorAT AxorAT
    TYPO3-Anwärter
    0 x
    7 Beiträge
    0 Hilfreiche Beiträge
    17. 10. 2013, 16:31

    Hi Karlchen,

    danke für den Hinweis.
    Ich hatte die Datensätze auf der Seite selbst gewählt und nicht im auf der Seite eingebundenen Plugin.

    Habe es aber bereits über Typoscript geschafft:

    1. plugin.tx_myextension.persistence.storagePid = 102

    Führt aber wohl beides zum Ziel.

    Mein derzeitiges Problem ist, dass ich im AutoController nicht so auf die Hersteller zugreifen kann, wie ich mir das erwartet habe.

    1. $herstellerController = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\MyExtension\Controller\HerstellerController');
    2. $herstellerArray=$herstellerController->getAllHersteller();
    3. $this->view->assign('herstellerArray', $herstellerArray);

    und im HerstellerController gibts

    1. public function getAllHersteller() {
    2. return $this->herstellerRepository->findAll();
    3. }

    leider kann der HerstellerController nicht auf die Daten zugreifen:

    [i]Fatal error: Call to a member function findAll() on a non-object in .../Classes/Controller/HerstellerController.php on line ...[/i]

    wenn ich den HerstellerController ändere auf

    1. public function getAllHersteller() {
    2. $herstellerRepository = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\MyExtension\Domain\Repository\HerstellerRepository');
    3. return $herstellerRepository->findAll();
    4. }

    dann funktioniert es - aber muss ich jetzt jedesmal wenn ich aus einem anderen Controller etwas abrufe dort vorher das Repository instanzieren? Über die Actions (zb listAction) brauch ich das nicht zu machen

  • karlchen karlchen
    Jedi-General
    0 x
    1427 Beiträge
    30 Hilfreiche Beiträge
    17. 10. 2013, 16:54

    hi,

    genau in TypoScript macht man es dann mit der storagePid :)

    Wegen dem Hersteller, schau dir mal das hier als "Grundlage" an:
    http://www.extbasefluid.com/extbase-dokumentation-fuer-controller-model-repository-und-extensions/dependency-injection/

    Noch einfacher geht es dann mit der "@inject annotation", hier mal ein Beispiel aus der Blog Extension
    https://review.typo3.org/#/c/12961/2/Classes/Controller/BlogController.php

    Rechts in grün, wird die neuere Variante gezeigt.

  • AxorAT AxorAT
    TYPO3-Anwärter
    0 x
    7 Beiträge
    0 Hilfreiche Beiträge
    18. 10. 2013, 07:52

    Hi,

    das HerstellerRepository gibt es ja bereits im HerstellerController

    1. /**
    2. * herstellerRepository
    3. *
    4. * @var \TYPO3\MyExtension\Domain\Repository\HerstellerRepository
    5. * @inject
    6. */
    7. protected $herstellerRepository;

    Beim Aufruf von

    1. $this->herstellerRepository->findAll()

    bekomme ich aber ein
    [i]Fatal error: Call to a member function findAll() on a non-object in .../Classes/Controller/HerstellerController.php on line ...[/i] wie oben erwähnt.

    Nur wenn ichs mit makeInstance neu instanziere funktionierts.

    Andererseits gibt es im HerstellerController eine listAction:

    1. /**
    2. * action list
    3. *
    4. * @return void
    5. */
    6. public function listAction() {
    7. $hersteller = $this->herstellerRepository->findAll();
    8. $this->view->assign('hersteller', $hersteller);
    9. }

    die ohne Probleme findAll aufruft - liegt es vielleicht daran, dass die listAction anders (direkt) aufgerufen wird als die über den AutoController aufgerufene public function getAllHersteller()?

  • harald1972 harald197...
    Sternenflotten-Admiral
    0 x
    198 Beiträge
    13 Hilfreiche Beiträge
    18. 10. 2013, 14:11

    Hi,

    du hast ganz oben geschrieben:

    1. <f:form.select name="hersteller" options="{herstellerArray}" optionValueField="id" optionLabelField="name" />

    Müsste es nicht optionValueField="uid" heißen?

    Zum zweiten:
    Wenn dein AutoController ein $herstellerRepository hat, solltest du ohne Probleme und mit Erfolg von diesem das hier aufrufen können:

    1. $alleHersteller = $this->herstellerRepository->findAll();

    Und dann (persönliche Meinung) ;) ...
    Lieber gebe ich dem AutoController das Wissen über die Hersteller via Repository, als einen Controller zu instantiieren, über den ich dann die Zeile
    $this->herstellerRepository->findAll();
    in eine Methode verpack. Ich weiß ja jetzt nicht wirklich, was die Styleguidelines sagen, vielleicht ist es auch Geschmacksache. Aber ich find es einfacher und logischer.

    Gruß
    Harald

  • AxorAT AxorAT
    TYPO3-Anwärter
    0 x
    7 Beiträge
    0 Hilfreiche Beiträge
    21. 10. 2013, 07:15

    Das mit der UID stimmt, ist mittlerweile korrigiert.
    --

    Ich würde ja gerne auf das Repository zugreifen, aber

    1. /**
    2. * herstellerRepository
    3. *
    4. * @var \TYPO3\MyExtension\Domain\Repository\HerstellerRepository
    5. * @inject
    6. */
    7. protected $herstellerRepository;

    1. $hersteller = $this->herstellerRepository->findAll();

    bringt mir einen
    [i]Fatal error: Call to a member function findAll() on a non-object in...[/i]

    Der Aufruf findet in einer Action statt, die das Ziel hat, eine Suchmaske mit eben dem Hersteller Select-Feld zu generieren. Das klappt auch alles, aber leider nicht direkt über das Repository, sondern über den HerstellerController und

    1. $herstellerRepository = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\MyExtension\Domain\Repository\HerstellerRepository');
    2. $results = $herstellerRepository->findAll();

    denn nicht mal im HerstellerController kann ich über den Funktionsaufruf direkt auf das HerstellerRepository zugreifen?!?!?

  • harald1972 harald197...
    Sternenflotten-Admiral
    0 x
    198 Beiträge
    13 Hilfreiche Beiträge
    21. 10. 2013, 12:36

    Also, nochmal zur Rekapitulation...
    das $herstellerRepository ist in deinem Controller definiert und besagte Action dieses Controllers kennt es trotzdem nicht. Allerdings funktioniert ein makeInstance und der findAll-Aufruf mit diesem temporären Repository. Richtig?

    ...wirklich seltsam.
    Ich denke, die Datei HerstellerRepository.php besteht in deinem Repository-Verzeichnis und ist korrekt. Sonst würdest du eine andere Fehlermeldung erhalten.

    Aber ich seh grad noch was, das ich selbst noch nicht ganz verstanden hab, aber vielleicht hat es was damit zu tun.
    Du verwendest TYPO3 als Vendor-Name.
    Auf [url]http://www.wiki.typo3.org/Namespaces[/url] steht u.a.
    "The TYPO3 core uses \TYPO3\CMS as vendor name. As a extension developer you are not allowed to use this vendor in your own extension!"

    Möglicherweise hilft es, einen anderen, eigenen Vendor-Name zu verwenden.

  • 0 x
    12 Beiträge
    0 Hilfreiche Beiträge
    08. 12. 2014, 22:00

    Bin gerade über dasselbe Problem gestolpert, hat mich gefühlt Stunden gekostet.

    Die Lösung war dann simpel:
    Install Tool und "Clear all cache"

    [url]http://www.scripting-base.de/blog/artikel/datum////typo3-62-extbase-dependency-injection-funktioniert-nicht/[/url]

  • 1