[TYPO3-german] Re: ein 'Oops' Fehler bei Create

Uwe Keller uwe.keller at uk-cons.de
Sun Mar 22 08:02:20 CET 2015


Hallo, zusammen,

nachdem ich gestern etwas genervt war, jetzt mal ein bisschen ausführlicher. Dies ist meine erste extbase Extension. Es geht dabei um unsere Vereinsseite, die bisher noch unter Typo3 4.0.5 lief. Ich habe sie jetzt upgedatet auf 7.1, muss nun aber auch die Erweiterung für unsere Regatta-Anmeldung neu schreiben.

Die Anwendung besteht aus zwei Datenbanktabellen (Regatta enthält Infos zu Regatten und meldeliste enthält die gemeldeten Teilnehmer) die UID von Regatta (natürlich heißen die Tabellen wie in extbase vorgegeben) wird in meldeliste im Feld 'regatta_id' gespeichert.

Das Grundgerüst habe ich mir mit dem Extension Builder erstellt, Änderungen später per Hand nachgetragen (zusätzliche Felder, Änderungen des Datentyps etc). Habe auch alle stellen gefunden (incl. casts), wo das passieren muss.

Im Frontend brauche ich drei Funktionen: eine Regatta-Liste, eine Liste der Teilnehmer pro Regatta und ein Anmeldeformular. Ich habe deshalb quasi 3 Plugins für die Funktionen angelegt.

\TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin(
	'Ycu.' . $_EXTKEY,
	'Ycu1',
	array(
		'Meldeliste' => 'list,new,create,edit,update,delete',

	),
	// non-cacheable actions
	array(
		'Meldeliste' => 'list,new,create,edit,update,delete',

	)
);

\TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin(
	'Ycu.' . $_EXTKEY,
	'Ycu2',
	array(
		'Meldeliste' => 'new,create,edit,update,delete,list',

	),
	// non-cacheable actions
	array(
		'Meldeliste' => 'new,create,edit,update,delete,list'

	)
);

\TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin(
	'Ycu.' . $_EXTKEY,
	'Ycu3',
	array(
		'Regatta' => 'list,new,create,edit,update,delete',

	),
	// non-cacheable actions
	array(
		'Regatta' => 'list,new,create,edit,update,delete',

	)
);

Meine erste Frage: Habe ich das Konzept so richtig verstanden? Macht man das so?

Ich habe nun drei Seiten mit den Plugins angelegt, die ersten beiden (Regatta-Liste und Meldeliste)  sind fertig.
Nun zur dritten Funktion, der Meldung:
- die new Action wird durchlaufen und abgearbeitet (code folgt). 
     - allerdings wird kein Model übergeben (NULL), ist das so korrekt?
- die Eingabemaske wird aufgerufen (ohne neues Modell), ich kann sie ausfüllen.
- Anschliessend werden die Daten gesendet und ich erhalte umgehend ein 'Oops' ohne weitere Erklärung

Form - Definition:
    <f:form action="create"  name="newMeldeliste" object="{newMeldeliste}">
        <f:render partial="Meldeliste/FormFields" arguments="{_all}"/>
	        <f:form.submit value="Absenden" />
     </f:form>

Ich weiß eigentlich nicht einmal, ob die create Action überhaupt aufgerufen wird, denn ich weiss garnicht, was nach dem Absenden passiert:
- Wie passiert den das Mapping der Properties?
- Welche Funktionen werden noch durchlaufen?



Hier nun der Code new Action (Kommentare und Fragen inside):

	public function newAction(\Ycu\YcuRegatta\Domain\Model\Meldeliste $newMeldeliste = NULL) {

 // First of all we need some arrays for regatta ans nation
		$nations = array('','AUT', 'CRO','BY','G','GER','ITA','POL','NED','SUI');
		$this->view->assign('nations', $this->getCategories($nations));

	// Regatten --> Warum i9st denn das regattaRepository nicht NULL? @inherit?
		if (!is_null($this->regattaRepository)) {
			$regattas = $this->regattaRepository->findAll();

			/*****************************************************
			* Array für die Regatten bauen...
			* ****************************************************/
			$regatta = array();
			$i = 0;
			foreach ($regattas as $reg) {
				$regatta[$i][uid] = $reg->getUid();
				$termin = $reg->getRegattaTermin();
				$regatta[$i][name] = $reg->getRegattaName().
							' ('.$termin->format('d.m.Y').')';
				$i++;
				}

			$this->view->assign('regattas',  $this->getCategoriesRegattas($regatta));

		}
		
		// mehrere Versuche mit newMeldeliste == NULL führten zu nichts. Die Eingabemaske liess sich zwar aufrufen
                // und ausfüllen, nach dem Absenden kam aber wieder 'Oops'
                // Da ich mir nicht vorstellen kann, dass das Model objekt NULL sein darf, lege ich mal eins an
		
		if (is_null($newMeldeliste)) {
                          //3. Versuch - Ergebnis: Anmeldemaske wird nicht aufgerufen, 'Oops' Fehler
		         //$objectManager = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\CMS\Extbase\Object\ObjectManager');
		        //$newMeldeliste = $objectManager->get('\Ycu\YcuRegatta\Domain\Model\Meldeliste');
			
                         //2. Versuch - Ergebnis: Anmeldemaske wird nicht aufgerufen, 'Oops' Fehler
                        //$newMeldeliste = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('\Ycu\YcuRegatta\Domain\Model\Meldeliste');

                        // 1. Versuch -> brachte Fatal Error, nach googeln auf GIT bug gefunden und korrigiert.
                       // Eingabemaske wird aufgerufen, leeres Modell (ohne Werte) ist vorhanden
                       // Allerdings nach Absenden wieder 'Oops'
			$newMeldeliste = new \Ycu\YcuRegatta\Domain\Model\Meldeliste;

		}
		
		$this->view->assign('newMeldeliste', $newMeldeliste);
	}

Hier noch der Code der create Action (Standard, wie vom Extension builder angelegt)

	public function createAction(\Ycu\YcuRegatta\Domain\Model\Meldeliste $newMeldeliste) {
		$this->addFlashMessage('Eine neue Meldung wurde angelegt');
		$this->meldelisteRepository->add($newMeldeliste);
		$this->redirect('index');
	}

Vielleicht habe ich ja auch einen grundsätzlichen Denkfehler drin, ich wäre froh, wenn mir jemand helfen könnte.

Herzlichen Gruß

Uwe




More information about the TYPO3-german mailing list