2016-07-26 13 views
2

Wenn ich auf die Schaltfläche zum Senden von Daten aus meinem SilverStripe Formular an die Datenbank (xampp, mysql) klicken, leitet es mich nicht zurück auf die Formularseite. Stattdessen wird es umgeleitet zu {BaseUrl}name_of_controller/name_of_form -> in meinem Fall: localhost/pmtool/DeveloperController/NewTaskMask. Ich habe stundenlang nach der Lösung dieses Problems gesucht, aber ohne Erfolg.SilverStripe Formular Umleitung Fehler

Hier ist der Code der Datei, in der das Formular und die Aktion definiert ist. In einer anderen HTML-Datei wird das Formular über $NewTaskMask aufgerufen. Durch die URL localhost/pmtool/developer/newtask wird die Funktion renderNewTaskForm aufgerufen, die Vorlage mit $NewTaskMask wird gerendert.

Alle Felder wie Titel, Beschreibung usw. sind in der Datenbank vorhanden.

class DeveloperController extends ContentController { 

    private static $allowed_actions = array('NewTaskMask','renderNewTaskForm'); 

    private static $url_handlers = array(
     'newtask' => 'renderNewTaskForm' 
    ); 

    public function renderNewTaskForm(SS_HTTPRequest $request) { 
     return $this->renderWith('NewTaskForm'); 
    } 

    public function NewTaskMask() { 
     $fields = new FieldList(
      TextField::create('Title','Title') 
       ->setAttribute('autocomplete', 'off') 
       ->setAttribute('placeholder', 'Enter a task title ...'), 
      TextareaField::create('Description','Description') 
       ->setAttribute('autocomplete', 'off'), 
      DropdownField::create('Project','Project', Project::get()->map('ID','Title')), 
      DropdownField::create('Developer','Developer', Developer::get()->map('ID','Title')) 
     ); 

     $actions = new FieldList(FormAction::create('doCreateT','Task anlegen')); 

     $requiredFields = new RequiredFields(array('Title')); 

     return new Form($this, 'NewTaskMask', $fields, $actions, $requiredFields); 
    } 

    public function doCreateT($data, $form) { 

     // Creating a new task record 
     $nT = new Task(); 

     $nT->Title = $data['Title']; 
     $nT->Description = $data['Description']; 
     $nT->Project = $data['ProjectID']; 
     $nT->Developer = $data['DeveloperID']; 
     $nT->write(); 

     // Create a nice msg for our users 
     $form->sessionMessage('Task angelegt!','good'); 

     // Redirect back to the form page 
     return $this->redirectBack(); 
    } 
} 

Antwort

1

scheint ein Problem mit Routing. Ich nehme an, Sie haben die Route developer auf DveloperController festgelegt. Wenn ich dasselbe mache, könnte ich deinen Fehler reproduzieren.

Ich versuchte explizit eine andere Route für DeveloperController hinzufügen, um die DeveloperController Controller zu treffen, weil es nicht richtig umgeleitet wurde. Es ist ein ziemlich seltsames und magische fix und um ehrlich zu sein bin ich nicht sicher, warum es funktioniert, aber es löste es:

--- 
Name: mysiteroutes 
After: framework/routes#coreroutes 
--- 
Director: 
    rules: 
    'developer//$Action/$ID/$Name': 'DeveloperController' 
    'DeveloperController//$Action/$ID/$Name': 'DeveloperController' 

Aktualisieren Sie die Routen mit Ihrem Setup entsprechen und nicht vergessen ?flush hinterher zu laufen.

Vielleicht kann jemand mit mehr Einblick erklären, was vor sich geht.

+0

thx Janne für Ihre Antwort, aber: es jetzt wieder, okay gut leitet, aber die Wirkung der Form ("doCreateT") wird nicht aufgerufen werden. Sie können dies überprüfen, wenn Sie ein Echo ("Hallo") setzen; Befehle in der Aktion. Es wurde auch kein Datenbankeintrag erstellt, wegen des Problems, dass die Aktion nicht erreicht wird. – crappidy

+0

Hmm, das ist seltsam. Es funktioniert für mich [diesen Code ausführen] (https://gist.github.com/janneklouman/80840d1c142087325d1f1e5476814482). –

+0

jetzt funktioniert es! Deine Lösung ist richtig. vielen Dank! Aber ich habe ein anderes Problem, siehe die nächste Antwort – crappidy

0

Ich möchte die Seite "localhost/pmtool/Entwickler/$ ID" mit einer Vorlage rendern. Also fügte ich '$ ID!' => 'index' zu den url_handlers. Aber jetzt ist es das gleiche Problem wie am Anfang. Muss ich eine andere Route für dieses Problem hinzufügen oder hat die Zeile '$ ID!' => 'index' ein Fehler?

private static $url_handlers = array(
    'newtask' => 'renderNewTaskForm', 
    '$ID!' => 'index' 
); 

public function index(SS_HTTPRequest $request) { 
     return $this->renderWith('DeveloperTemplate'); 
} 
+1

Sie haben bereits die Route 'Entwickler // $ Action/$ ID/$ Name' definiert, die nicht koexistieren kann mit' Entwickler // $ ID! '. Allerdings werden alle Anfragen die Index-Aufgabe standardmäßig treffen, also sollten Sie einfach '$ ID! $ =>' Index'' weglassen können, und dann können Sie in der Index-Funktion die Parameter mit '$ request-> param abrufen ('ID') '. –

+0

Ich habe deine Antwort bis jetzt nicht gesehen. Das Problem ist behoben. Erstellt einen neuen Controller, der die neue Route 'localhost/pmtool/developer/projects/$ ID' verarbeitet. Jetzt wird die Indexfunktion vom neuen Controller übernommen. Aber danke für deine Antwort! Ich denke, Ihre Lösung wäre eine schnellere und bessere Lösung gewesen: D – crappidy