📄 ktapidocument.inc.php.tmp
字号:
DBUtil::startTransaction(); $result = KTWorkflowUtil::performTransitionOnDocument($transition, $this->document, $user, $reason); if (is_null($result) || PEAR::isError($result)) { DBUtil::rollback(); return new KTAPI_Error(KTAPI_ERROR_WORKFLOW_INVALID, $transition); } DBUtil::commit(); } /** * This returns all metadata for the document. * * @return array */ function get_metadata() { $doctypeid = $this->document->getDocumentTypeID(); $fieldsets = (array) KTMetadataUtil::fieldsetsForDocument($this->document, $doctypeid); if (is_null($fieldsets) || PEAR::isError($fieldsets)) { return array(); } $results = array(); foreach ($fieldsets as $fieldset) { if ($fieldset->getIsConditional()) { /* this is not implemented...*/ continue; } $fields = $fieldset->getFields(); $result = array('fieldset' => $fieldset->getName(), 'description' => $fieldset->getDescription()); $fieldsresult = array(); foreach ($fields as $field) { $value = 'n/a'; $fieldvalue = DocumentFieldLink::getByDocumentAndField($this->document, $field); if (!is_null($fieldvalue) && (!PEAR::isError($fieldvalue))) { $value = $fieldvalue->getValue(); } $controltype = 'string'; if ($field->getHasLookup()) { $controltype = 'lookup'; if ($field->getHasLookupTree()) { $controltype = 'tree'; } } switch ($controltype) { case 'lookup': $selection = KTAPI::get_metadata_lookup($field->getId()); break; case 'tree': $selection = KTAPI::get_metadata_tree($field->getId()); break; default: $selection= array(); } $fieldsresult[] = array( 'name' => $field->getName(), 'required' => $field->getIsMandatory(), 'value' => $value, 'description' => $field->getDescription(), 'control_type' => $controltype, 'selection' => $selection ); } $result['fields'] = $fieldsresult; $results [] = $result; } return $results; } function get_packed_metadata($metadata=null) { global $default; if (is_null($metadata)) { $metadata = $this->get_metadata(); } $packed = array(); foreach($metadata as $fieldset_metadata) { if (is_array($fieldset_metadata)) { $fieldsetname=$fieldset_metadata['fieldset']; $fields=$fieldset_metadata['fields']; } elseif (is_a($fieldset_metadata, 'stdClass')) { $fieldsetname=$fieldset_metadata->fieldset; $fields=$fieldset_metadata->fields; } else { $default->log->debug("unexpected fieldset type"); continue; } $fieldset = KTFieldset::getByName($fieldsetname); if (is_null($fieldset) || PEAR::isError($fieldset) || is_a($fieldset, 'KTEntityNoObjects')) { $default->log->debug("could not resolve fieldset: $fieldsetname for document id: $this->documentid"); // exit graciously continue; } foreach($fields as $fieldinfo) { if (is_array($fieldinfo)) { $fieldname = $fieldinfo['name']; $value = $fieldinfo['value']; } elseif (is_a($fieldinfo, 'stdClass')) { $fieldname = $fieldinfo->name; $value = $fieldinfo->value; } else { $default->log->debug("unexpected fieldinfo type"); continue; } $field = DocumentField::getByFieldsetAndName($fieldset, $fieldname); if (is_null($field) || PEAR::isError($field) || is_a($field, 'KTEntityNoObjects')) { $default->log->debug("Could not resolve field: $fieldname on fieldset $fieldsetname for document id: $this->documentid"); // exit graciously continue; } $packed[] = array($field, $value); } } return $packed; } /** * This updates the metadata on the file. This includes the 'title'. * * @param array This is an array containing the metadata to be associated with the file. */ function update_metadata($metadata) { global $default; if (empty($metadata)) { return; } $packed = $this->get_packed_metadata($metadata); DBUtil::startTransaction(); $result = KTDocumentUtil::saveMetadata($this->document, $packed, array('novalidate'=>true)); if (is_null($result)) { DBUtil::rollback(); return new PEAR_Error(KTAPI_ERROR_INTERNAL_ERROR . ': Null result returned but not expected.'); } if (PEAR::isError($result)) { DBUtil::rollback(); return new KTAPI_Error('Unexpected validation failure', $result); } DBUtil::commit(); $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(); } } /** * This updates the system metadata on the document. * * @param array $sysdata */ function update_sysdata($sysdata) { global $default; if (empty($sysdata)) { return; } $owner_mapping = array( 'created_by'=>'creator_id', 'modified_by'=>'modified_user_id', 'owner'=>'owner_id' ); $documents = array(); $document_content = array(); $indexContent = null; $uniqueOemNo = false; foreach($sysdata as $rec) { if (is_object($rec)) { $name = $rec->name; $value = sanitizeForSQL($rec->value); } elseif(is_array($rec)) { $name = $rec['name']; $value = sanitizeForSQL($rec['value']); } else { // just ignore continue; } switch(strtolower($name)) { case 'unique_oem_document_no': $documents['oem_no'] = $value; $uniqueOemNo = true; break; case 'oem_document_no': $documents['oem_no'] = $value; break; case 'index_content': $indexContent = $value; break; case 'created_date': if (!empty($value)) $documents['created'] = $value; break; case 'modified_date': if (!empty($value)) $documents['modified'] = $value; break; case 'is_immutable': $documents['immutable'] = in_array(strtolower($value), array('1','true','on','yes'))?'1':'0'; break; case 'filename': $value = KTUtil::replaceInvalidCharacters($value); $document_content['filename'] = $value; break; case 'major_version': $document_content['major_version'] = $value; break; case 'minor_version': $document_content['minor_version'] = $value; break; case 'version': $version = number_format($value + 0,5); list($major_version, $minor_version) = explode('.', $version); $document_content['major_version'] = $major_version; $document_content['minor_version'] = $minor_version; break; case 'mime_type': $sql = "select id from mime_types where mimetypes='$value'"; $value = DBUtil::getResultArray($sql); if (PEAR::isError($value)) { $default->log->error("Problem resolving mime type '$value' for document id $this->documentid. Reason: " . $value->getMessage()); return $value; } if (count($value) == 0) { $default->log->error("Problem resolving mime type '$value' for document id $this->documentid. None found."); break; } $value = $value[0]['id']; $document_content['mime_id'] = $value; break; case 'owner': case 'created_by': case 'modified_by': $sql = "select id from users where name='$value'"; $userId = DBUtil::getResultArray($sql); if (PEAR::isError($userId)) { $default->log->error("Problem resolving user '$value' for document id $this->documentid. Reason: " . $userId->getMessage()); return $userId; } if (empty($userId)) { $sql = "select id from users where username='$value'"; $userId = DBUtil::getResultArray($sql); if (PEAR::isError($userId)) { $default->log->error("Problem resolving username '$value' for document id $this->documentid. Reason: " . $userId->getMessage()); return $userId; } } if (empty($userId)) { $default->log->error("Problem resolving user based on '$value' for document id $this->documentid. No user found"); // if not found, not much we can do break; } $userId=$userId[0]; $userId=$userId['id']; $name = $owner_mapping[$name]; $documents[$name] = $userId; break; default: $default->log->error("Problem updating field '$name' with value '$value' for document id $this->documentid. Field is unknown."); // TODO: we should do some logging //return new PEAR_Error('Unexpected field: ' . $name); } } if (count($documents) > 0) { $sql = "UPDATE documents SET "; $i=0; foreach($documents as $name=>$value) { if ($i++ > 0) $sql .= ","; $value = sanitizeForSQL($value); $sql .= "$name='$value'"; } $sql .= " WHERE id=$this->documentid"; $result = DBUtil::runQuery($sql); if (PEAR::isError($result)) { return $result; } if ($uniqueOemNo) { $oem_no = sanitizeForSQL($documents['oem_no']); $sql = "UPDATE documents SET oem_no=null WHERE oem_no = '$oem_no' AND id != $this->documentid"; $result = DBUtil::runQuery($sql); } } if (count($document_content) > 0) { $content_id = $this->document->getContentVersionId(); $sql = "UPDATE document_content_version SET "; $i=0; foreach($document_content as $name=>$value) { if ($i++ > 0) $sql .= ","; $value = sanitizeForSQL($value); $sql .= "$name='$value'"; } $sql .= " WHERE id=$content_id"; $result = DBUtil::runQuery($sql); if (PEAR::isError($result)) { return $result; } } if (!is_null($indexContent)) { $indexer = Indexer::get(); $result = $indexer->diagnose(); if (empty($result)) { $indexer->updateDocumentIndex($this->documentid, $indexContent); } else { $default->log->error("Problem updating index with value '$value' for document id $this->documentid. Problem with indexer."); } } } function clearCache() { // TODO: we should only clear the cache for the document we are working on // this is a quick fix but not optimal!! $metadataid = $this->document->getMetadataVersionId(); $contentid = $this->document->getContentVersionId(); $cache = KTCache::getSingleton(); $cache->remove('KTDocumentMetadataVersion/id', $metadataid); $cache->remove('KTDocumentContentVersion/id', $contentid); $cache->remove('KTDocumentCore/id', $this->documentid); $cache->remove('Document/id', $this->documentid); unset($GLOBALS['_OBJECTCACHE']['KTDocumentMetadataVersion'][$metadataid]); unset($GLOBALS['_OBJECTCACHE']['KTDocumentContentVersion'][$contentid]); unset($GLOBALS['_OBJECTCACHE']['KTDocumentCore'][$this->documentid]); $this->document = &Document::get($this->documentid); } function mergeWithLastMetadataVersion() { // keep latest metadata version $metadata_version = $this->document->getMetadataVersion(); if ($metadata_version == 0) { // this could theoretically happen in the case we are updating metadata and sysdata, but no metadata fields are specified. return; } $metadata_id = $this->document->getMetadataVersionId(); // get previous version $sql = "SELECT id, metadata_version FROM document_metadata_version WHERE id<$metadata_id AND document_id=$this->documentid order by id desc"; $old = DBUtil::getResultArray($sql); if (is_null($old) || PEAR::isError($old)) { return new PEAR_Error('Previous version could not be resolved'); } // only interested in the first one $old=$old[0]; $old_metadata_id = $old['id']; $old_metadata_version = $old['metadata_version']; DBUtil::startTransaction(); // delete previous metadata version $sql = "DELETE FROM document_metadata_version WHERE id=$old_metadata_id"; $rs = DBUtil::runQuery($sql); if (PEAR::isError($rs)) { DBUtil::rollback(); return $rs; } // make latest equal to previous $sql = "UPDATE document_metadata_version SET metadata_version=$old_metadata_version WHERE id=$metadata_id"; $rs = DBUtil::runQuery($sql); if (PEAR::isError($rs)) { DBUtil::rollback();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -