Walllter
Walllter

Reputation: 350

Redirect while error in form ZF2

I have a ZF2 form and validators. I located at http://example.com/public/questions/edit/5730/2770,

where 5730 - $_GET['variant_id'], 2770 - $_GET['test_id'].

When I set input to empty value and submit form - I have an error, and ZF2 redirect me to http://example.com/public/questions/edit/5730 - without test_id (/2770).

How I can redirect me to a valid url? Thank all for answers.

Action:

 public function editAction()
 {
    $language = 'EN';
    $request = $this->getRequest();
    $this->layout()->setVariable('messenger', 'Edit Questions');
    $id = $this->params()->fromRoute('id');
    $variantId = $this->params()->fromRoute('variant_id');
    $sm = $this->getServiceLocator()->get('Zend\Db\Adapter\Adapter');
    $stCategories = new CategoriesTable($sm);
    $conFunc = new FunctionsController();
    $form = new Form\AddQuestionsForm();
    $stCVariants = new ContestVariantsTable($sm);
    $stQuestions = new QuestionsTable($sm);
    $categoryList = $stCategories->getCategories($language);
    $categories = $conFunc->_getSubs(null, $categoryList);
    $config = $this->getServiceLocator()->get('config');
    $folder = $config['settings']['url'] . $config['settings']['media_files'];
    if (empty($id) && !$request->isPost()) {
        $this->redirect()->toRoute('stickynotes', array('controller' => 'stickynotes', 'action' => 'contests'));
    } elseif ($request->isPost()) {
        $form->setInputFilter($stQuestions->getAddQuestionsFilter());
        $form->setData($request->getPost());
        if ($form->isValid()) {
            $arrPost = (array) $request->getPost();
            $arrFile = (array) $request->getFiles();
            $postData = array_merge_recursive($arrPost, $arrFile);
            $tryAddQuestion = $stQuestions->updateQuestions($postData);
            if ($tryAddQuestion['query'] && $tryAddQuestion['exception'] === null) {
                $isUpload = new \Zend\Validator\File\UploadFile();
                if ($isUpload->isValid($postData['filebutton'])) {
                    $path_parts = pathinfo($postData['filebutton']['name']);
                    $extension = '.' . $path_parts['extension'];
                    $filename = $tryAddQuestion['lastId'];
                    $config = $this->getServiceLocator()->get('config');
                    $folder = $config['settings']['media_files'];
                    if ($postData['AddQuestionMedia'] == 'image') {
                        $validator = new \Zend\Validator\File\IsImage();
                        $validator2 = new \Zend\Validator\File\Extension(array('png', 'jpeg', 'jpg', 'gif'));
                        if ($validator->isValid($postData['filebutton'])
                            && $validator2->isValid($postData['filebutton'])) {
                            $filter = new \Zend\Filter\File\Rename($folder . 'images/' . $filename . $extension);
                            $filter->filter($postData['filebutton']);
                            chmod($config['settings']['media_files'] . 'images/' . $filename . $extension, 0644);
                            $stQuestions->updateQuestionsFile($filename, $extension);
                        }
                    } elseif ($postData['AddQuestionMedia'] == 'video') {
                        $validator = new \Zend\Validator\File\Extension(array('mp4'));
                        if ($validator->isValid($postData['filebutton'])) {
                            $filter = new \Zend\Filter\File\Rename($folder . 'videos/' . $filename . '.mp4');
                            $filter->filter($postData['filebutton']);
                            chmod($config['settings']['media_files'] . 'videos/' . $filename . '.mp4', 0644);
                            $stQuestions->updateQuestionsFile($filename, $extension);
                        }
                    } elseif ($postData['AddQuestionMedia'] == 'audio') {
                        $validator = new \Zend\Validator\File\Extension(array('mp3'));
                        if ($validator->isValid($postData['filebutton'])) {
                            $filter = new \Zend\Filter\File\Rename($folder . 'sounds/' . $filename . '.mp3');
                            $filter->filter($postData['filebutton']);
                            chmod($config['settings']['media_files'] . 'sounds/' . $filename . '.mp3', 0644);
                            $stQuestions->updateQuestionsFile($filename, $extension);
                        }
                    } else {
                        $this->layout()->setVariable('messenger_error', 'Uploaded file have incorrect format');
                    }
                }
                $this->layout()->setVariable('messenger_info', 'Question has been updated!');
                $this->redirect()->toRoute('questions', array('controller' => 'questions', 'action' => 'edit',
                                                            'id' => $id, 'variant_id' => $postData['question_id']));
            } elseif(!empty($tryAddContest['exception'])) {
                $this->layout()->setVariable('messenger_error', 'Failed with DB while update question. Please try again. ' . $tryAddQuestion['exception']);
            } else {
                $this->layout()->setVariable('messenger_error', 'Failed while update question. Please try again.');
            }
            if (!empty($postData['variant_id'])) {
                $stCVariants->addEntity($postData['variant_id'], $tryAddQuestion['lastId']);
            }
        }
    } else {
        if (!empty($variantId)) {
            $getContest = $stCVariants->getSingleContest($variantId);
            $progressions = array();
            $used_progressions = $stCVariants->getUsedProgressions($id);
            for ($i=$getContest['progression_start']; $i<=$getContest['progression_stop']; $i++) {
                if (!in_array($i, $used_progressions))
                    $progressions[] = $i;
            }
            $form->remove('AddQuestionProgression');
            $form->getInputFilter()->remove('AddQuestionProgression');
            $select = new \Zend\Form\Element\Select('AddQuestionProgression');
            $select->setValueOptions($progressions)->setAttributes(array(
                'id' => 'progression_id',
                'class' => 'form-control',
                'style' => 'width: 408px;',
            ));
            $form->get('variant_id')->setValue($id);
            $form->add($select);
        }
        $getQuestion = $stQuestions->getSingleQuestion($id);
        switch ($getQuestion['media_type']) {
            case 'image':
                $folder .= 'images/' . $getQuestion['media_content'];
                break;
            case 'video':
                $folder .= 'videos/' . $getQuestion['media_content'];
                break;
            case 'audio':
                $folder .= 'sounds/' . $getQuestion['media_content'];
                break;
        }
        $form->get('variant_id')->setValue($id);
        $form->get('question_id')->setValue($variantId);
    }
    return array(
        'form' => $form,
        'categories' => $categories,
        'url' => $folder,
        'id' => $id
    );
}

Upvotes: 0

Views: 267

Answers (0)

Related Questions