[Frage] Extbase Plugin / Flexform: Select-Einträge filtern TYPO3-Version: -

  • jochla jochla
    Jedi-Ritter
    0 x
    128 Beiträge
    0 Hilfreiche Beiträge
    01. 12. 2013, 13:39

    Hallo,

    ich dachte, heute, am 1. Advent, geht mir ein Licht auf! Aber denkste, hat auch nicht geholfen ;-)
    Vielleicht erhalte ich ja hier im Forum die "Erleuchtung" - wäre schön! :-)

    [b]Aufgabenstellung:[/b]
    In den Plugin-Einstellungen kann über ein Select-Feld ein bestimmtes (Segel-)Revier ausgewählt werden. Aufgrund dieser Auswahl wird das BE-Formular neu geladen, und es sollen alle Gebiete / Regionen des ausgewählten Reviers angezeigt werden.

    [b]Domain Model:[/b]
    MainRegion 1----* SubRegion

    Flexform:

    1. <settings.flexform.mainRegion>
    2. <TCEforms>
    3. <label>Revier:</label>
    4. <onChange>reload</onChange>
    5. <config>
    6. <type>select</type>
    7. <items type="array">
    8. <numIndex index="0" type="array">
    9. <numIndex index="0">Alle Reviere</numIndex>
    10. <numIndex index="1">0</numIndex>
    11. </numIndex>
    12. </items>
    13. <foreign_table>tx_sccruiseplan_domain_model_mainregion</foreign_table>
    14. <foreign_table_where>ORDER BY main_region_name</foreign_table_where>
    15. <minitems>0</minitems>
    16. <maxitems>1</maxitems>
    17. </config>
    18. </TCEforms>
    19. </settings.flexform.mainRegion>
    20. <subRegionSelector>
    21. <TCEforms>
    22. <label>Gebiet / Region:</label>
    23. <displayCond>FIELD:settings.flexform.mainRegion:REQ:true</displayCond>
    24. <config>
    25. <type>select</type>
    26. <items type="array">
    27. <numIndex index="0" type="array">
    28. <numIndex index="0">Alle Regionen</numIndex>
    29. <numIndex index="1">0</numIndex>
    30. </numIndex>
    31. </items>
    32. <foreign_table_where>AND (main_region_assignment = 2) ORDER BY sub_region_name</foreign_table_where>
    33. <minitems>0</minitems>
    34. <maxitems>1</maxitems>
    35. </config>
    36. </TCEforms>
    37. </subRegionSelector>

    Dieser Code funktioniert auch. Natürlich muss sich <foreign_table_where>AND (main_region_assignment = 2</foreign_table_where> dynamisch an den in "MainRegion" ausgewählten Eintrag anpassen. Und hier liegt mein Problem - ist aber auch meine erste Extension!

    Ich habe es mit <foreign_table_where>AND (main_region_assignment = FIELD:settings.flexform.mainRegion)</foreign_table_where> versucht, klappt aber leider nicht - schade eigentlich.

    Nach viel googlen bin ich jetzt mehr verwirrt als schlauer geworden. Grund: es erschließt sich mir nicht, nach welcher Methode ich nun aus dem flexform auf das Repository zugreifen und die Datensätze filtern kann.

    Ich hab's auch damit versucht:

    1. <itemsProcFunc>tx_myextension_Domain_Repository_SubRegionRepository->findInMainRegion()</itemsProcFunc>

    1. class SubRegionRepository extends \TYPO3\CMS\Extbase\Persistence\Repository {
    2. public function findInMainRegion($mainRegion) {
    3. $query = $this->createQuery();
    4. $query->matching(
    5. $query->equals('mainRegionAssignment', 2)
    6. );
    7. return $query->execute();
    8. }
    9. }
    10. ?>

    Auch dieser Versuch war nicht zielführend, im Select-Feld werden keine Einträge angezeigt, ausgenommen "Alle Regionen". Ich vermute mal, dass man aus der flexform nicht direkt auf eine Methode der Reopsitory-Klasse zugreifen kann. Nur wie dann? Mit einer itemsProcFunc? Nur wo muss ich die anlegen/speichern und wie muss die aussehen? An anderer Stelle habe ich gelesen, dass die Methode im Controller implementiert sein muss. Und danach habe ich gestreikt. Jetzt bin ich total verunsichert und irre umher. Wer kann mich zurück auf den Weg bringen?

    Eine Erleuchtung am 1. Advent wäre doch genial, oder? Schon vorab mal ein dickes Dankeschön.

    Johannes.


  • 1
  • Schweriner Schwerine...
    Jedi-Ratsmitglied
    0 x
    554 Beiträge
    60 Hilfreiche Beiträge
    01. 12. 2013, 21:28

    Einen frohen ersten Advent.
    Leider habe ich keine konkrete Antwort für Dich, aber ich denke über das foreign_table_where wird es schwer auf das andere Feld zuzugreifen, aber ich kann morgen mal durch meine Extensions schauen und guck mal ob ich ähnliches schon gemacht habe.

    Ansonsten fände ich eine itemsProcFunc eigentlich gar keine schlechte Lösung. Diese kann wohl sowohl in einem Controller sein, als auch in einer Standalone PHP Dabei (siehe Link, ein required_once wird benötigt). Falls Du es in einem Controller machst, denk an die Namespaces ab TYPO3 6.x

    http://wiki.typo3.org/Extension_Development,_using_Flexforms#Dynamic_Data_in_Flexforms

  • jochla jochla
    Jedi-Ritter
    0 x
    128 Beiträge
    0 Hilfreiche Beiträge
    02. 12. 2013, 10:02

    Danke für deine Antwort.

    Wäre toll, wenn du in deinem Fundus was "ausgraben" würdest :)
    Ich versuche es mal inzwischen mit einer itemsProcFunc im Controller, mal sehen wie weit ich komme ;-)
    Da müsste ich doch mit $this->settings.flexform['field'] (oder settings'flexform.field'] auf den ausgewählten Eintrag zugreifen können, oder?

    Gruß, Johannes.

  • Schweriner Schwerine...
    Jedi-Ratsmitglied
    0 x
    554 Beiträge
    60 Hilfreiche Beiträge
    02. 12. 2013, 17:24

    Zu deiner Frage: Zugriff in Extbase wäre $this->settings['flexform']['field'] - das ist ein Array!
    Und bei foreign table where probier mal nur FIELD:flexform.mainRegion - ohne settings.

  • jochla jochla
    Jedi-Ritter
    0 x
    128 Beiträge
    0 Hilfreiche Beiträge
    02. 12. 2013, 18:22

    FIELD:flexform.mainRegion hat leider auch nicht funktioniert.

    In diesem Post http://typo3.3.n7.nabble.com/how-to-update-a-flexform-on-a-select-change-tt139176.html habe ich noch einen Hinweis von Dimitry Dulepov gefunden. Nur der Hinweis auf die TSRef macht mich wieder kirre, weil ich hier wieder keinen Zusammenhang finde und auch <foreign_field> im Zusammenhang mit der flexform nirgends gefunden habe.

    Ich bin mal deinem Vorschlag gefolgt und habe es mal mit einer itemsProcFunc im Controller versucht, bin dabei aber an einem weiteren Problem hängen geblieben.

    1. <itemsProcFunc>tx_sccruiseplan_Controller_SubRegionController->findInMainRegion()</itemsProcFunc>

    Die Funktion führe ich im Moment noch mit einem fixen Wert (2) für MainRegion aus, um die Funktion an sich erst mal zu testen:

    1. <?php
    2. namespace VENDOR\MyExtension\Controller;
    3.  
    4. class SubRegionController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController {
    5.  
    6. public function findInMainRegion() {
    7.  
    8. $subRegions = $this->subRegionRepository->findByMainRegionAssignment(2);
    9. \TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($subRegions);
    10. $this->view->assign('subRegions', $subRegions); }
    11.  
    12. }
    13. ?>

    Jetzt bekomme ich diesen Fehler angezeigt:

    TYPO3\CMS\Core\Utility\GeneralUtility::callUserFunction
    |No class named tx_sccruiseplan_Controller_SubRegionController|

    Johannes.

  • Schweriner Schwerine...
    Jedi-Ratsmitglied
    0 x
    554 Beiträge
    60 Hilfreiche Beiträge
    02. 12. 2013, 20:34

    Ich sag ja, unter 6.x musst Du Namespaces für die Angabe von Funktionen angeben. Das gilt wohl auch für die Angabe in der itemsProcFunc. Namespace im PHP und deine Angabe in der Flexform haben nicht viel gemeinsam.

  • jochla jochla
    Jedi-Ritter
    0 x
    128 Beiträge
    0 Hilfreiche Beiträge
    03. 12. 2013, 11:51

    Sorry, das hab ich zwar gelesen, aber bei diesem Punkt nicht daran gedacht bzw. nicht berücksichtigt.

    Ich hab es jetzt damit versucht:

    1. <itemsProcFunc>VENDOR\MyExtension\Controller\SubRegionController->findInMainRegion()</itemsProcFunc>

    Keine Fehlermeldung mehr :), aber auch kein Ergebnis, auch keine Debug-Ausgabe #angry# !

    Johannes.

  • jochla jochla
    Jedi-Ritter
    0 x
    128 Beiträge
    0 Hilfreiche Beiträge
    04. 12. 2013, 10:45

    Ich bekomme doch eine Fehlermeldung (devIPmask war nicht richtig gesetzt)!

    TYPO3\CMS\Core\Utility\GeneralUtility::callUserFunction
    |No method name 'findInMainRegion()' in class VENDOR\MyExtension\Controller\SubRegionController|

    Wieso ist die Methode unbekannt? In der ext_localconf.php ist die Action auch eingetragen.

    Johannes.

  • froemken froemken
    Jedi-Ratsmitglied
    0 x
    811 Beiträge
    1 Hilfreiche Beiträge
    04. 01. 2014, 02:05

    Ich würde es nochmal ohne itemsProcFunc versuchen und zwar so in dieser Art:

    <foreign_table>Gebiet_Regions_Tabelle</foreign_table>
    <foreign_table_where>AND main_region_assignment = ###REC_FIELD_settings.flexform.mainRegion### ORDER BY sub_region_name</foreign_table_where>

  • jochla jochla
    Jedi-Ritter
    0 x
    128 Beiträge
    0 Hilfreiche Beiträge
    07. 01. 2014, 09:49

    Danke für den Beitrag.

    Ich hab zwischenzeitlich nicht viel weitermachen können am meiner Extension. Muss mich erst wieder "reinbeißen". Aber der Vorschlag macht einen sympatischen Eindruck. So was verfolge ich schon die ganze Zeit. Werde es also auf jeden Fall mal versuchen und melde mich dann wieder hier.

    Johannes.

  • 1