public function saveQuestionAction() { // Disables view script call $this->_helper->viewRenderer->setNoRender(true); // Disables layout to action mapping $this->_helper->layout->disableLayout(); if ($this->_request->isPost()) { // load params $testId = $this->getParam('testId'); $questionId = $this->getParam('questionId'); $test = My_Model::get('Tests')->getById($testId); $rawcount = intval($this->getParam('count')); $count = $rawcount > -1 && $rawcount <= 6 ? $rawcount : 3; $form = new QuestionForm(array('count' => $count)); if ($form->isValid($this->_request->getPost())) { $formValues = $form->getValues(); Zend_Debug::dump($formValues); //check if at least one option is checked if ($this->checkAllFalse($formValues)) { $flash = Zend_Controller_Action_HelperBroker::getStaticHelper('FlashMessenger'); $flash->clearMessages(); $flash->addMessage('At least one option have to be right.'); Zend_Debug::dump('at least one has to be right'); // redirect to test edit page $this->_helper->redirector->gotoRoute(array('controller' => 'test', 'action' => 'edit', 'id' => $testId), 'default', true); return; } // ### SAVE/UPDATE QUESTION ### $oldQuestion = null; $question = null; $isNewQuestion = true; if ($questionId === NULL) { //create question $question = My_Model::get('Questions')->createRow(); Zend_Debug::dump('no question id'); Zend_Debug::dump('Create question'); } else { // load existing $oldQuestion = My_Model::get('Questions')->getById($questionId); if ($oldQuestion === NULL || $oldQuestion->isAnswered() && (strcmp($formValues['otazka'], $oldQuestion->getobsah()) !== 0 || strcmp($formValues['language'], strval($oldQuestion->getid_jazyk())) !== 0)) { Zend_Debug::dump('no old question || (is anwered && changed question)'); Zend_Debug::dump('Create question'); $question = My_Model::get('Questions')->createRow(); } else { $question = $oldQuestion; $isNewQuestion = false; Zend_Debug::dump('use old question'); } } // update question with new data $questionValues = array("id_test" => $testId, "obsah" => $formValues['otazka'], "id_jazyk" => strcmp($formValues['language'], '0') != 0 ? $formValues['language'] : null); $question->updateFromArray($questionValues); // archive old if exist if ($oldQuestion !== NULL && $isNewQuestion) { Zend_Debug::dump('archive old question'); $oldQuestion->id_test = NULL; $oldQuestion->revize = $question->getid_otazka(); $oldQuestion->save(); } // save question id $questionId = $question->id_otazka; // ### SAVE/UPDATE OPTIONS ### $optionContents = $this->loadOptionsFromFormValues($formValues, $questionId); if ($oldQuestion !== NULL) { $existingOptions = $oldQuestion->getOptions(); } // question is new or existing options are empty if ($isNewQuestion || empty($existingOptions)) { Zend_Debug::dump('is new question || no existing options'); // create options with given content foreach ($optionContents as $content) { Zend_Debug::dump('create new option'); $option = My_Model::get('Options')->createRow(); $option->updateFromArray($content); } } else { Zend_Debug::dump('!(is new question || no existing options)'); $newcount = count($optionContents); $oldcount = count($existingOptions); // update existing options with given content for ($i = 0; $i < $newcount; $i++) { if ($i < $oldcount) { // pokud je novy pocet otazek mensi nez puvodni, tak se porovnavaji se starymi moznostmi // pokud nebyla moznost zmenena, jde se na dalsi if (strcmp($optionContents[$i]["obsah"], $existingOptions[$i]->obsah) == 0 && $optionContents[$i]["spravnost"] === $existingOptions[$i]->spravnost) { Zend_Debug::dump('no change'); continue; } $oldOption = $existingOptions[$i]; $option; $isNewOption = true; if ($oldOption === NULL || $oldOption->isAnswered()) { Zend_Debug::dump('no old option || (is answered && changed)'); Zend_Debug::dump('create new option'); $option = My_Model::get('Options')->createRow(); } else { Zend_Debug::dump('not answered, use old option'); $option = $oldOption; $isNewOption = false; } $option->updateFromArray($optionContents[$i]); // archive old if exist if ($oldOption !== NULL && $isNewOption) { Zend_Debug::dump('archive old option'); $oldOption->id_otazka = NULL; $oldOption->revize = $option->getid_moznost(); $oldOption->save(); } } else { // pokud je moznosti vic, tak se pridavaji rovnou dalsi Zend_Debug::dump('add new option'); $option = My_Model::get('Options')->createRow(); $option->updateFromArray($optionContents[$i]); } } // archive removed options for ($i = $newcount; $i < $oldcount; $i++) { Zend_Debug::dump('archive unused options'); $oldOption = $existingOptions[$i]; $oldOption->id_otazka = NULL; $oldOption->save(); } } } else { Zend_Debug::dump($form->getMessages()); Zend_Debug::dump('Invalid'); $flash = Zend_Controller_Action_HelperBroker::getStaticHelper('FlashMessenger'); $flash->clearMessages(); $flash->addMessage('Question form is not valid.'); } } // redirect to test edit page $this->_helper->redirector->gotoRoute(array('controller' => 'test', 'action' => 'edit', 'id' => $testId), 'default', true); }