Zum Inhalt springen

Objekt wird erstellt, allerdings bleiben die properties leer

Erstellt am 28. März 2013 · 8 Antworten · letzte Antwort am 30. März 2013

Tags: Fluid, Frage

BjoernBoba ·

Guten Abend,
Bei der Erstellung einer Extension habe ich zur Zeit folgendes Problem:
Ich möchte im Frontend in einem Textfeld eines Formulars etwas eingeben, was in einem neuen Objekt der Klasse "Answer" abgespeichert wird. Die Klasse "Question" hat zur Zeit keine sonderlichen Funktionen. Ich erstelle nur eine davon im Backend, die das besagte Textfeld repräsentiert.
Durch klicken des "Submit"-Buttons wird auch ein neues Objekt erstellt. Dies weiß ich daher, dass ich mir in der drauffolgenden View mit einer for-each Schleife pro gespeicherten "Answer" ein kurzes "Test" ausgeben lasse. Allerdings wird die durch das Textfeld zu füllende Property einfach leer abgespeichert. Zudem wird auch das Datum, dass eigtl automatisch gespeichert werden sollte leer gelassen.

Ich weiß, dass das jetzt viele Dateien sind, die man sich durchlesen müsste.
Aber vielleicht ist es auch etwas ganz simples, was jemanden, der etwas mehr Erfahrung hat, direkt auffällt.
Meine Vermutung ist, dass evtl irgendetwas in der list.html der Question im Formular nicht ganz korrekt ist. Zum Beispiel irgendetwas mit dem "newAnswer" oder der Property.

Im folgenden poste ich die betroffenen Code-Auszüge.
Ich hoffe, dass sich vlt. jemand die Zeit nimmt und sich das Ganze mal kurz anguckt.

1. Die Klasse "Answer":

<?php
class Tx_Survey_Domain_Model_Answer extends Tx_Extbase_DomainObject_AbstractEntity{

	/**
	 * recording date
	 *
	 * @var DateTime
	 */
	protected $date;

	/**
	 * @var string
	 **/
	protected $answer;

	public function __construct() {
		$this->date = new DateTime();
	}

	/**
	 * @param DateTime $date
	 * @return void
	 */
	public function setDate(DateTime $date) {
		$this->date = $date;
	}

	/**
	 * @return DateTime
	 */
	public function getDate() {
		return $this->date;
	}

	/**
	 * @param string $answer
	 * @return void
	 */
	public function setAnswer($answer) {
		$this->answer = $answer;
	}

	/**
	 * @return string
	 */
	public function getAnswer() {
		return $this->answer;
	}


}

?>

2. Auflistung der "Answers": Templates/Answer/list.html

<h2>Begin all answers:</h2>
<f:for each="{answers}" as="answer">
	<f:format.date>{answer.date}</f:format.date>
	<p>Test</p>
</f:for>
<h2>End all answers:</h2>
<f:link.action action="list" controller="Question"> click </f:link.action>

3. Der "Answer"-Controller: Controller/AnswerController.php

<?php
class Tx_Survey_Controller_AnswerController extends Tx_Extbase_MVC_Controller_ActionController {

	/**
	 * @var Tx_Survey_Domain_Repository_AnswerRepository
	 */
	protected $answerRepository;


	/**
	 * @return void
	 */
	public function initializeAction() {
		$this->answerRepository = t3lib_div::makeInstance('Tx_Survey_Domain_Repository_AnswerRepository');
	}
	
	/**
	 * @return string
	 */
	public function listAction() {
		$answers = $this->answerRepository->findAll();
		$this->view->assign('answers', $answers);
	}
	
	/**
	 * @param Tx_Guestbook_Domain_Model_Answer $newAnswer
	 * @return void
	 */
	public function createAction(Tx_Survey_Domain_Model_Answer $newAnswer) {
		$this->answerRepository->add($newAnswer);
		$this->redirect('list', 'Answer');
	}

}
?>

4. Der "Question"-Controller: Controller/QuestionControllor.php:

<?php
class Tx_Survey_Controller_QuestionController extends Tx_Extbase_MVC_Controller_ActionController {

	/**
	 * @var Tx_Survey_Domain_Repository_QuestionRepository
	 */
	protected $questionRepository;

	/**
	 * @return void
	 */
	public function initializeAction() {
		$this->questionRepository = t3lib_div::makeInstance('Tx_Survey_Domain_Repository_QuestionRepository');
	}

	/**
	 * @param Tx_Survey_Domain_Model_Answer $newAnswer
	 * @return string
	 * @dontvalidate $newAnswer
	 */
	public function listAction(Tx_Survey_Domain_Model_Answer $newAnswer = NULL) {
		$questions = $this->questionRepository->findAll();
		$this->view->assign('questions', $questions);
		$this->view->assign('newAnswer', $newAnswer);
	}

}
?>

5. Der View der Question mit dem Eingabefeld: Templates/Question/list.html

<f:form method="post" controller="Answer" action="create"
	name="newAnswer" object="{newAnswer}">
	<f:for each="{questions}" as="question">
		<strong>{question.name}</strong>
		<fieldset>
			<legend>{question.frage}</legend>
			<div>{question.subtext}</div>
			<f:form.textfield property="answer" />
		</fieldset>
		<br>
	</f:for>
	<f:form.submit class="submit" value="Abschicken" />
	<f:link.action action="list" controller="Answer"> click </f:link.action>
</f:form>

6. Der Eintrag in der ext_tables.sql:

#
# Table structure for table 'tx_survey_domain_model_answer'
#
CREATE TABLE tx_survey_domain_model_answer (
    uid int(11) unsigned DEFAULT '0' NOT NULL auto_increment,
    pid int(11) DEFAULT '0' NOT NULL,
    
    date int(11) DEFAULT '0' NOT NULL,
    answer varchar(255) DEFAULT '' NOT NULL,
    
    PRIMARY KEY (uid),
    KEY parent (pid),
);

Ich bin für jede Hilfeleistung sehr dankbar.
Daher schonmal vielen Dank im Voraus!

Mit freundlichen Grüßen
BjoernBoba

BjoernBoba ·

Ach ja bei
2. Auflistung der "Answers": Templates/Answer/list.html
steht innerhalb der Schleife natürlich auch noch eine Zeile

<p>{answer.answer}</p>
kainobi ·

Ich sehe hier spontan keine Fehler. Vielleicht stimmt am TCA etwas nicht. Kannst Du den mal posten?
Und kannst Du mal schauen, ob $newAnswer korrekt befüllt an Deine createAction übergeben wird?

BjoernBoba ·

Hey,schonmal danke für deine Antwort 🙂

Mir kommt da grad ein Gedanke, bzw. fällt mir was auf.
In meiner ext_tables.php hab ich halt gar nichts von meiner Klasse "Answer" stehen, weil ich dachte da werden nur die Eingabemasken fürs Backend erzeugt. Da ich aber keine "Answer" im Backend erstelle, steht da nichts.
Muss da dann trotzdem irgendwas rein?

Wie kann ich das denn testen?
Mit einer create.html an die ich $newAnswer übergebe?

kainobi ·

Ja, Extbase benötigt auf jeden Fall den TCA. D.h. sowohl den Eintrag in ext_tables.php als auch entsprechende TCA-Datei. Das ist sicher die Ursache für Dein Problem.

BjoernBoba ·

Okay viele Dank.

Auch meine ganzen Angaben zu der Klasse "Question" steht bisher noch in der ext_tables.php, also ich habe noch nichts in eine externe TCA ausgelagert.
Weißt du vielleicht gerade welche Einträge die TCA für die "Answer" benötigt?

kainobi ·

Am guckst Du es Dir bei einer anderen Extension ab. Oder Du nimmst den Extension Builder und lässt es Dir generieren. Aber Vorsicht, der überschreibt Dir alles, wenn Du den nicht richtig konfigurierst. Im Zweifelsfall eine neue Extension erzeugen und dann alles in die richtige Extension übertragen.

Hilft das weiter?

BjoernBoba ·

Danke, kainobi, es funktioniert. Die fehlenden Codezeilen in der ext_tables.php waren die Ursache.
Objekt wird erstellt und abgespeichert. Auch wird jetzt der Inhalt des Textfeldes abgespeichert und ich kann ihn mir ausgeben lassen.

EDIT: Probleme mit dem DateTime waren auch eher dümmerer Natur 🙂