Zum Inhalt springen

Extbase Plugin / Flexform: Select-Einträge filtern

Erstellt am 1. Dezember 2013 · 9 Antworten · letzte Antwort am 7. Januar 2014

Tags: Extbase, FlexForms, Frage

jochla ·

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! :-)

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

Domain Model:
MainRegion 1----* SubRegion

Flexform:

<settings.flexform.mainRegion>
	<TCEforms>
		<label>Revier:</label>
		<onChange>reload</onChange>
		<config>
			<type>select</type>
			<items type="array">
				<numIndex index="0" type="array">
					<numIndex index="0">Alle Reviere</numIndex>
					<numIndex index="1">0</numIndex>
				</numIndex>
			</items>
			<foreign_table>tx_sccruiseplan_domain_model_mainregion</foreign_table>
			<foreign_table_where>ORDER BY main_region_name</foreign_table_where>
			<minitems>0</minitems>
			<maxitems>1</maxitems>
		</config>
	</TCEforms>
</settings.flexform.mainRegion>
<subRegionSelector>
	<TCEforms>
		<label>Gebiet / Region:</label>
		<displayCond>FIELD:settings.flexform.mainRegion:REQ:true</displayCond>
		<config>
			<type>select</type>
			<items type="array">
				<numIndex index="0" type="array">
					<numIndex index="0">Alle Regionen</numIndex>
					<numIndex index="1">0</numIndex>
				</numIndex>
			</items>
			<foreign_table_where>AND (main_region_assignment = 2) ORDER BY sub_region_name</foreign_table_where>
			<minitems>0</minitems>
			<maxitems>1</maxitems>
		</config>
	</TCEforms>
</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:

<itemsProcFunc>tx_myextension_Domain_Repository_SubRegionRepository->findInMainRegion()</itemsProcFunc>
class SubRegionRepository extends \TYPO3\CMS\Extbase\Persistence\Repository {
	public function findInMainRegion($mainRegion) {
		$query = $this->createQuery();
		$query->matching(
			$query->equals('mainRegionAssignment', 2)
		);
		return $query->execute();
	}
}
?>

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.

Schweriner ·

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 ·

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 ·

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 ·

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.

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

<?php
namespace VENDOR\MyExtension\Controller;

class SubRegionController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController {

public function findInMainRegion() {
	
	$subRegions = $this->subRegionRepository->findByMainRegionAssignment(2);
        \TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($subRegions);
	$this->view->assign('subRegions', $subRegions); }

}
?>

Jetzt bekomme ich diesen Fehler angezeigt:

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

Johannes.

Schweriner ·

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 ·

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

Ich hab es jetzt damit versucht:

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

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

Johannes.

jochla ·

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 ·

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 ·

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.