. * * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, * California 94120-7775, or email info@knowledgetree.com. * * The interactive user interfaces in modified source and object code versions * of this program must display Appropriate Legal Notices, as required under * Section 5 of the GNU General Public License version 3. * * In accordance with Section 7(b) of the GNU General Public License version 3, * these Appropriate Legal Notices must retain the display of the "Powered by * KnowledgeTree" logo and retain the original copyright notice. If the display of the * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices * must display the words "Powered by KnowledgeTree" and retain the original * copyright notice. * Contributor( s): thePanz (thepanz@gmail.com) * */ require_once(KT_LIB_DIR . '/workflow/workflowtrigger.inc.php'); require_once(KT_DIR . '/plugins/pdfConverter/pdfConverter.php'); class PDFGeneratorWorkflowTriggerDuplicatePDF extends KTWorkflowTrigger { var $sNamespace; var $sFriendlyName; var $sDescription; var $oTriggerInstance; var $aConfig = array(); // generic requirements - both can be true var $bIsGuard = false; var $bIsAction = true; public function PDFGeneratorWorkflowTriggerDuplicatePDF() { $this->sNamespace = 'ktcore.workflowtriggers.pdfgenerator.duplicate'; $this->sFriendlyName = _kt('Copy the Document as PDF'); $this->sDescription = _kt('This action will create a pdf copy of the document as a new document.'); } // perform more expensive checks -before- performTransition. // Taken from : plugins\ktcore\KTWorkflowTriggers.inc.php public function precheckTransition($oDocument, $oUser) { $iFolderId = KTUtil::arrayGet($this->aConfig, 'folder_id'); $oFolder = Folder::get($iFolderId); if (PEAR::isError($oFolder)) { return PEAR::raiseError(_kt('The folder to which this document should be copied as PDF does not exist. Cancelling the transition - please contact a system administrator.')); } return true; } /** * Actually duplicate the Document: PDF creation, document copy, and PDF association */ function performTransition($oDocument, $oUser) { global $default; $iFolderId = KTUtil::arrayGet($this->aConfig, 'folder_id'); $oToFolder = Folder::get($iFolderId); if (PEAR::isError($oFolder)) { return PEAR::raiseError(_kt('The folder to which this document should be copied as PDF does not exist. Cancelling the transition - please contact a system administrator.')); } // Create the PDF $default->log->error("Create the PDF"); $pdfFile = $this->createPDF($oDocument); if (PEAR::isError($pdfFile)) { return $pdfFile; } $default->log->error("Duplicate-and-Copy the Document"); // Duplicate/Copy the Document $oNewDocument = KTDocumentUtil::copy($oDocument, $oToFolder); if (PEAR::isError($oNewDocument)) { return $oNewDocument; } $default->log->error("Associate PDF with the new document [$pdfFile]"); // Associate PDF with the new document $aOptions = array( 'temp_file' => $pdfFile, 'cleanup_initial_file' => false, ); $res = KTDocumentUtil::storeContents($oNewDocument, $oContents = null, $aOptions); if (PEAR::isError($res)) { $default->log->error("PDF Error: can't associate PDF file to document. storeDocument error = " . $res->message); // Remove the created document (not-correct) KTDocumentUtil::delete($oNewDocument, _kt("PDF WorkflowTrigger error: can't create associate PDF file to document.")); return $res; } // Change filename reporeted by Document: renamed to .PDF // TODO: maybe use the KTDocumentUtil::rename($oDocument, $sFilename, $oUser) for rename+MimeType? $sFilename= pathinfo($oNewDocument->getFileName(), PATHINFO_FILENAME); $oNewDocument->setFileName($sFilename . '.pdf'); // Changing MIME-Filetype $iMimeTypeId = KTMime::getMimeTypeID('application/pdf'); $oNewDocument->setMimeTypeId($iMimeTypeId); $bSuccess = $oNewDocument->update(); if ($bSuccess !== true) { return PEAR::raiseError(_kt("PDF WorkflowTrigger error: can't finalize document data as PDF.")); } // Returns the new document, so other plugin can extend this class to further handle the new PDF document return $oNewDocument; } /** * Create the PDF file for the given document (or re-use the already created one) * Returns the PDF filename or PEAR::error */ private function createPDF(&$oDocument) { global $default; $dir = $default->pdfDirectory; $iDocId = $oDocument->iId; $file = $dir .'/'. $iDocId . '.pdf'; if (!file_exists($file)) { // If not - create one $converter = new pdfConverter(); $converter->setDocument($oDocument); $res = $converter->processDocument(); if ($res !== true) { $default->log->error(__class__ . '::' . __function__ . '() PDF file could not be generated.'); return PEAR::raiseError(_kt('PDF file could not be generated; Please contact your System Administrator for assistance.')); } } return $file; } function displayConfiguration($args) { $oTemplating =& KTTemplating::getSingleton(); $oTemplate = $oTemplating->loadTemplate('ktcore/workflowtriggers/copyaction'); require_once(KT_LIB_DIR . '/browse/DocumentCollection.inc.php'); require_once(KT_LIB_DIR . '/browse/columnregistry.inc.php'); $collection = new AdvancedCollection; $oColumnRegistry = KTColumnRegistry::getSingleton(); $aColumns = array(); $aColumns[] = $oColumnRegistry->getColumn('ktcore.columns.singleselection'); $aColumns[] = $oColumnRegistry->getColumn('ktcore.columns.title'); $collection->addColumns($aColumns); $aOptions = $collection->getEnvironOptions(); // extract data from the environment $qsFrag = array(); foreach ($args as $k => $v) { if ($k == 'action') { $v = 'editactiontrigger'; } // horrible hack - we really need iframe embedding. $qsFrag[] = sprintf('%s=%s',urlencode($k), urlencode($v)); } $qs = implode('&',$qsFrag); $aOptions['result_url'] = KTUtil::addQueryStringSelf($qs); $aOptions['show_documents'] = false; $fFolderId = KTUtil::arrayGet($_REQUEST, 'fFolderId', KTUtil::arrayGet($this->aConfig, 'folder_id', 1)); $oFolder = Folder::get($fFolderId); if(PEAR::isError($oFolder)) { $iRoot = 1; $oFolder = Folder::get($iRoot); $fFolderId = 1; } $collection->setOptions($aOptions); $collection->setQueryObject(new BrowseQuery($fFolderId, $this->oUser)); $collection->setColumnOptions('ktcore.columns.singleselection', array( 'rangename' => 'folder_id', 'show_folders' => true, 'show_documents' => false, )); $collection->setColumnOptions('ktcore.columns.title', array( 'direct_folder' => false, 'folder_link' => $aOptions['result_url'], )); $aBreadcrumbs = array(); $folder_path_names = $oFolder->getPathArray(); $folder_path_ids = explode(',', $oFolder->getParentFolderIds()); $folder_path_ids[] = $oFolder->getId(); if ($folder_path_ids[0] == 0) { array_shift($folder_path_ids); array_shift($folder_path_names); } foreach (range(0, count($folder_path_ids) - 1) as $index) { $id = $folder_path_ids[$index]; $qsFrag2 = $qsFrag; $qsFrag2[] = sprintf('fFolderId=%d', $id); $qs2 = implode('&',$qsFrag2); $url = KTUtil::addQueryStringSelf($qs2); $aBreadcrumbs[] = sprintf('%s', $url, htmlentities($folder_path_names[$index], ENT_NOQUOTES, 'UTF-8')); } $sBreadcrumbs = implode(' » ', $aBreadcrumbs); $aTemplateData = array( 'context' => $this, 'breadcrumbs' => $sBreadcrumbs, 'collection' => $collection, 'args' => $args, ); return $oTemplate->render($aTemplateData); } function saveConfiguration() { $folder_id = KTUtil::arrayGet($_REQUEST, 'folder_id', null); $oFolder = Folder::get($folder_id); if (PEAR::isError($oFolder)) { // silenty ignore $folder_id = null; } $config = array(); $config['folder_id'] = $folder_id; $this->oTriggerInstance->setConfig($config); $res = $this->oTriggerInstance->update(); return $res; } function getConfigDescription() { if (!$this->isLoaded()) { return _kt('This trigger has no configuration.'); } // the actual permissions are stored in the array. $perms = array(); if (empty($this->aConfig) || is_null($this->aConfig['folder_id'])) { return _kt('This transition cannot be performed: no folder has been selected.'); } $oFolder = Folder::get($this->aConfig['folder_id']); if (PEAR::isError($oFolder)) { return _kt('The folder required for this trigger has been deleted, so the transition cannot be performed.'); } else { return sprintf(_kt('The document will be copied as PDF to folder "%s".'), KTBrowseUtil::getUrlForFolder($oFolder), htmlentities($oFolder->getName(), ENT_NOQUOTES, 'UTF-8')); } } }