2016-07-26 7 views
2

Если я нажму кнопку «Отправить», чтобы отправить данные из моей формы SilverStripe в базу данных (xampp, mysql), она не перенаправит меня обратно на страницу формы. Вместо этого он перенаправляет на {BaseUrl}name_of_controller/name_of_form -> в моем случае: localhost/pmtool/DeveloperController/NewTaskMask. Я искал часы для решения этой проблемы, но без каких-либо успехов.Ошибка перенаправления формы SilverStripe

Вот код файла, в котором эта форма и действие определено. В другом html-файле форма будет вызвана через $NewTaskMask. По URL localhost/pmtool/developer/newtask будет вызываться функция renderNewTaskForm, будет создан шаблон с $NewTaskMask.

Все поля, такие как Название, Описание и т. Д., Существуют в базе данных.

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(); 
    } 
} 

ответ

1

Похоже, проблема связана с маршрутизацией. Я предполагаю, что вы установили маршрут developer, чтобы нажать DveloperController. Выполняя то же самое, я смог воспроизвести вашу ошибку.

Я попытался явно добавить еще один маршрут для DeveloperController, чтобы попасть в контроллер DeveloperController, потому что он не перенаправлялся должным образом. Это довольно странно, и магия исправить и, если честно, я не знаю, почему это работает, но он решил ее:

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

Обновление маршрутов, чтобы соответствовать вашей установке и не забудьте запустить ?flush потом.

Возможно, кто-то с более глубоким пониманием может объяснить, что происходит.

+0

ТНХ Janne для ответа, но: перенаправляет теперь назад, хорошо хорошо, но действие вида («doCreateT») не будет называться. Вы можете проверить это, когда вы добавили эхо («привет»); команд в действии. Также запись базы данных не была создана из-за проблемы, что действие не будет достигнуто. – crappidy

+0

Хм, это странно. Он работает для меня, запуская [этот код] (https://gist.github.com/janneklouman/80840d1c142087325d1f1e5476814482). –

+0

теперь он работает! ваше решение правильно. Большое спасибо! Но у меня есть еще одна проблема, см. Следующий ответ. – crappidy

0

Я хочу отобразить страницу «localhost/pmtool/developer/$ ID» с помощью шаблона. Итак, я добавил '$ ID!' => 'index' - url_handlers. Но теперь это та же проблема, что и в начале. Должен ли я добавить еще один маршрут для этой проблемы или имеет строку '$ ID!' => 'index' ошибка?

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

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

Вы уже определили маршрут 'developer // $ Action/$ ID/$ Name', который не может сосуществовать с' developer // $ ID! '. Однако все запросы попадают в задачу индекса по умолчанию, поэтому вы можете просто опустить '' $ ID! $ => 'Index'', а затем в функции индекса вы можете захватить параметры, выполнив параметр '$ request-> ('ID') '. –

+0

Я не видел вашего ответа до сих пор. Проблема исправлена. Создал новый контроллер, который обрабатывает новый маршрут «localhost/pmtool/developer/projects/$ ID». Теперь функция index будет обрабатываться новым контроллером. Но за ваш ответ! Я думаю, что ваше решение было бы более быстрым и лучшим решением: D – crappidy

Смежные вопросы