Пример #1
0
 function do_trytype()
 {
     $oForm = $this->form_changetype();
     $res = $oForm->validate();
     $data = $res['results'];
     $errors = $res['errors'];
     if (!empty($errors)) {
         $oForm->handleError();
     }
     $document_type = $data['type'];
     $doctypeid = $document_type->getId();
     // Get the current document type, fieldsets and metadata
     $iOldDocTypeID = $this->oDocument->getDocumentTypeID();
     $fieldsets = KTMetadataUtil::fieldsetsForDocument($this->oDocument, $iOldDocTypeID);
     $mdlist = DocumentFieldLink::getByDocument($this->oDocument);
     $field_values = array();
     foreach ($mdlist as $oFieldLink) {
         $field_values[$oFieldLink->getDocumentFieldID()] = $oFieldLink->getValue();
     }
     DBUtil::startTransaction();
     // Update the document with the new document type id
     $this->oDocument->startNewMetadataVersion($this->oUser);
     $this->oDocument->setDocumentTypeId($doctypeid);
     $res = $this->oDocument->update();
     if (PEAR::isError($res)) {
         DBUtil::rollback();
         return $res;
     }
     // Ensure all values for fieldsets common to both document types are retained
     $fs_ids = array();
     $doctype_fieldsets = KTFieldSet::getForDocumentType($doctypeid);
     foreach ($doctype_fieldsets as $fieldset) {
         $fs_ids[] = $fieldset->getId();
     }
     $MDPack = array();
     foreach ($fieldsets as $oFieldset) {
         if ($oFieldset->getIsGeneric() || in_array($oFieldset->getId(), $fs_ids)) {
             $fields = $oFieldset->getFields();
             foreach ($fields as $oField) {
                 $val = isset($field_values[$oField->getId()]) ? $field_values[$oField->getId()] : '';
                 if (!empty($val)) {
                     $MDPack[] = array($oField, $val);
                 }
             }
         }
     }
     $core_res = KTDocumentUtil::saveMetadata($this->oDocument, $MDPack, array('novalidate' => true));
     if (PEAR::isError($core_res)) {
         DBUtil::rollback();
         return $core_res;
     }
     DBUtil::commit();
     $oKTTriggerRegistry = KTTriggerRegistry::getSingleton();
     $aTriggers = $oKTTriggerRegistry->getTriggers('edit', 'postValidate');
     foreach ($aTriggers as $aTrigger) {
         $sTrigger = $aTrigger[0];
         $oTrigger = new $sTrigger();
         $aInfo = array("document" => $this->oDocument, "aOptions" => $MDPack);
         $oTrigger->setInfo($aInfo);
         $ret = $oTrigger->postValidate();
     }
     // Check if there are any dynamic conditions / permissions that need to be updated on the document
     // If there are dynamic conditions then update the permissions on the document
     // The dynamic condition test fails unless the changes exists in the DB therefore update permissions after committing the transaction.
     $iPermissionObjectId = $this->oDocument->getPermissionObjectID();
     $dynamicCondition = KTPermissionDynamicCondition::getByPermissionObjectId($iPermissionObjectId);
     if (!PEAR::isError($dynamicCondition) && !empty($dynamicCondition)) {
         $res = KTPermissionUtil::updatePermissionLookup($this->oDocument);
     }
     $this->successRedirectToMain(sprintf(_kt("You have selected a new document type: %s. "), $data['type']->getName()));
 }
Пример #2
0
 /**
  * Changes the document type of the document.
  *
  * @author KnowledgeTree Team
  * @access public
  * @param string $documenttype The new document type
  * @return void|PEAR_Error Returns nothing on success | a PEAR_Error on failure
  */
 function change_document_type($documenttype)
 {
     $user = $this->can_user_access_object_requiring_permission($this->document, KTAPI_PERMISSION_WRITE);
     if (PEAR::isError($user)) {
         return $user;
     }
     $doctypeid = KTAPI::get_documenttypeid($documenttype);
     if (PEAR::isError($doctypeid)) {
         return $doctypeid;
     }
     if ($this->document->getDocumentTypeId() != $doctypeid) {
         // Get the current document type, fieldsets and metadata
         $iOldDocTypeID = $this->document->getDocumentTypeID();
         $fieldsets = KTMetadataUtil::fieldsetsForDocument($this->document, $iOldDocTypeID);
         $mdlist = DocumentFieldLink::getByDocument($this->document);
         $field_values = array();
         foreach ($mdlist as $oFieldLink) {
             $field_values[$oFieldLink->getDocumentFieldID()] = $oFieldLink->getValue();
         }
         DBUtil::startTransaction();
         $this->document->startNewMetadataVersion($user);
         $this->document->setDocumentTypeId($doctypeid);
         $res = $this->document->update();
         if (PEAR::isError($res)) {
             DBUtil::rollback();
             return new KTAPI_Error(KTAPI_ERROR_INTERNAL_ERROR, $res);
         }
         // Ensure all values for fieldsets common to both document types are retained
         $fs_ids = array();
         $doctype_fieldsets = KTFieldSet::getForDocumentType($doctypeid);
         foreach ($doctype_fieldsets as $fieldset) {
             $fs_ids[] = $fieldset->getId();
         }
         $MDPack = array();
         foreach ($fieldsets as $oFieldset) {
             if ($oFieldset->getIsGeneric() || in_array($oFieldset->getId(), $fs_ids)) {
                 $fields = $oFieldset->getFields();
                 foreach ($fields as $oField) {
                     $val = isset($field_values[$oField->getId()]) ? $field_values[$oField->getId()] : '';
                     if (!empty($val)) {
                         $MDPack[] = array($oField, $val);
                     }
                 }
             }
         }
         $core_res = KTDocumentUtil::saveMetadata($this->document, $MDPack, array('novalidate' => true));
         if (PEAR::isError($core_res)) {
             DBUtil::rollback();
             return $core_res;
         }
         $oKTTriggerRegistry = KTTriggerRegistry::getSingleton();
         $aTriggers = $oKTTriggerRegistry->getTriggers('edit', 'postValidate');
         foreach ($aTriggers as $aTrigger) {
             $sTrigger = $aTrigger[0];
             $oTrigger = new $sTrigger();
             $aInfo = array("document" => $this->document, "aOptions" => $packed);
             $oTrigger->setInfo($aInfo);
             $ret = $oTrigger->postValidate();
         }
         DBUtil::commit();
     }
 }