Zum Inhalt springen

Controller / Action in anderem Controller verwenden?

Erstellt am 28. September 2012 · 19 Antworten · letzte Antwort am 8. Oktober 2012

Tags: Frage

besucher80 ·

Morgen, also ich habe es mal mit der Typoscript Varinate probiert. Wollte nun meine Controller/Action Kombi Country und List ausprobieren. Wenn ich das im Link aufrufe, dann wird mir eine Liste aller Länder ausgegeben. Wenn ich das aber per TS einbinde, dann wird mir nur das Template ausgegeben. Die Länder fehlen aber. Muss da noch was übergeben werden etc?

besucher80 ·

Einen schönen Montag morgen,

ich habe es wie bereits gesagt am WE mit der TypoScript Varinate probiert. Mir wird damit das entsprechende Template ausgegeben. Normaler Text wird mir auch angezeigt allerdigns fehlen die dynamischen Inhalte. Bei meiner Country/list Kombination sollen mir alle Länder aus der Datenbank angezeigt werden. Wenn ich das normal über einen Link aufrufe geht es, bei der TS Version kommen die Länder nicht.

Hat da einer ne Idee?

Um auch nochmal das Thema IndependencyInjection aufzugreifen. Jemand sagte mir:

Bedenke: Damit DI aber funktioniert muss das Objekt in das injiziert wird über die ObjectFactory von ExtBase erstellt werden!

Aber was soll das genau bedeuten? Muss ich das Objekt selber erstellen? Über die ObjektFactory? Wenn ja, wie geht sowas?

Besten Dank
Stefan

besucher80 ·

Guten Morgen, nach tagelangen Versuchen bin ich leider noch immer zu keiner Lösung gekommen. Ich versuche das Problem noch einmal besser darzulegen, in der Hoffnung das mir doch noch jemand den entscheidenen Hinweis geben kann.

Also: Ich habe 2 Controller.

Company und Mailform.

Wenn ich im Link den Company Controller und die Action show aufrufe, dann wird mir eine entsprechende Firma (also die Infos) angezeigt. Siehe angehängtes Bild oben.

Wenn ich im Link den Mailform Controller und die Action create aufrufe, dann wird mir das Formular angezeigt. Siehe angehängtes Bild.

Ich möchte nun aber gerne, dass wenn die Firma angezeigt wird, und im Link der Parameter showForm vorhanden ist, genau dieses Formular im Firmeneintrag angezeigt wird. Siehe angehängtes Bild an der rot markierten Stelle.

Wie kann ich das realisieren? Klar geht das mit einem Partial. Aber macht das Sinn.

das Formular soll auch auf die gleiche linken, und bei Absenden selbstverständlich validiert werden.

Wie kann ich das machen?

Hat jemand bitte irgendeinen Tipp? Hänge seit Tagen hier dran, ohne Erolg.

Vielen Dank

tl24-example.png

kainobi ·
besucher80 schrieb

Morgen, also ich habe es mal mit der Typoscript Varinate probiert. Wollte nun meine Controller/Action Kombi Country und List ausprobieren. Wenn ich das im Link aufrufe, dann wird mir eine Liste aller Länder ausgegeben. Wenn ich das aber per TS einbinde, dann wird mir nur das Template ausgegeben. Die Länder fehlen aber. Muss da noch was übergeben werden etc?

Hast Du denn im TypoScript eine StoragePid angegeben? Wenn nicht, dann mach das mal...

besucher80 ·

Aha Aha Aha, da lag der Fehler. Mit der StoragePid geht es. Mir werden nun die Länder ausgegeben. Das war ja nun ein test ob das so geht aber wie wende ich das nun auf mein Formular an? Ich möchte ja das Formular inmitten des Firmeneintrag anzeigen, was ja so machbar ist. Aber wenn das Formualr abgesendet wird, soll es ja zur gleiche Seite gehen und die Felder sollen validiert werden, Erst bei erfolgreicher Vailidierung soll eine Mail versendet werden. Ist das technisch möglich?

Trotzdem besten Dank für die Hilfe. Auf die StoragePid wäre ich beim Besten Willen nicht gekommen 🙂

kainobi ·

Das sollte recht einfach sein. Ich gehe davon aus, dass Dein Formular so bereits funktioniert, ansonsten würde ich das als erstes mal fertig implementieren.

Dann musst Du nur noch in deinem <f:form> Tag alles richtig angeben:

<f:form action="submit-action für dein Formular" name="mailform" object="{mailform}" addQueryString="TRUE">

Mit addQueryString="TRUE" stellst Du sicher, dass in der Form-Action-Url auch die notwendigen Arguments für deinen Company-Controller enthalten sind. Somit bleibst Du auch auf dieser Seite, auch wenn Du dein Formular an die entsprechende Action aus dem Mailform-Controller submittest. Extbase macht das im Hintergrund richtig und ruft beide Actions auf...

Noch ein Tipp: Wenn mal irgendwelche Repository-Daten nicht ausgegeben werden, ist die erste Anlaufstelle die Klasse Tx_Extbase_Persistence_Storage_Typo3DbBackend. In der Methode getObjectDataByQuery() kannst Du dir die fertige SQL-Query ausgeben lassen. Damit lassen sich solche Fehler recht schnell finden.

besucher80 ·

Ok, wenn ich Dich also richtig verstehe, mach ich folgendens:

Wenn jemand bei den Firmeninfos ist und auf anfrage senden klickt, dann prüfe ich ob entsprechender Parameter gesetzt ist und zeige das Formular an z.B. mit nem Partial. Das Formular verlinke ich auf die Send Action des Mailform Controllers. Und mit addQueryString werden alle bereits vorhandenen Parameter mit an den Link gehängt. Ich bleibe also auf der aktuellen Seite und es wird trotzdem die Send Action ausgeführt? Kann das grad nicht testen aber so ist es richtig oder? Hm, da hab ich nochmal ne Frage. Wenn jemand auf den anfrage senden klickt sieht der link so aus:

http://mydomain.de/firmen/1/anfrage/

Wenn ich nun das Formular absende, werden dann der Mailform Controller und die Send Action mit an den Link gehängt? Also :

http://mydomain.de/firmen/1/anfrage/neu?Controller=Mailform&Action=Send

Wie gesagt kann es leider grad nicht testen aber das ist nochmal interessant zu wissen.

besucher80 ·

Hi, danke. Kann mich nur bedanken für deine Hilfe. Aber genau das sollte grad nicht erfolgen. Vielleicht ist es Extbase/Fluid technisch nicht anders zu lösen. Aber diese zusätzlichen Controller/Action sollen halt nicht im Link auftauchen. Das ist ja auch mein Problem. Wie ich das umsetzen kann, ohne das von der Mailform der Controller oder ne Action im Link auftaucht. Es müsste direkt aus dem Company Controller (mit dem der Firmeneintrag gesteuert) angesprochen werden. Ach, zum Haare raufen. Daher ja auch meine Anfangsfrage. Ob ich aus meinem Company Conrtroller auf den Mailform Controller und deren Funktionen zugreifen kann. Ich denke das wäre dann alles einfacher zu handeln.

kainobi ·

Wie gesagt, mit Deiner anderen Methode wirst Du mMn. keinen Erfolg haben. Allerdings frage ich mich, was daran schlimm ist, wenn der zusätzliche Controller & Action in der Url auftaucht. Wen stört so ein Detail? Zusätzlich lässt sich das doch per RealUrl zumindest weniger offensichlich machen.

besucher80 ·

Hey, ist leider ein Kundenwunsch. Den interessiert es leider. Aber was anderes. Ich habe erst einige Extensions mit Extbase gemacht. Alle meinstens mit einem Controller. Nun habe ich allerdings in einer Extension 2 Controller. Als Beispiel nehmen wir mal Text und Merkzettel Controller. Innerhalb des Text Controllers gibt es nun die Actions list und show für eine einfache Listen und Detailansicht. Soweit so gut. Ich habe in der Detailansicht nun einen Link eingefügt, mit dem ich den Text auf den Merkzettel setzen möchte. Ich habe einfach das Text Objekt als argument im Link übergeben und als Controller "Notepad" und als Action "add" angegeben. Wie nehme ich aber in der add Action nun das Text Object entgegen. Wie muss dafür die Annotation aussehen? Wie kann ich generell einfache Parameter übergeben und in anderen Methoden nutzen? Ich habe das mit den Annos noch nicht 100% verstanden. Hast Du da auch nen Tipp evtl.? Danke 🙂

besucher80 ·

Hi, ja ne klar. Hab mich wohl falsch ausgedrückt. Das klang jetzt sehr hilfebedürftig 🙂 Also vielen Dank für die Hilfe. Hab es jetzt soweit erstmal hinbekommne. Eine Frage ist noch offen. Also Beispiel: Ich habe ein Album Objekt und ein Merkzettel Objekt. Ich möchte nun bei Klick ein entsprechendes Album auf den Merkzettel setzen. Das geht auch soweit. Allerdings hab ich beim Merkzettel eine 1:1 Relation zum Album. Also ich übergebe im Link das Album Objekt an den Merkzettel. Dort erstelle ich ein neues Objekt und setze dort das Album auf die übergebene ID. Allerdings wird mir nun immer ein neues Objekt erstellt. Kann ich irgendwie prüfen ob die ID schon in der DB vorhanden ist. Ich dachte an findByAlbum, aber das geht nicht. DEnn Album ist ja keine Eigenschaft sondern ne Relation. Hat jemand ne Idee dazu?

kainobi ·

Es ist sehr schwer nachzuvollziehen, was Du genau meinst, wenn Du nicht den entsprechenden Code postest ;-)

Eigentlich sollte dein Album doch einen Getter getMerkzettel() haben. Damit kannst Du abfragen, ob schon ein Merkzettel existiert...

besucher80 ·

Hi, (danke) also in meinem Album habe ich keine Getter Methode. Hab nur beim Merkzettel ne Getter Funktion = getAlbum(); Also ich übergebe das Album Objekt an den Merkzettel. Hier mal mein Code womit das Album auf den merzettel soll. Klar, das geht soweit. Es werden mir die Alben mehrfach in die DB eingetragen , was ich gerne verhindern möchte:

/**
	 * action add
	 *
	 * @param Tx_SkruseExample_Domain_Model_Album $album
	 * @return void
	 */
	public function addAction(Tx_SkruseExample_Domain_Model_Album $album = NULL) {
		
		// Falls kein gültiger Wert übergeben wurde, Fehlermeldung erstellen und umleiten
		if( $album === NULL ) {
			$this->flashMessageContainer->add('Es wurde kein gültiges Album übergeben.');
			$this->redirect('list','Album');
		}
		
		// Objekt im auf Merkzettel speichern
		$notepad = $this->objectManager->create('Tx_SkruseExample_Domain_Model_Notepad');
		$notepad->setAlbum($album);
		$this->notepadRepository->add($notepad);
		$this->flashMessageContainer->add('Das Album wurde erfolgreich zum Merkzettel hinzugefügt.');
		$this->redirect('list','Album');		
		
	}
kainobi ·

Dann würde ich den entsprechenden Getter (und Setter) im Album-Model anlegen. Natürlich musst Du im Album-TCA auch das entsprechende Feld anlegen. Die Definition sollte genau umgekehrt sein, wie im Notepad-TCA für das Album-Feld. Wahrscheinlich brauchst Du hier die Angabe 'foreign_field' um auf das richtige Feld mit dem Foreign Key zu verweisen. (Anzeigen musst Du das Feld im Backend nicht, falls es Dich stört)

Dann kannst Du nämlich ganz einfach im Controller abfragen:

if ($album->getNotepad() === NULL) {
$notepad = $this->objectManager->create('Tx_SkruseExample_Domain_Model_Notepad');
....
}