public function saveAction()
 {
     $concept = $this->_getConcept();
     $form = Editor_Forms_Concept::getInstance(null === $concept);
     $formData = $this->getRequest()->getParams();
     if (!$this->getRequest()->isPost()) {
         $this->getHelper('FlashMessenger')->setNamespace('error')->addMessage(_('No POST data recieved'));
         $this->_helper->redirector('edit');
     }
     $this->_checkConceptTenantForEdit($concept);
     if (!$form->isValid($formData)) {
         return $this->_forward('edit');
     } else {
         //@FIXME should upgrade multi hidden fields to allow easy submission (change name to template something)
         array_shift($formData['inScheme']);
         $form->populate($formData);
         if (null === $concept) {
             $this->_requireAccess('editor.concepts', 'propose', self::RESPONSE_TYPE_PARTIAL_HTML);
             $concept = new Editor_Models_Concept(new Api_Models_Concept());
         } else {
             $this->_requireAccess('editor.concepts', 'edit', self::RESPONSE_TYPE_PARTIAL_HTML);
         }
         $formData = $form->getValues();
         $oldData = $concept->getData();
         //by reference.
         $extraData = $concept->transformFormData($formData);
         $concept->setConceptData($formData, $extraData);
         try {
             $user = OpenSKOS_Db_Table_Users::fromIdentity();
             $extraData = array_merge($extraData, array('tenant' => $user->tenant, 'modified_by' => (int) $user->id, 'modified_timestamp' => date("Y-m-d\\TH:i:s\\Z"), 'toBeChecked' => isset($extraData['toBeChecked']) ? (bool) $extraData['toBeChecked'] : false));
             if (!isset($extraData['uuid']) || empty($extraData['uuid'])) {
                 $extraData['uuid'] = $concept['uuid'];
                 $extraData['created_by'] = $extraData['modified_by'];
                 $extraData['created_timestamp'] = $extraData['modified_timestamp'];
             } else {
                 if (isset($oldData['created_by'])) {
                     $extraData['created_by'] = $oldData['created_by'];
                 }
                 if (isset($oldData['created_timestamp'])) {
                     $extraData['created_timestamp'] = $oldData['created_timestamp'];
                 }
                 if (isset($oldData['collection'])) {
                     $extraData['collection'] = $oldData['collection'];
                 }
                 if (isset($oldData['approved_by'])) {
                     $extraData['approved_by'] = $oldData['approved_by'];
                 }
                 if (isset($oldData['approved_timestamp'])) {
                     $extraData['approved_timestamp'] = $oldData['approved_timestamp'];
                 }
                 if (isset($oldData['deleted_by'])) {
                     $extraData['deleted_by'] = $oldData['deleted_by'];
                 }
                 if (isset($oldData['deleted_timestamp'])) {
                     $extraData['deleted_timestamp'] = $oldData['deleted_timestamp'];
                 }
             }
             if ($extraData['status'] === 'approved' && $oldData['status'] !== 'approved') {
                 $extraData['approved_timestamp'] = $extraData['modified_timestamp'];
                 $extraData['approved_by'] = $extraData['modified_by'];
             }
             if ($extraData['status'] !== 'approved') {
                 $formData['approved_by'] = '';
                 $formData['approved_timestamp'] = '';
                 $extraData['approved_by'] = '';
                 $extraData['approved_timestamp'] = '';
             }
             if ($extraData['status'] !== 'expired') {
                 $formData['deleted_by'] = '';
                 $formData['deleted_timestamp'] = '';
                 $extraData['deleted_by'] = '';
                 $extraData['deleted_timestamp'] = '';
             }
             if (!isset($extraData['collection'])) {
                 if (isset($concept['inScheme']) && isset($concept['inScheme'][0])) {
                     $firstConceptScheme = Editor_Models_ApiClient::factory()->getConceptSchemes($concept['inScheme'][0]);
                     $firstConceptScheme = array_shift($firstConceptScheme);
                     if (!empty($firstConceptScheme) && isset($firstConceptScheme['collection'])) {
                         $extraData['collection'] = $firstConceptScheme['collection'];
                     }
                 }
             }
             $concept->setConceptData($formData, $extraData);
             if ($concept->save($extraData)) {
                 if (!isset($concept['inScheme'])) {
                     $newSchemes = array();
                 } else {
                     $newSchemes = $concept['inScheme'];
                 }
                 if (!isset($oldData['inScheme'])) {
                     $oldSchemes = array();
                 } else {
                     $oldSchemes = $oldData['inScheme'];
                 }
                 $concept->updateConceptSchemes($newSchemes, $oldSchemes);
             } else {
                 return $this->_forward('edit', 'concept', 'editor', array('errors' => $concept->getErrors()));
             }
         } catch (Zend_Exception $e) {
             return $this->_forward('edit', 'concept', 'editor', array('errors' => array(new Editor_Models_ConceptValidator_Error('unknown', $e->getMessage()))));
         }
         $this->_helper->redirector('view', 'concept', 'editor', array('uuid' => $extraData['uuid']));
     }
 }
 /**
  * Form content to model fields mapper.
  */
 protected function _getFormMapping()
 {
     $mapping = $this->getRdfMapping();
     $mapping['helperFields'] = Editor_Forms_Concept::getHelperFields();
     $mapping['extraFields'] = array('uuid', 'status', 'statusOtherConcept', 'statusOtherConceptLabelToFill', 'toBeChecked', 'uri');
     $mapping['uuid2uri'] = array('inScheme', 'topConceptOf');
     return $mapping;
 }