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


_______________________________________________
TYPO3-german mailing list
TYPO3-german@lists.typo3.org
http://lists.typo3.org/cgi-bin/mailman/listinfo/typo3-german

Antwort per Email an