Zum Inhalt springen

Formular springt nicht zum angegebenen Controller

Erstellt am 14. Juni 2010 · 9 Antworten · letzte Antwort am 23. Juni 2010

Tags: Frage

eddy ·

Hallo Typo3 Gemeinde,

im Fluidtemplate habe ich ein einfaches Formular, welches nach Betätigen des Submitbuttons zur create-action des Controllers "Post" springen sollte:

<f:form action="create" controller="Post" method="post" name="newPost" object="{newPost}" arguments="{blog : blog}">
<label for="name">Post-Titel: <span class="required">(required)</span></label><br />
<f:form.textbox property="title" /><br />
<f:form.submit value="Post anlegen" /> 
</f:form>

Leider tut er dies nicht und landet immer in der index-action des anderen Blog-Controllers.

Im PostController existiert die create-Action. Mit einem echo innerhalb der Methode konnte ich feststellen, das diese nicht angesprochen wird:

/**
 * @param Tx_Simpleblog_Domain_Model_Blog $blog Der zugehörige Blog
 * @param Tx_Simpleblog_Domain_Model_Post $newPost Das neue Postobjekt
 * @return void
 */
public function createAction(Tx_Simpleblog_Domain_Model_Blog $blog, Tx_Simpleblog_Domain_Model_Post $newPost) {
		$blog->addPost($newPost);
		$this->redirect('index', 'blog', NULL, array('blog' => $blog));
}

Und in der ext_localconf.php wurde neben "Blog" auch "Post" konfiguriert:

Tx_Extbase_Utility_Extension::configurePlugin(
$_EXTKEY,						
'Pi1',							
array(
   'Blog' => 'index,add,create,edit,update,delete',
   'Post' => 'index,add,create,edit,update,delete'
),
array(
   'Blog' => 'add,create,edit,update,delete',
   'Post' => 'add,create,edit,update,delete'
)
);

Ich kann keinen Fehler entdecken und auch weitere Recherchen haben mich nicht weitergebracht. Habt Ihr evtl. einen Tipp oder seht Ihr einen Fehler hier im Code?

Danke
Eddy

kainobi ·

Hallo eddy,

was mir auffällt ist, dass Du in Deiner createAction einen redirect zur indexAction des Blog-Controllers machst.
(Wobei, müsste es nicht $this->redirect('index', 'Blog', NULL, array('blog' => $blog)); heissen?)

Wenn Du vor dem redirect ein echo machst, siehst du das imo auch nicht, weil vor der Ausgabe bereits der Header für den redirect gesendet wird.

eddy ·

Hallo kainobi,

vielen Dank für die Hinweise. Die Schreibweise des 'blog' im redirect hat jedoch keine Auswirkungen, dürfte also egal sein ob 'blog' oder 'Blog'.

Trotzdem hat mich Dein Hinweis mit dem 'echo' weitergebracht. Ich habe nämlich nun den redirect auskommentiert und siehe da, das echo in der create-Action wird ausgegeben und eine entsprechende addPost-Methode im Blog-Modell wird auch erreicht. Das Formular und die Weiterleitung scheinen also zu tun.

Muss jetzt nun recherchieren, warum ein neues Post trotzdem nicht in die Datenbank geschrieben wird.

Vielen Dank
Eddy

kainobi ·

Hm, was macht denn die addPost-Methode?
Die Daten werden immer über ein Repository gespeichert, die Domain-Models selber haben ja kein Wissen über ihre Persistenz. Also wenn Du in Deiner addPost-Methode nichts an das Repository (Post- oder Blog-Repo.) übergibst (dort würde es eigentlich auch nicht wirklich hingehören), dann passiert diesbezgl. gar nix...

Falls Du das aus dem Blog-Example hast, dann ist da meiner Meinung nach ein Fehler drin. Sie Dir dort zum Vergleich mal die createAction des Blog-Controllers an.

Wenn ich mich da irre, möge man mich bitte berichtigen...

eddy ·

Hallo kainobi,

die ganze Geschichte hier bezieht sich auf das Blog-Beispiel des neuen Buches "Typo3-Extensions" von Ebner, Lobacher. Das dort verwendete Blog-Beispiel ist sehr nah an das angesprochene Blog-Example angelehnt. Das Buch ist jedoch mit sehr vielen Fehlern behaftet 🙁 .

Die addPost-Methode soll ein einzelnes Posting in das Post-Objekt ($posts) aufnehmen. Es sieht so aus:

/**
 * 
 * @param Tx_Simpleblog_Domain_Model_Post $post
 * @return void
 */
public function addPost(Tx_Simpleblog_Domain_Model_Post $post) {
 $this->posts->attach($post);
}

Während $posts im Blog-Model als ObjectStorage definiert ist:

/**
 * 
 * @var Tx_Extbase_Persistence_ObjectStorage<Tx_SimpleBlog_Domain_Model_Post>
 * @lazy
 */
protected $posts;

und die "systemeigene" attach-Methode vorhanden ist.

Ein PostRepository existiert auch, jedoch ohne zusätzlichen Code

class Tx_Simpleblog_Domain_Repository_PostRepository extends Tx_Extbase_Persistence_Repository {
}

Sehr merkwürdig
Eddy

kainobi ·

Hallo eddy,

wie ich schon vermutet hatte... das kann so nicht gehen.
In der addPost-Methode wird nix gespeichert. Der ObjectStorage ist nur ein Objekt-Container (ähnlich wie ein Array), persistiert (speichert) aber keine Objekte.

Extbase implementiert das DataMapper-Pattern. D.h. dass die Domain-Objekte völlig getrennt von der Persistenz-Schicht sind, also überhaupt nicht wissen ob und wie sie gespeichert werden. Dafür sind eben die einzelnen Repositories zuständig.

Probier mal folgendes:

public function createAction(Tx_Simpleblog_Domain_Model_Blog $blog, Tx_Simpleblog_Domain_Model_Post $newPost) {
		$newPost->setBlog($blog);
		$postRepository = t3lib_div::makeInstance('Tx_Simpleblog_Domain_Repository_PostRepository');
		$postRepository->add($newPost);
		$this->redirect('index', 'blog', NULL, array('blog' => $blog));
}

Würde Dir grundsätzlich empfehlen, Dich nebenher noch etwas mit Design Patterns zu beschäftigen ;-)

eddy ·

Hallo kainobi,

danke für die Unterstützung und die Ausdauer 🙂
Habe nun Deinen Vorschlag eingebaut und bin einen Schritt weiter. Es wird jetzt das Posting sowie die UID des entsprechenden Blogs in die "Post"-Tabelle eingetragen.

Der Querverweis zur Tabelle "Blog" wird jedoch noch nicht hergestellt, also der Eintrag der Posting-UID beim entsprechenden Blog in der "Blog"-Tabelle. Damit existiert jetzt ein Posting, nur "weiss" das Blog nichts davon. Dies dachte ich eigentlich mit dem Aufruf in der createAction

$blog->addPost($newPost);

bewerkstelligen zu können.

Hinter der addPost-Methode verbirgt sich ja im Blog-Model folgende Methode:

/**
 * 
 * @param Tx_Simpleblog_Domain_Model_Post $post
 * @return void
 */
public function addPost(Tx_Simpleblog_Domain_Model_Post $post) {
	$this->posts->attach($post);
}

Hänge gerade total in den Seilen und die Übersicht schwindet, je mehr ich mich da reindenke :o

kainobi ·

Hallo eddy,

dann dreh doch meinen Vorschlag einfach um ;-)
D.h. $blog->addPost($newPost), dann statt dem Post-Repo das Blog-Repo instanzieren und das Blog an die update-Methode übergeben (kein add, weil das Blog ja schon existiert)...

fcool ·

Hi Eddy!

Ich hatte das Problem, dass die Verknüpfungen nicht gespeichert wurden, die letzten beiden Tage auch und währe fast wahnsinnig geworden.

Versuch mal ein PHP 5.3 zu installieren. Denn seit heute läuft alles. Und das einzige, dass ich tatsächlich verändert habe, ist die PHP - Version.

eddy ·

Hallo fcool,

die PHP Version ist leider nicht das Problem, da diese (Version 5.3.1) schon von Beginn an in einer frisch aufgesetzten Entwicklungsumgebung läuft.

Ich arbeite noch an den hilfreichen Vorschlägen von kainobi und versuche (durch diverse Kombinationen und austesten) dabei die Auswirkungen in der Datenbank zu verstehen.
So richtig will es aber immer noch nicht, da in den einzelnen Blogdatensätzen der Blogtabelle (Feld: posts) einfach keine Querverweise auf entsprechende Postings (also die UIDs der Posts) aufgenommen werden.
Ich kämpfe weiter 😉

Eddy