mirror of
				https://git.code.sf.net/p/seeddms/code
				synced 2025-10-31 05:11:27 +00:00 
			
		
		
		
	add all methods to handle document checkout and checkin
This commit is contained in:
		
							parent
							
								
									7bc0b8947f
								
							
						
					
					
						commit
						3dae5ec57a
					
				|  | @ -645,6 +645,209 @@ class SeedDMS_Core_Document extends SeedDMS_Core_Object { /* {{{ */ | |||
| 		return $this->_lockingUser; | ||||
| 	} /* }}} */ | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Check if document is checked out | ||||
| 	 * | ||||
| 	 * @return boolean true if checked out otherwise false | ||||
| 	 */ | ||||
| 	function isCheckedOut() { /* {{{ */ | ||||
| 		$db = $this->_dms->getDB(); | ||||
| 
 | ||||
| 		$queryStr = "SELECT * FROM tblDocumentCheckOuts WHERE document = " . (int) $this->_id; | ||||
| 		$resArr = $db->getResultArray($queryStr); | ||||
| 		if ((is_bool($resArr) && $resArr==false) || (count($resArr)==0)) { | ||||
| 			// Could not find a check out for the selected document.
 | ||||
| 			return false; | ||||
| 		} else { | ||||
| 			// A check out has been identified for this document.
 | ||||
| 			return true; | ||||
| 		} | ||||
| 	} /* }}} */ | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Get checkout info for document | ||||
| 	 * | ||||
| 	 * @return boolean true if locked otherwise false | ||||
| 	 */ | ||||
| 	function getCheckOutInfo() { /* {{{ */ | ||||
| 		$db = $this->_dms->getDB(); | ||||
| 
 | ||||
| 		$queryStr = "SELECT * FROM tblDocumentCheckOuts WHERE document = " . (int) $this->_id; | ||||
| 		$resArr = $db->getResultArray($queryStr); | ||||
| 		if ((is_bool($resArr) && $resArr==false) || (count($resArr)==0)) { | ||||
| 			// Could not find a check out for the selected document.
 | ||||
| 			return false; | ||||
| 		} else { | ||||
| 			// A check out has been identified for this document.
 | ||||
| 			return $resArr[0]; | ||||
| 		} | ||||
| 	} /* }}} */ | ||||
| 
 | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Check out document | ||||
| 	 * | ||||
| 	 * Creates a check out record for the document and copies the latest | ||||
| 	 * version of the document into the given checkout dir. | ||||
| 	 * | ||||
| 	 * @param object $user object of user doing the checkout | ||||
| 	 * @param string $checkoutdir directory where the file will be placed | ||||
| 	 * @return object object of class SeedDMS_Core_DocumentCheckOut | ||||
| 	 */ | ||||
| 	function checkOut($user, $checkoutdir) { /* {{{ */ | ||||
| 		$db = $this->_dms->getDB(); | ||||
| 
 | ||||
| 		if(self::isCheckedOut()) | ||||
| 			return false; | ||||
| 
 | ||||
| 		/* Check if checkout dir is writable */ | ||||
| 		if(!file_exists($checkoutdir)) { | ||||
| 			return false; | ||||
| 		} | ||||
| 
 | ||||
| 		$db->startTransaction(); | ||||
| 
 | ||||
| 		$lc = self::getLatestContent(); | ||||
| 
 | ||||
| 		$filename = $checkoutdir."/".$lc->getOriginalFileName(); | ||||
| 		$queryStr = "INSERT INTO tblDocumentCheckOuts (document, version, userID, date, filename) VALUES (".$this->_id.", ".$lc->getVersion().", ".$user->getID().", CURRENT_TIMESTAMP, ".$db->qstr($filename).")"; | ||||
| 		if (!$db->getResult($queryStr)) | ||||
| 			return false; | ||||
| 
 | ||||
| 		/* Try to copy the file */ | ||||
| 		$err = SeedDMS_Core_File::copyFile($this->_dms->contentDir . $this->getDir() . $lc->getFileName(), $filename); | ||||
| 		if (!$err) { | ||||
| 			$db->rollbackTransaction(); | ||||
| 			return false; | ||||
| 		} | ||||
| 
 | ||||
| 		$db->commitTransaction(); | ||||
| 		return true; | ||||
| 	} /* }}} */ | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Check in document | ||||
| 	 * | ||||
| 	 * Τhis function is similar to SeedDMS_Core_Document::addContent() | ||||
| 	 * but reads the content from the file was previously checked out. | ||||
| 	 * Internal this method calls | ||||
| 	 * SeedDMS_Core_Document::addContent() but takes over the original | ||||
| 	 * filename, filetype and mimetype from the checked out version. | ||||
| 	 * No matter in which state the current checked out file is, the | ||||
| 	 * document will be checked back in afterwards. | ||||
| 	 * | ||||
| 	 * @param string $comment | ||||
| 	 * @param object $user | ||||
| 	 * @param array $reviewers | ||||
| 	 * @param array $approvers | ||||
| 	 * @param integer $version | ||||
| 	 * @param array $attributes | ||||
| 	 * @param object $workflow | ||||
| 	 * @return boolean|object false in case of error, true if no error occurs but | ||||
| 	 * the document remains unchanged (because the checked out file has not | ||||
| 	 * changed or it has disappeared and couldnt't be checked in), or | ||||
| 	 * an instance of class SeedDMS_Core_AddContentResultSet if the document | ||||
| 	 * was updated. | ||||
| 	 */ | ||||
| 	function checkIn($comment, $user, $reviewers=array(), $approvers=array(), $version=0, $attributes=array(), $workflow=null) { /* {{{ */ | ||||
| 		$db = $this->_dms->getDB(); | ||||
| 
 | ||||
| 		$info = self::getCheckOutInfo(); | ||||
| 		$lc = self::getLatestContent(); | ||||
| 
 | ||||
| 		/* If file doesn't exist anymore, then just remove the record from the db */ | ||||
| 		if(!file_exists($info['filename'])) { | ||||
| 			$queryStr = "DELETE FROM tblDocumentCheckOuts WHERE document = ".$this->_id; | ||||
| 			$db->getResult($queryStr); | ||||
| 			return true; | ||||
| 		} | ||||
| 
 | ||||
| 		/* Check if version of checked out file is equal to current version */ | ||||
| 		if($lc->getVersion() != $info['version']) { | ||||
| 			return true; | ||||
| 		} | ||||
| 
 | ||||
| 		if($user->getID() != $info['userID']) { | ||||
| 			return true; | ||||
| 		} | ||||
| 
 | ||||
| 		$content = true; | ||||
| 		/* Do not create a new version if the file was unchanged */ | ||||
| 		$checksum = SeedDMS_Core_File::checksum($info['filename']); | ||||
| 		if($checksum != $lc->getChecksum()) { | ||||
| 			$content = $this->addContent($comment, $user, $info['filename'], $lc->getOriginalFileName(), $lc->getFileType(), $lc->getMimeType(), $reviewers, $approvers, $version, $attributes, $workflow); | ||||
| 			if($content && !$this->_dms->forceRename) | ||||
| 				SeedDMS_Core_File::removeFile($info['filename']); | ||||
| 		} | ||||
| 
 | ||||
| 		$queryStr = "DELETE FROM tblDocumentCheckOuts WHERE document = ".$this->_id; | ||||
| 		$db->getResult($queryStr); | ||||
| 
 | ||||
| 		return $content; | ||||
| 
 | ||||
| 	} /* }}} */ | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Cancel check out of document | ||||
| 	 * | ||||
| 	 * This function will cancel a check out in progress by removing | ||||
| 	 * the check out record from the database and removing the file | ||||
| 	 * from the check out folder. | ||||
| 	 * | ||||
| 	 * @return boolean true if cancelation was successful | ||||
| 	 */ | ||||
| 	function cancelCheckOut() { /* {{{ */ | ||||
| 		$db = $this->_dms->getDB(); | ||||
| 
 | ||||
| 		$info = self::getCheckOutInfo(); | ||||
| 		if($info) { | ||||
| 			SeedDMS_Core_File::removeFile($info['filename']); | ||||
| 
 | ||||
| 			$queryStr = "DELETE FROM tblDocumentCheckOuts WHERE document = ".$this->_id; | ||||
| 			$db->getResult($queryStr); | ||||
| 		} | ||||
| 
 | ||||
| 		return true; | ||||
| 
 | ||||
| 	} /* }}} */ | ||||
| 
 | ||||
| 	/** | ||||
| 	 * Return the check out status of the document | ||||
| 	 * | ||||
| 	 * This method returns the checkout status of a previosly checked out | ||||
| 	 * document. | ||||
| 	 * | ||||
| 	 * @return int 1=The checked out file doesn't exists anymore, | ||||
| 	 * 2=The checked out version doesn't exists anymore | ||||
| 	 * 3=The checked out file has not been modified yet | ||||
| 	 * 4=new check out record in database found | ||||
| 	 * 0=The checked out file is modified and check in will create a new version | ||||
| 	 */ | ||||
| 	function checkOutStatus() { /* {{{ */ | ||||
| 		$info = self::getCheckOutInfo(); | ||||
| 		if(!$info) | ||||
| 			return 4; | ||||
| 
 | ||||
| 		$lc = self::getLatestContent(); | ||||
| 
 | ||||
| 		/* If file doesn't exist anymore, then just remove the record from the db */ | ||||
| 		if(!file_exists($info['filename'])) { | ||||
| 			return 1; | ||||
| 		} | ||||
| 
 | ||||
| 		/* Check if version of checked out file is equal to current version */ | ||||
| 		if($lc->getVersion() != $info['version']) { | ||||
| 			return 2; | ||||
| 		} | ||||
| 
 | ||||
| 		$checksum = SeedDMS_Core_File::checksum($info['filename']); | ||||
| 		if($checksum == $lc->getChecksum()) { | ||||
| 			return 3; | ||||
| 		} | ||||
| 
 | ||||
| 		return 0; | ||||
| 	} /* }}} */ | ||||
| 
 | ||||
| 	function getSequence() { return $this->_sequence; } | ||||
| 
 | ||||
| 	function setSequence($seq) { /* {{{ */ | ||||
|  | @ -1845,6 +2048,11 @@ class SeedDMS_Core_Document extends SeedDMS_Core_Object { /* {{{ */ | |||
| 			$db->rollbackTransaction(); | ||||
| 			return false; | ||||
| 		} | ||||
| 		$queryStr = "DELETE FROM tblDocumentCheckOuts WHERE document = " . $this->_id; | ||||
| 		if (!$db->getResult($queryStr)) { | ||||
| 			$db->rollbackTransaction(); | ||||
| 			return false; | ||||
| 		} | ||||
| 		$queryStr = "DELETE FROM tblDocumentFiles WHERE document = " . $this->_id; | ||||
| 		if (!$db->getResult($queryStr)) { | ||||
| 			$db->rollbackTransaction(); | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Uwe Steinmann
						Uwe Steinmann