Commit d3a07e607b618c64ebe8216d424f54e222825b6d

Authored by Kevin G Fourie
2 parents 043e6837 2f7495d0

Merge branch 'edge' into multiselect

Showing 53 changed files with 2777 additions and 1965 deletions
ktapi/ktapi.inc.php
@@ -2928,7 +2928,7 @@ class KTAPI @@ -2928,7 +2928,7 @@ class KTAPI
2928 * @param string $tempfilename 2928 * @param string $tempfilename
2929 * @return kt_document_detail. status_code can be KTWS_ERR_INVALID_SESSION, KTWS_ERR_INVALID_FOLDER, KTWS_ERR_INVALID_DOCUMENT or KTWS_SUCCESS 2929 * @return kt_document_detail. status_code can be KTWS_ERR_INVALID_SESSION, KTWS_ERR_INVALID_FOLDER, KTWS_ERR_INVALID_DOCUMENT or KTWS_SUCCESS
2930 */ 2930 */
2931 - public function checkin_document($document_id, $filename, $reason, $tempfilename, $major_update, 2931 + public function checkin_document($document_id, $filename, $reason, $tempfilename, $major_update,
2932 $sig_username = '', $sig_password = '') 2932 $sig_username = '', $sig_password = '')
2933 { 2933 {
2934 $response = $this->_check_electronic_signature($document_id, $sig_username, $sig_password, $reason, $reason, 2934 $response = $this->_check_electronic_signature($document_id, $sig_username, $sig_password, $reason, $reason,
lib/api/ktcmis/classes/CMISDocumentPropertyCollection.inc.php
@@ -71,6 +71,7 @@ class CMISDocumentPropertyCollection extends CMISPropertyCollection { @@ -71,6 +71,7 @@ class CMISDocumentPropertyCollection extends CMISPropertyCollection {
71 'ContentStreamMimeType' => 'propertyString', 71 'ContentStreamMimeType' => 'propertyString',
72 'ContentStreamFilename' => 'propertyString', 72 'ContentStreamFilename' => 'propertyString',
73 'ContentStreamUri' => 'propertyUri', 73 'ContentStreamUri' => 'propertyUri',
  74 + 'IsLatestVersion' => 'propertyBoolean',
74 'IsVersionSeriesCheckedOut' => 'propertyBoolean', 75 'IsVersionSeriesCheckedOut' => 'propertyBoolean',
75 'VersionSeriesCheckedOutBy' => 'propertyString', 76 'VersionSeriesCheckedOutBy' => 'propertyString',
76 'VersionSeriesCheckedOutId' => 'propertyId', 77 'VersionSeriesCheckedOutId' => 'propertyId',
lib/api/ktcmis/ktNavigationService.inc.php 0 → 100644
  1 +<?php
  2 +/**
  3 +* Navigation Service CMIS wrapper API for KnowledgeTree.
  4 +*
  5 +* KnowledgeTree Community Edition
  6 +* Document Management Made Simple
  7 +* Copyright (C) 2008,2009 KnowledgeTree Inc.
  8 +* Portions copyright The Jam Warehouse Software (Pty) Limited
  9 +*
  10 +* This program is free software; you can redistribute it and/or modify it under
  11 +* the terms of the GNU General Public License version 3 as published by the
  12 +* Free Software Foundation.
  13 +*
  14 +* This program is distributed in the hope that it will be useful, but WITHOUT
  15 +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  16 +* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
  17 +* details.
  18 +*
  19 +* You should have received a copy of the GNU General Public License
  20 +* along with this program. If not, see <http://www.gnu.org/licenses/>.
  21 +*
  22 +* You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco,
  23 +* California 94120-7775, or email info@knowledgetree.com.
  24 +*
  25 +* The interactive user interfaces in modified source and object code versions
  26 +* of this program must display Appropriate Legal Notices, as required under
  27 +* Section 5 of the GNU General Public License version 3.
  28 +*
  29 +* In accordance with Section 7(b) of the GNU General Public License version 3,
  30 +* these Appropriate Legal Notices must retain the display of the "Powered by
  31 +* KnowledgeTree" logo and retain the original copyright notice. If the display of the
  32 +* logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices
  33 +* must display the words "Powered by KnowledgeTree" and retain the original
  34 +* copyright notice.
  35 +*
  36 +* @copyright 2008-2009, KnowledgeTree Inc.
  37 +* @license GNU General Public License version 3
  38 +* @author KnowledgeTree Team
  39 +* @package KTCMIS
  40 +* @version Version 0.9
  41 +*/
  42 +
  43 +require_once(realpath(dirname(__FILE__) . '/ktService.inc.php'));
  44 +require_once(CMIS_DIR . '/services/CMISNavigationService.inc.php');
  45 +
  46 +/*
  47 + * Handles repository navigation
  48 + */
  49 +class KTNavigationService extends KTCMISBase {
  50 +
  51 + protected $NavigationService;
  52 +
  53 + public function __construct(&$ktapi = null, $username = null, $password = null)
  54 + {
  55 + parent::__construct($ktapi, $username, $password);
  56 + // instantiate underlying CMIS service
  57 + $this->NavigationService = new CMISNavigationService();
  58 + $this->setInterface();
  59 + }
  60 +
  61 + public function startSession($username, $password)
  62 + {
  63 + parent::startSession($username, $password);
  64 + $this->setInterface();
  65 + return self::$session;
  66 + }
  67 +
  68 + public function setInterface(&$ktapi = null)
  69 + {
  70 + parent::setInterface($ktapi);
  71 + $this->NavigationService->setInterface(self::$ktapi);
  72 + }
  73 +
  74 + /**
  75 + * Get descendents of the specified folder, up to the depth indicated
  76 + *
  77 + * @param string $repositoryId
  78 + * @param string $folderId
  79 + * @param boolean $includeAllowableActions
  80 + * @param boolean $includeRelationships
  81 + * @param string $typeID
  82 + * @param int $depth
  83 + * @param string $filter
  84 + * @return array $descendants
  85 + */
  86 + public function getDescendants($repositoryId, $folderId, $includeAllowableActions, $includeRelationships,
  87 + $depth = 1, $typeID = 'Any', $filter = '')
  88 + {
  89 + // TODO optional parameters
  90 + $descendantsResult = $this->NavigationService->getDescendants($repositoryId, $folderId, $includeAllowableActions,
  91 + $includeRelationships, $depth);
  92 +
  93 + if (PEAR::isError($descendantsResult))
  94 + {
  95 + return array(
  96 + "status_code" => 1,
  97 + "message" => "Failed getting descendants for folder"
  98 + );
  99 + }
  100 +
  101 + // format for webservices consumption
  102 + // NOTE this will almost definitely be changing in the future, this is just to get something working
  103 + $descendants = CMISUtil::decodeObjectHierarchy($descendantsResult, 'child');
  104 +
  105 + return array (
  106 + "status_code" => 0,
  107 + "results" => $descendants
  108 + );
  109 + }
  110 +
  111 + /**
  112 + * Get direct children of the specified folder
  113 + *
  114 + * @param string $repositoryId
  115 + * @param string $folderId
  116 + * @param boolean $includeAllowableActions
  117 + * @param boolean $includeRelationships
  118 + * @param string $typeID
  119 + * @param string $filter
  120 + * @param int $maxItems
  121 + * @param int $skipCount
  122 + * @return array $descendants
  123 + */
  124 + public function getChildren($repositoryId, $folderId, $includeAllowableActions, $includeRelationships,
  125 + $typeID = 'Any', $filter = '', $maxItems = 0, $skipCount = 0)
  126 + {
  127 + // TODO paging
  128 + // TODO optional parameters
  129 + $childrenResult = $this->NavigationService->getChildren($repositoryId, $folderId, $includeAllowableActions, $includeRelationships);
  130 +
  131 + if (PEAR::isError($childrenResult))
  132 + {
  133 + return array(
  134 + "status_code" => 1,
  135 + "message" => "Failed getting descendants for folder"
  136 + );
  137 + }
  138 +
  139 + $children = CMISUtil::decodeObjectHierarchy($childrenResult, 'child');
  140 +
  141 + return array(
  142 + "status_code" => 0,
  143 + "results" => $children
  144 + );
  145 + }
  146 +
  147 + /**
  148 + * Gets the parent of the selected folder
  149 + *
  150 + * @param string $repositoryId
  151 + * @param string $folderId
  152 + * @param boolean $includeAllowableActions
  153 + * @param boolean $includeRelationships
  154 + * @param boolean $returnToRoot
  155 + * @param string $filter
  156 + * @return ancestry[]
  157 + */
  158 + public function getFolderParent($repositoryId, $folderId, $includeAllowableActions, $includeRelationships, $returnToRoot, $filter = '')
  159 + {
  160 + $ancestryResult = $this->NavigationService->getFolderParent($repositoryId, $folderId, $includeAllowableActions,
  161 + $includeRelationships, $returnToRoot);
  162 +
  163 + if (PEAR::isError($ancestryResult))
  164 + {
  165 + return array(
  166 + "status_code" => 1,
  167 + "message" => "Failed getting ancestry for folder"
  168 + );
  169 + }
  170 +
  171 + $ancestry = CMISUtil::decodeObjectHierarchy($ancestryResult, 'child');
  172 +
  173 + return array(
  174 + "status_code" => 0,
  175 + "results" => $ancestry
  176 + );
  177 + }
  178 +
  179 + /**
  180 + * Gets the parents for the selected object
  181 + *
  182 + * @param string $repositoryId
  183 + * @param string $folderId
  184 + * @param boolean $includeAllowableActions
  185 + * @param boolean $includeRelationships
  186 + * @param string $filter
  187 + * @return ancestry[]
  188 + */
  189 + function getObjectParents($repositoryId, $objectId, $includeAllowableActions, $includeRelationships, $filter = '')
  190 + {
  191 + $ancestryResult = $this->NavigationService->getObjectParents($repositoryId, $objectId, $includeAllowableActions,
  192 + $includeRelationships);
  193 +
  194 + if (PEAR::isError($ancestryResult))
  195 + {
  196 + return array(
  197 + "status_code" => 1,
  198 + "message" => "Failed getting ancestry for object"
  199 + );
  200 + }
  201 +
  202 + $ancestry = CMISUtil::decodeObjectHierarchy($ancestryResult, 'child');
  203 +
  204 + return array(
  205 + "status_code" => 0,
  206 + "results" => $ancestry
  207 + );
  208 + }
  209 +
  210 + /**
  211 + * Returns a list of checked out documents from the selected repository
  212 + *
  213 + * @param string $repositoryId
  214 + * @param string $folderId The folder for which checked out docs are requested
  215 + * @param string $filter
  216 + * @param boolean $includeAllowableActions
  217 + * @param boolean $includeRelationships
  218 + * @param int $maxItems
  219 + * @param int $skipCount
  220 + * @return array $checkedout The collection of checked out documents
  221 + */
  222 + function getCheckedOutDocs($repositoryId, $includeAllowableActions, $includeRelationships, $folderId = null, $filter = '',
  223 + $maxItems = 0, $skipCount = 0)
  224 + {
  225 + $checkedout = $this->NavigationService->getCheckedOutDocs($repositoryId, $includeAllowableActions, $includeRelationships,
  226 + $folderId, $filter, $maxItems, $skipCount);
  227 +
  228 + if (PEAR::isError($checkedout))
  229 + {
  230 + return array(
  231 + "status_code" => 1,
  232 + "message" => "Failed getting list of checked out documents"
  233 + );
  234 + }
  235 +
  236 + // convert to array format for external code
  237 + $co = array();
  238 + foreach ($checkedout as $documentProperties)
  239 + {
  240 + $co[] = CMISUtil::createObjectPropertiesEntry($documentProperties);;
  241 + }
  242 +
  243 + return array(
  244 + "status_code" => 0,
  245 + "results" => $co
  246 + );
  247 + }
  248 +
  249 +}
  250 +
  251 +?>
0 \ No newline at end of file 252 \ No newline at end of file
lib/api/ktcmis/ktObjectService.inc.php 0 → 100644
  1 +<?php
  2 +/**
  3 +* Object Service CMIS wrapper API for KnowledgeTree.
  4 +*
  5 +* KnowledgeTree Community Edition
  6 +* Document Management Made Simple
  7 +* Copyright (C) 2008,2009 KnowledgeTree Inc.
  8 +* Portions copyright The Jam Warehouse Software (Pty) Limited
  9 +*
  10 +* This program is free software; you can redistribute it and/or modify it under
  11 +* the terms of the GNU General Public License version 3 as published by the
  12 +* Free Software Foundation.
  13 +*
  14 +* This program is distributed in the hope that it will be useful, but WITHOUT
  15 +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  16 +* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
  17 +* details.
  18 +*
  19 +* You should have received a copy of the GNU General Public License
  20 +* along with this program. If not, see <http://www.gnu.org/licenses/>.
  21 +*
  22 +* You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco,
  23 +* California 94120-7775, or email info@knowledgetree.com.
  24 +*
  25 +* The interactive user interfaces in modified source and object code versions
  26 +* of this program must display Appropriate Legal Notices, as required under
  27 +* Section 5 of the GNU General Public License version 3.
  28 +*
  29 +* In accordance with Section 7(b) of the GNU General Public License version 3,
  30 +* these Appropriate Legal Notices must retain the display of the "Powered by
  31 +* KnowledgeTree" logo and retain the original copyright notice. If the display of the
  32 +* logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices
  33 +* must display the words "Powered by KnowledgeTree" and retain the original
  34 +* copyright notice.
  35 +*
  36 +* @copyright 2008-2009, KnowledgeTree Inc.
  37 +* @license GNU General Public License version 3
  38 +* @author KnowledgeTree Team
  39 +* @package KTCMIS
  40 +* @version Version 0.9
  41 +*/
  42 +
  43 +require_once(realpath(dirname(__FILE__) . '/ktService.inc.php'));
  44 +require_once(CMIS_DIR . '/services/CMISObjectService.inc.php');
  45 +
  46 +/**
  47 + * Handles requests for and actions on Folders and Documents
  48 + */
  49 +class KTObjectService extends KTCMISBase {
  50 +
  51 + protected $ObjectService;
  52 +
  53 + public function __construct(&$ktapi = null, $username = null, $password = null)
  54 + {
  55 + parent::__construct($ktapi, $username, $password);
  56 + // instantiate underlying CMIS service
  57 + $this->ObjectService = new CMISObjectService();
  58 + $this->setInterface();
  59 + }
  60 +
  61 + public function startSession($username, $password)
  62 + {
  63 + parent::startSession($username, $password);
  64 + $this->setInterface();
  65 + return self::$session;
  66 + }
  67 +
  68 + public function setInterface(&$ktapi = null)
  69 + {
  70 + parent::setInterface($ktapi);
  71 + $this->ObjectService->setInterface(self::$ktapi);
  72 + }
  73 +
  74 + /**
  75 + * Gets the properties for the selected object
  76 + *
  77 + * @param string $repositoryId
  78 + * @param string $objectId
  79 + * @param boolean $includeAllowableActions
  80 + * @param boolean $includeRelationships
  81 + * @param string $returnVersion
  82 + * @param string $filter
  83 + * @return properties[]
  84 + */
  85 + public function getProperties($repositoryId, $objectId, $includeAllowableActions, $includeRelationships,
  86 + $returnVersion = false, $filter = '')
  87 + {
  88 + try {
  89 + $propertyCollection = $this->ObjectService->getProperties($repositoryId, $objectId, $includeAllowableActions,
  90 + $includeRelationships);
  91 + }
  92 + catch (Exception $e)
  93 + {
  94 + return array(
  95 + "status_code" => 1,
  96 + "message" => $e->getMessage()
  97 + );
  98 + }
  99 +
  100 + $properties = CMISUtil::createObjectPropertiesEntry($propertyCollection);
  101 +
  102 + return array(
  103 + "status_code" => 0,
  104 + "results" => $properties
  105 + );
  106 + }
  107 +
  108 + /**
  109 + * Creates a new document within the repository
  110 + *
  111 + * @param string $repositoryId The repository to which the document must be added
  112 + * @param string $typeId Object Type id for the document object being created
  113 + * @param array $properties Array of properties which must be applied to the created document object
  114 + * @param string $folderId The id of the folder which will be the parent of the created document object
  115 + * This parameter is optional IF unfilingCapability is supported
  116 + * @param contentStream $contentStream optional content stream data
  117 + * @param string $versioningState optional version state value: checkedout/major/minor
  118 + * @return string $objectId The id of the created folder object
  119 + */
  120 + public function createDocument($repositoryId, $typeId, $properties, $folderId = null,
  121 + $contentStream = null, $versioningState = null)
  122 + {
  123 + $objectId = null;
  124 +
  125 + try {
  126 + $objectId = $this->ObjectService->createDocument($repositoryId, $typeId, $properties, $folderId,
  127 + $contentStream, $versioningState);
  128 + }
  129 + catch (Exception $e)
  130 + {
  131 + return array(
  132 + "status_code" => 1,
  133 + "message" => $e->getMessage()
  134 + );
  135 + }
  136 +
  137 + return array(
  138 + 'status_code' => 0,
  139 + 'results' => $objectId
  140 + );
  141 + }
  142 +
  143 + /**
  144 + * Creates a new folder within the repository
  145 + *
  146 + * @param string $repositoryId The repository to which the folder must be added
  147 + * @param string $typeId Object Type id for the folder object being created
  148 + * @param array $properties Array of properties which must be applied to the created folder object
  149 + * @param string $folderId The id of the folder which will be the parent of the created folder object
  150 + * @return string $objectId The id of the created folder object
  151 + */
  152 + public function createFolder($repositoryId, $typeId, $properties, $folderId)
  153 + {
  154 + $objectId = null;
  155 +
  156 + try {
  157 + $objectId = $this->ObjectService->createFolder($repositoryId, $typeId, $properties, $folderId);
  158 + }
  159 + catch (Exception $e)
  160 + {
  161 + return array(
  162 + "status_code" => 1,
  163 + "message" => $e->getMessage()
  164 + );
  165 + }
  166 +
  167 + return array(
  168 + 'status_code' => 0,
  169 + 'results' => $objectId
  170 + );
  171 + }
  172 +
  173 + /**
  174 + * Fetches the content stream data for an object
  175 + *
  176 + * @param string $repositoryId
  177 + * @param string $objectId
  178 + * @return string $contentStream (binary or text data)
  179 + */
  180 + function getContentStream($repositoryId, $objectId)
  181 + {
  182 + try {
  183 + $contentStream = $this->ObjectService->getContentStream($repositoryId, $objectId);
  184 + }
  185 + catch (Exception $e)
  186 + {
  187 + return array(
  188 + "status_code" => 1,
  189 + "message" => $e->getMessage()
  190 + );
  191 + }
  192 +
  193 + return array(
  194 + 'status_code' => 0,
  195 + 'results' => $contentStream
  196 + );
  197 + }
  198 +
  199 + /**
  200 + * Moves a fileable object from one folder to another.
  201 + *
  202 + * @param object $repositoryId
  203 + * @param object $objectId
  204 + * @param object $changeToken [optional]
  205 + * @param object $targetFolderId
  206 + * @param object $sourceFolderId [optional]
  207 + */
  208 + public function moveObject($repositoryId, $objectId, $changeToken = '', $targetFolderId, $sourceFolderId = null)
  209 + {
  210 + try {
  211 + $this->ObjectService->moveObject($repositoryId, $objectId, $changeToken, $targetFolderId, $sourceFolderId);
  212 + }
  213 + catch (Exception $e)
  214 + {
  215 + return array(
  216 + "status_code" => 1,
  217 + "message" => $e->getMessage()
  218 + );
  219 + }
  220 +
  221 + return array(
  222 + 'status_code' => 0,
  223 + 'results' => $objectId
  224 + );
  225 + }
  226 +
  227 + /**
  228 + * Deletes an object from the repository
  229 + *
  230 + * @param string $repositoryId
  231 + * @param string $objectId
  232 + * @param string $changeToken [optional]
  233 + * @return array
  234 + */
  235 + // NOTE Invoking this service method on an object SHALL not delete the entire version series for a Document Object.
  236 + // To delete an entire version series, use the deleteAllVersions() service
  237 + public function deleteObject($repositoryId, $objectId, $changeToken = null)
  238 + {
  239 + try {
  240 + $this->ObjectService->deleteObject($repositoryId, $objectId, $changeToken);
  241 + }
  242 + catch (Exception $e)
  243 + {
  244 + return array(
  245 + "status_code" => 1,
  246 + "message" => $e->getMessage()
  247 + );
  248 + }
  249 +
  250 + return array(
  251 + 'status_code' => 0,
  252 + 'results' => $objectId
  253 + );
  254 + }
  255 +
  256 + public function deleteTree($repositoryId, $objectId, $changeToken = null, $unfileNonfolderObject = 'delete', $continueOnFailure = false)
  257 + {
  258 + try {
  259 + $result = $this->ObjectService->deleteTree($repositoryId, $objectId, $changeToken, $unfileNonfolderObject, $continueOnFailure);
  260 + }
  261 + catch (Exception $e)
  262 + {
  263 + return array(
  264 + "status_code" => 1,
  265 + "message" => $e->getMessage()
  266 + );
  267 + }
  268 +
  269 + // check whether there is a list of items which did not delete
  270 + if (count($result) > 0)
  271 + {
  272 + return array(
  273 + "status_code" => 1,
  274 + "message" => $result
  275 + );
  276 + }
  277 +
  278 + return array(
  279 + 'status_code' => 0,
  280 + 'results' => $objectId
  281 + );
  282 + }
  283 +
  284 + /**
  285 + * Sets the content stream data for an existing document
  286 + *
  287 + * if $overwriteFlag = TRUE, the new content stream is applied whether or not the document has an existing content stream
  288 + * if $overwriteFlag = FALSE, the new content stream is applied only if the document does not have an existing content stream
  289 + *
  290 + * NOTE A Repository MAY automatically create new Document versions as part of this service method.
  291 + * Therefore, the documentId output NEED NOT be identical to the documentId input.
  292 + *
  293 + * @param string $repositoryId
  294 + * @param string $documentId
  295 + * @param boolean $overwriteFlag
  296 + * @param string $contentStream
  297 + * @param string $changeToken
  298 + * @return string $documentId
  299 + */
  300 + function setContentStream($repositoryId, $documentId, $overwriteFlag, $contentStream, $changeToken = null)
  301 + {
  302 + try {
  303 + $documentId = $this->ObjectService->setContentStream($repositoryId, $documentId, $overwriteFlag, $contentStream, $changeToken);
  304 + }
  305 + catch (Exception $e)
  306 + {
  307 + return array(
  308 + "status_code" => 1,
  309 + "message" => $e->getMessage()
  310 + );
  311 + }
  312 +
  313 + return array(
  314 + 'status_code' => 0,
  315 + 'results' => $documentId
  316 + );
  317 + }
  318 +
  319 +}
  320 +
  321 +?>
0 \ No newline at end of file 322 \ No newline at end of file
lib/api/ktcmis/ktRepositoryService.inc.php 0 → 100644
  1 +<?php
  2 +/**
  3 +* Repository Service CMIS wrapper API for KnowledgeTree.
  4 +*
  5 +* KnowledgeTree Community Edition
  6 +* Document Management Made Simple
  7 +* Copyright (C) 2008,2009 KnowledgeTree Inc.
  8 +* Portions copyright The Jam Warehouse Software (Pty) Limited
  9 +*
  10 +* This program is free software; you can redistribute it and/or modify it under
  11 +* the terms of the GNU General Public License version 3 as published by the
  12 +* Free Software Foundation.
  13 +*
  14 +* This program is distributed in the hope that it will be useful, but WITHOUT
  15 +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  16 +* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
  17 +* details.
  18 +*
  19 +* You should have received a copy of the GNU General Public License
  20 +* along with this program. If not, see <http://www.gnu.org/licenses/>.
  21 +*
  22 +* You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco,
  23 +* California 94120-7775, or email info@knowledgetree.com.
  24 +*
  25 +* The interactive user interfaces in modified source and object code versions
  26 +* of this program must display Appropriate Legal Notices, as required under
  27 +* Section 5 of the GNU General Public License version 3.
  28 +*
  29 +* In accordance with Section 7(b) of the GNU General Public License version 3,
  30 +* these Appropriate Legal Notices must retain the display of the "Powered by
  31 +* KnowledgeTree" logo and retain the original copyright notice. If the display of the
  32 +* logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices
  33 +* must display the words "Powered by KnowledgeTree" and retain the original
  34 +* copyright notice.
  35 +*
  36 +* @copyright 2008-2009, KnowledgeTree Inc.
  37 +* @license GNU General Public License version 3
  38 +* @author KnowledgeTree Team
  39 +* @package KTCMIS
  40 +* @version Version 0.9
  41 +*/
  42 +
  43 +require_once(realpath(dirname(__FILE__) . '/ktService.inc.php'));
  44 +require_once(CMIS_DIR . '/services/CMISRepositoryService.inc.php');
  45 +
  46 +/**
  47 + * Handles low level repository information queries
  48 + */
  49 +class KTRepositoryService extends KTCMISBase {
  50 +
  51 + protected $RepositoryService;
  52 +
  53 + public function __construct()
  54 + {
  55 + // we don't need to call the parent constructor here as there is no ktapi involved
  56 + // instantiate underlying CMIS service
  57 + $this->RepositoryService = new CMISRepositoryService();
  58 + }
  59 +
  60 + /**
  61 + * Fetch a list of all available repositories
  62 + *
  63 + * NOTE Since we only have one repository at the moment, this is expected to only return one result
  64 + *
  65 + * @return repositoryList[]
  66 + */
  67 + public function getRepositories()
  68 + {
  69 + $repositories = $this->RepositoryService->getRepositories();
  70 + if (PEAR::isError($repositories))
  71 + {
  72 + return array(
  73 + "status_code" => 1,
  74 + "message" => "Failed getting repositories"
  75 + );
  76 + }
  77 +
  78 + // extract the required info fields into array format for easy encoding;
  79 + $count = 0;
  80 + $repositoryList = array();
  81 + foreach ($repositories as $repository)
  82 + {
  83 + $repositoryList[$count]['repositoryId'] = $repository->getRepositoryId();
  84 + $repositoryList[$count]['repositoryName'] = $repository->getRepositoryName();
  85 + $repositoryList[$count]['repositoryURI'] = $repository->getRepositoryURI();
  86 + ++$count;
  87 + }
  88 +
  89 + return array(
  90 + "status_code" => 0,
  91 + "results" => $repositoryList
  92 + );
  93 + }
  94 +
  95 + /**
  96 + * Fetches information about the selected repository
  97 + *
  98 + * @param string $repositoryId
  99 + */
  100 + public function getRepositoryInfo($repositoryId)
  101 + {
  102 + $repositoryInfo = $this->RepositoryService->getRepositoryInfo($repositoryId);
  103 + if (PEAR::isError($repositoryInfo))
  104 + {
  105 + return array(
  106 + "status_code" => 1,
  107 + "message" => "Failed getting repository information"
  108 + );
  109 + }
  110 +
  111 + // TODO output this manually, the function works but only for some objects so rather avoid it completely?
  112 + // NOTE the problems appear to be due to recursive objects
  113 + return array (
  114 + "status_code" => 0,
  115 + "results" => CMISUtil::objectToArray($repositoryInfo)
  116 + );
  117 + }
  118 +
  119 + /**
  120 + * Fetch the list of supported object types for the selected repository
  121 + *
  122 + * @param string $repositoryId
  123 + */
  124 + public function getTypes($repositoryId, $typeId = '', $returnPropertyDefinitions = false,
  125 + $maxItems = 0, $skipCount = 0, &$hasMoreItems = false)
  126 + {
  127 + try {
  128 + $repositoryObjectTypeResult = $this->RepositoryService->getTypes($repositoryId, $typeId, $returnPropertyDefinitions,
  129 + $maxItems, $skipCount, $hasMoreItems);
  130 + }
  131 + catch (Exception $e)
  132 + {
  133 + return array(
  134 + "status_code" => 1,
  135 + "message" => $e->getMessage()
  136 + );
  137 + }
  138 +
  139 + // format as array style output
  140 + // NOTE only concerned with attributes at this time
  141 + // TODO add support for properties
  142 + foreach($repositoryObjectTypeResult as $key => $objectType)
  143 + {
  144 + $repositoryObjectTypes[$key] = $objectType['attributes'];
  145 + // TODO properties
  146 + // $repositoryObjectTypes[$key]['properties'] = $objectType['properties'];
  147 + }
  148 +
  149 + return array (
  150 + "status_code" => 0,
  151 + "results" => $repositoryObjectTypes
  152 + );
  153 + }
  154 +
  155 + /**
  156 + * Fetch the object type definition for the requested type
  157 + *
  158 + * @param string $repositoryId
  159 + * @param string $typeId
  160 + */
  161 + public function getTypeDefinition($repositoryId, $typeId)
  162 + {
  163 + try {
  164 + $typeDefinitionResult = $this->RepositoryService->getTypeDefinition($repositoryId, $typeId);
  165 + }
  166 + catch (Exception $e)
  167 + {
  168 + return array(
  169 + "status_code" => 1,
  170 + "message" => $e->getMessage()
  171 + );
  172 + }
  173 +
  174 + // format as array style output
  175 + // NOTE only concerned with attributes at this time
  176 + // TODO add support for properties
  177 + $typeDefinition = $typeDefinitionResult['attributes'];
  178 +
  179 + return array (
  180 + "status_code" => 0,
  181 + "results" => $typeDefinition
  182 + );
  183 + }
  184 +
  185 +}
  186 +
  187 +?>
0 \ No newline at end of file 188 \ No newline at end of file
lib/api/ktcmis/ktService.inc.php 0 → 100644
  1 +<?php
  2 +/**
  3 +* Base service class for CMIS wrapper API for KnowledgeTree.
  4 +*
  5 +* KnowledgeTree Community Edition
  6 +* Document Management Made Simple
  7 +* Copyright (C) 2008,2009 KnowledgeTree Inc.
  8 +* Portions copyright The Jam Warehouse Software (Pty) Limited
  9 +*
  10 +* This program is free software; you can redistribute it and/or modify it under
  11 +* the terms of the GNU General Public License version 3 as published by the
  12 +* Free Software Foundation.
  13 +*
  14 +* This program is distributed in the hope that it will be useful, but WITHOUT
  15 +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  16 +* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
  17 +* details.
  18 +*
  19 +* You should have received a copy of the GNU General Public License
  20 +* along with this program. If not, see <http://www.gnu.org/licenses/>.
  21 +*
  22 +* You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco,
  23 +* California 94120-7775, or email info@knowledgetree.com.
  24 +*
  25 +* The interactive user interfaces in modified source and object code versions
  26 +* of this program must display Appropriate Legal Notices, as required under
  27 +* Section 5 of the GNU General Public License version 3.
  28 +*
  29 +* In accordance with Section 7(b) of the GNU General Public License version 3,
  30 +* these Appropriate Legal Notices must retain the display of the "Powered by
  31 +* KnowledgeTree" logo and retain the original copyright notice. If the display of the
  32 +* logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices
  33 +* must display the words "Powered by KnowledgeTree" and retain the original
  34 +* copyright notice.
  35 +*
  36 +* @copyright 2008-2009, KnowledgeTree Inc.
  37 +* @license GNU General Public License version 3
  38 +* @author KnowledgeTree Team
  39 +* @package KTCMIS
  40 +* @version Version 0.9
  41 +*/
  42 +
  43 +require_once(realpath(dirname(__FILE__) . '/../../../config/dmsDefaults.php'));
  44 +require_once(KT_DIR . '/ktapi/ktapi.inc.php');
  45 +
  46 +define ('CMIS_DIR', KT_LIB_DIR . '/api/ktcmis');
  47 +require_once(CMIS_DIR . '/exceptions/PermissionDeniedException.inc.php');
  48 +require_once(CMIS_DIR . '/util/CMISUtil.inc.php');
  49 +
  50 +/**
  51 + * Base class for all KT CMIS classes
  52 + * Handles authentication
  53 + *
  54 + * This class is required for all CMIS Service classes
  55 + */
  56 +class KTCMISBase {
  57 +
  58 + // we want all child classes to share the ktapi and session instances, no matter where they are set from,
  59 + // so we declare them as static
  60 + static protected $ktapi;
  61 + static protected $session;
  62 +
  63 + public function __construct(&$ktapi = null, $username = null, $password = null)
  64 + {
  65 + // TODO confirm KTAPI instance active??? shouldn't really be responsibility of this code
  66 + if (is_null($ktapi) && (!is_null($username) && !is_null($password))) {
  67 + $this->startSession($username, $password);
  68 + }
  69 + else if (!is_null($ktapi)) {
  70 + self::$ktapi = $ktapi;
  71 + self::$session = self::$ktapi->get_session();
  72 + }
  73 + }
  74 +
  75 + // TODO this probably does not belong here??? probably should require all auth external, handled by transport protocol.
  76 + // perhaps simple refusal to execute without valid session?
  77 + // NOTE left in to allow transport protocol to delegate auth to this level, but not actually used in any code at present
  78 + public function startSession($username, $password)
  79 + {
  80 + // attempt to recover session if one exists
  81 + if (!is_null(self::$session) && !PEAR::isError(self::$session))
  82 + {
  83 + self::$session =& self::$ktapi->get_active_session(self::$session->get_sessionid());
  84 + }
  85 +
  86 + // start new session if no existing session or problem getting existing session (expired, etc...)
  87 + if (is_null(self::$session) || PEAR::isError(self::$session))
  88 + {
  89 + self::$ktapi = new KTAPI();
  90 + self::$session =& self::$ktapi->start_session($username, $password);
  91 + }
  92 +
  93 + // failed authentication?
  94 + if (PEAR::isError(self::$session))
  95 + {
  96 + throw new PermissionDeniedException('You must be authenticated to perform this action');
  97 + }
  98 +
  99 + return self::$session;
  100 + }
  101 +
  102 + public function setInterface(&$ktapi = null)
  103 + {
  104 + if (!is_null($ktapi)) {
  105 + self::$ktapi = $ktapi;
  106 + }
  107 + }
  108 +
  109 + public function getInterface()
  110 + {
  111 + return self::$ktapi;
  112 + }
  113 +
  114 + public function getSession()
  115 + {
  116 + return self::$session;
  117 + }
  118 +
  119 + // TODO what about destroying sessions? only on logout (which is not offered by the CMIS clients tested so far)
  120 +}
  121 +
  122 +?>
0 \ No newline at end of file 123 \ No newline at end of file
lib/api/ktcmis/ktVersioningService.inc.php 0 → 100644
  1 +<?php
  2 +/**
  3 +* Versioning Service CMIS wrapper API for KnowledgeTree.
  4 +*
  5 +* KnowledgeTree Community Edition
  6 +* Document Management Made Simple
  7 +* Copyright (C) 2008,2009 KnowledgeTree Inc.
  8 +* Portions copyright The Jam Warehouse Software (Pty) Limited
  9 +*
  10 +* This program is free software; you can redistribute it and/or modify it under
  11 +* the terms of the GNU General Public License version 3 as published by the
  12 +* Free Software Foundation.
  13 +*
  14 +* This program is distributed in the hope that it will be useful, but WITHOUT
  15 +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  16 +* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
  17 +* details.
  18 +*
  19 +* You should have received a copy of the GNU General Public License
  20 +* along with this program. If not, see <http://www.gnu.org/licenses/>.
  21 +*
  22 +* You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco,
  23 +* California 94120-7775, or email info@knowledgetree.com.
  24 +*
  25 +* The interactive user interfaces in modified source and object code versions
  26 +* of this program must display Appropriate Legal Notices, as required under
  27 +* Section 5 of the GNU General Public License version 3.
  28 +*
  29 +* In accordance with Section 7(b) of the GNU General Public License version 3,
  30 +* these Appropriate Legal Notices must retain the display of the "Powered by
  31 +* KnowledgeTree" logo and retain the original copyright notice. If the display of the
  32 +* logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices
  33 +* must display the words "Powered by KnowledgeTree" and retain the original
  34 +* copyright notice.
  35 +*
  36 +* @copyright 2008-2009, KnowledgeTree Inc.
  37 +* @license GNU General Public License version 3
  38 +* @author KnowledgeTree Team
  39 +* @package KTCMIS
  40 +* @version Version 0.9
  41 +*/
  42 +
  43 +/**
  44 + * Split into individual classes to handle each section of functionality.
  45 + * This is really just a handling layer between CMIS and the web services.
  46 + */
  47 +
  48 +require_once(realpath(dirname(__FILE__) . '/ktService.inc.php'));
  49 +require_once(CMIS_DIR . '/services/CMISVersioningService.inc.php');
  50 +
  51 +/**
  52 + * Handles requests for and actions on versionable objects
  53 + */
  54 +class KTVersioningService extends KTCMISBase {
  55 +
  56 + protected $VersioningService;
  57 +
  58 + public function __construct(&$ktapi = null, $username = null, $password = null)
  59 + {
  60 + parent::__construct($ktapi, $username, $password);
  61 + // instantiate underlying CMIS service
  62 + $this->VersioningService = new CMISVersioningService();
  63 + $this->setInterface();
  64 + }
  65 +
  66 + public function startSession($username, $password)
  67 + {
  68 + parent::startSession($username, $password);
  69 + $this->setInterface();
  70 + return self::$session;
  71 + }
  72 +
  73 + public function setInterface(&$ktapi = null)
  74 + {
  75 + parent::setInterface($ktapi);
  76 + $this->VersioningService->setInterface(self::$ktapi);
  77 + }
  78 +
  79 + /**
  80 + * Deletes all Document Objects in the specified Version Series, including the Private Working Copy
  81 + *
  82 + * @param string $repositoryId
  83 + * @param string $versionSeriesId
  84 + * @return boolean true if successful
  85 + */
  86 + public function deleteAllVersions($repositoryId, $versionSeriesId)
  87 + {
  88 + try {
  89 + $result = $this->VersioningService->deleteAllVersions($repositoryId, $versionSeriesId);
  90 + }
  91 + catch (Exception $e)
  92 + {
  93 + return array(
  94 + "status_code" => 1,
  95 + "message" => $e->getMessage()
  96 + );
  97 + }
  98 +
  99 + return array(
  100 + 'status_code' => 0,
  101 + 'results' => $result
  102 + );
  103 + }
  104 +
  105 + /**
  106 + * Checks out a document and creates the PWC (Private Working Copy) which will represent the checked out document
  107 + *
  108 + * @param string $repositoryId
  109 + * @param string $documentId
  110 + * @param string $changeToken [optional]
  111 + * @return array results
  112 + */
  113 + // TODO set up delivery of content stream? or is that up to the CMIS client?
  114 + public function checkOut($repositoryId, $documentId, $changeToken = '')
  115 + {
  116 + try {
  117 + $result = $this->VersioningService->checkOut($repositoryId, $documentId, $changeToken);
  118 + }
  119 + catch (Exception $e)
  120 + {
  121 + return array(
  122 + "status_code" => 1,
  123 + "message" => $e->getMessage()
  124 + );
  125 + }
  126 +
  127 + return array(
  128 + 'status_code' => 0,
  129 + 'results' => (!empty($result) ? $result : 'Document Checked Out')
  130 + );
  131 + }
  132 +
  133 + /**
  134 + * Reverses the effect of a checkout: I.E. deletes the PWC (Private Working Copy) and re-sets the status of the document to "not checked out"
  135 + *
  136 + * @param string $repositoryId
  137 + * @param string $documentId
  138 + * @param string $changeToken [optional]
  139 + */
  140 + // TODO exceptions:
  141 + // • ConstraintViolationException: The Repository SHALL throw this exception if ANY of the following conditions are met:
  142 + // o The Document’s Object-Type definition’s versionable attribute is FALSE.
  143 + // • updateConflictException
  144 + // • versioningException
  145 + public function cancelCheckOut($repositoryId, $documentId, $changeToken = '')
  146 + {
  147 + try {
  148 + $result = $this->VersioningService->cancelCheckOut($repositoryId, $documentId, $changeToken);
  149 + }
  150 + catch (Exception $e)
  151 + {
  152 + return array(
  153 + "status_code" => 1,
  154 + "message" => $e->getMessage()
  155 + );
  156 + }
  157 +
  158 + return array(
  159 + 'status_code' => 0,
  160 + 'results' => (!empty($result) ? $result : 'Document Checkout Cancelled')
  161 + );
  162 + }
  163 +
  164 + /**
  165 + * Checks in a checked out document
  166 + *
  167 + * @param string $repositoryId
  168 + * @param string $documentId
  169 + * @param boolean $major
  170 + * @param string $changeToken [optional]
  171 + * @param array $properties [optional]
  172 + * @param contentStream $contentStream [optional]
  173 + * @param string $checkinComment [optional]
  174 + * @return string $documentId
  175 + */
  176 + public function checkIn($repositoryId, $documentId, $major, $contentStream = null, $changeToken = '', $properties = array(), $checkinComment = '')
  177 + {
  178 + try {
  179 + $result = $this->VersioningService->checkIn($repositoryId, $documentId, $major, $contentStream, $changeToken, $properties, $checkinComment);
  180 + }
  181 + catch (Exception $e)
  182 + {
  183 + return array(
  184 + "status_code" => 1,
  185 + "message" => $e->getMessage()
  186 + );
  187 + }
  188 +
  189 + return array(
  190 + 'status_code' => 0,
  191 + 'results' => (!empty($result) ? $result : 'Document Checked In Successfully')
  192 + );
  193 + }
  194 +
  195 +}
  196 +
  197 +?>
0 \ No newline at end of file 198 \ No newline at end of file
lib/api/ktcmis/ktcmis.inc.php deleted
1 -<?php  
2 -/**  
3 -* Implements a CMIS wrapper API for KnowledgeTree.  
4 -*  
5 -* KnowledgeTree Community Edition  
6 -* Document Management Made Simple  
7 -* Copyright (C) 2008,2009 KnowledgeTree Inc.  
8 -* Portions copyright The Jam Warehouse Software (Pty) Limited  
9 -*  
10 -* This program is free software; you can redistribute it and/or modify it under  
11 -* the terms of the GNU General Public License version 3 as published by the  
12 -* Free Software Foundation.  
13 -*  
14 -* This program is distributed in the hope that it will be useful, but WITHOUT  
15 -* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS  
16 -* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more  
17 -* details.  
18 -*  
19 -* You should have received a copy of the GNU General Public License  
20 -* along with this program. If not, see <http://www.gnu.org/licenses/>.  
21 -*  
22 -* You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco,  
23 -* California 94120-7775, or email info@knowledgetree.com.  
24 -*  
25 -* The interactive user interfaces in modified source and object code versions  
26 -* of this program must display Appropriate Legal Notices, as required under  
27 -* Section 5 of the GNU General Public License version 3.  
28 -*  
29 -* In accordance with Section 7(b) of the GNU General Public License version 3,  
30 -* these Appropriate Legal Notices must retain the display of the "Powered by  
31 -* KnowledgeTree" logo and retain the original copyright notice. If the display of the  
32 -* logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices  
33 -* must display the words "Powered by KnowledgeTree" and retain the original  
34 -* copyright notice.  
35 -*  
36 -* @copyright 2008-2009, KnowledgeTree Inc.  
37 -* @license GNU General Public License version 3  
38 -* @author KnowledgeTree Team  
39 -* @package KTCMIS  
40 -* @version Version 0.9  
41 -*/  
42 -  
43 -/**  
44 - * Split into individual classes to handle each section of functionality.  
45 - * This is really just a handling layer between CMIS and the web services.  
46 - */  
47 -  
48 -// TODO implement exceptions in various calls (in the underlying classes)  
49 -// FIXME none of the error handling actually does anything, it's leftover from copy/paste of some ktapi code  
50 -  
51 -require_once(realpath(dirname(__FILE__) . '/../../../config/dmsDefaults.php'));  
52 -require_once(KT_DIR . '/ktapi/ktapi.inc.php');  
53 -  
54 -define ('CMIS_DIR', KT_LIB_DIR . '/api/ktcmis');  
55 -require_once(CMIS_DIR . '/exceptions/PermissionDeniedException.inc.php');  
56 -require_once(CMIS_DIR . '/services/CMISRepositoryService.inc.php');  
57 -require_once(CMIS_DIR . '/services/CMISNavigationService.inc.php');  
58 -require_once(CMIS_DIR . '/services/CMISObjectService.inc.php');  
59 -require_once(CMIS_DIR . '/services/CMISVersioningService.inc.php');  
60 -require_once(CMIS_DIR . '/util/CMISUtil.inc.php');  
61 -  
62 -/**  
63 - * Base class for all KT CMIS classes  
64 - * Handles authentication  
65 - */  
66 -class KTCMISBase {  
67 -  
68 - // we want all child classes to share the ktapi and session instances, no matter where they are set from,  
69 - // so we declare them as static  
70 - static protected $ktapi;  
71 - static protected $session;  
72 -  
73 - public function __construct(&$ktapi = null, $username = null, $password = null)  
74 - {  
75 - // TODO confirm KTAPI instance active??? shouldn't really be responsibility of this code  
76 - if (is_null($ktapi) && (!is_null($username) && !is_null($password))) {  
77 - $this->startSession($username, $password);  
78 - }  
79 - else {  
80 - self::$ktapi = $ktapi;  
81 - self::$session = self::$ktapi->get_session();  
82 - }  
83 - }  
84 -  
85 - // TODO this probably does not belong here??? probably should require all auth external, handled by transport protocol.  
86 - // perhaps simple refusal to execute without valid session?  
87 - // NOTE left in to allow transport protocol to delegate auth to this level, but not actually used in any code at present  
88 - public function startSession($username, $password)  
89 - {  
90 - // attempt to recover session if one exists  
91 - if (!is_null(self::$session) && !PEAR::isError(self::$session))  
92 - {  
93 - self::$session =& self::$ktapi->get_active_session(self::$session->get_sessionid());  
94 - }  
95 -  
96 - // start new session if no existing session or problem getting existing session (expired, etc...)  
97 - if (is_null(self::$session) || PEAR::isError(self::$session))  
98 - {  
99 - self::$ktapi = new KTAPI();  
100 - self::$session =& self::$ktapi->start_session($username, $password);  
101 - }  
102 -  
103 - // failed authentication?  
104 - if (PEAR::isError(self::$session))  
105 - {  
106 - throw new PermissionDeniedException('You must be authenticated to perform this action');  
107 - }  
108 -  
109 - return self::$session;  
110 - }  
111 -  
112 - public function setInterface(&$ktapi = null)  
113 - {  
114 - if (!is_null($ktapi)) {  
115 - self::$ktapi = $ktapi;  
116 - }  
117 - }  
118 -  
119 - public function getInterface()  
120 - {  
121 - return self::$ktapi;  
122 - }  
123 -  
124 - public function getSession()  
125 - {  
126 - return self::$session;  
127 - }  
128 -  
129 - // TODO what about destroying sessions? only on logout (which is not offered by the CMIS clients tested so far)  
130 -}  
131 -  
132 -/**  
133 - * Handles low level repository information queries  
134 - */  
135 -class KTRepositoryService extends KTCMISBase {  
136 -  
137 - protected $RepositoryService;  
138 -  
139 - public function __construct()  
140 - {  
141 - // instantiate underlying CMIS service  
142 - $this->RepositoryService = new CMISRepositoryService();  
143 - }  
144 -  
145 - /**  
146 - * Fetch a list of all available repositories  
147 - *  
148 - * NOTE Since we only have one repository at the moment, this is expected to only return one result  
149 - *  
150 - * @return repositoryList[]  
151 - */  
152 - public function getRepositories()  
153 - {  
154 - $repositories = $this->RepositoryService->getRepositories();  
155 - if (PEAR::isError($repositories))  
156 - {  
157 - return array(  
158 - "status_code" => 1,  
159 - "message" => "Failed getting repositories"  
160 - );  
161 - }  
162 -  
163 - // extract the required info fields into array format for easy encoding;  
164 - $count = 0;  
165 - $repositoryList = array();  
166 - foreach ($repositories as $repository)  
167 - {  
168 - $repositoryList[$count]['repositoryId'] = $repository->getRepositoryId();  
169 - $repositoryList[$count]['repositoryName'] = $repository->getRepositoryName();  
170 - $repositoryList[$count]['repositoryURI'] = $repository->getRepositoryURI();  
171 - ++$count;  
172 - }  
173 -  
174 - return array(  
175 - "status_code" => 0,  
176 - "results" => $repositoryList  
177 - );  
178 - }  
179 -  
180 - /**  
181 - * Fetches information about the selected repository  
182 - *  
183 - * @param string $repositoryId  
184 - */  
185 - public function getRepositoryInfo($repositoryId)  
186 - {  
187 - $repositoryInfo = $this->RepositoryService->getRepositoryInfo($repositoryId);  
188 - if (PEAR::isError($repositoryInfo))  
189 - {  
190 - return array(  
191 - "status_code" => 1,  
192 - "message" => "Failed getting repository information"  
193 - );  
194 - }  
195 -  
196 - // TODO output this manually, the function works but only for some objects so rather avoid it completely?  
197 - // NOTE the problems appear to be due to recursive objects  
198 - return array (  
199 - "status_code" => 0,  
200 - "results" => CMISUtil::objectToArray($repositoryInfo)  
201 - );  
202 - }  
203 -  
204 - /**  
205 - * Fetch the list of supported object types for the selected repository  
206 - *  
207 - * @param string $repositoryId  
208 - */  
209 - public function getTypes($repositoryId, $typeId = '', $returnPropertyDefinitions = false,  
210 - $maxItems = 0, $skipCount = 0, &$hasMoreItems = false)  
211 - {  
212 - try {  
213 - $repositoryObjectTypeResult = $this->RepositoryService->getTypes($repositoryId, $typeId, $returnPropertyDefinitions,  
214 - $maxItems, $skipCount, $hasMoreItems);  
215 - }  
216 - catch (Exception $e)  
217 - {  
218 - return array(  
219 - "status_code" => 1,  
220 - "message" => $e->getMessage()  
221 - );  
222 - }  
223 -  
224 - // format as array style output  
225 - // NOTE only concerned with attributes at this time  
226 - // TODO add support for properties  
227 - foreach($repositoryObjectTypeResult as $key => $objectType)  
228 - {  
229 - $repositoryObjectTypes[$key] = $objectType['attributes'];  
230 - // TODO properties  
231 - // $repositoryObjectTypes[$key]['properties'] = $objectType['properties'];  
232 - }  
233 -  
234 - return array (  
235 - "status_code" => 0,  
236 - "results" => $repositoryObjectTypes  
237 - );  
238 - }  
239 -  
240 - /**  
241 - * Fetch the object type definition for the requested type  
242 - *  
243 - * @param string $repositoryId  
244 - * @param string $typeId  
245 - */  
246 - public function getTypeDefinition($repositoryId, $typeId)  
247 - {  
248 - try {  
249 - $typeDefinitionResult = $this->RepositoryService->getTypeDefinition($repositoryId, $typeId);  
250 - }  
251 - catch (Exception $e)  
252 - {  
253 - return array(  
254 - "status_code" => 1,  
255 - "message" => $e->getMessage()  
256 - );  
257 - }  
258 -  
259 - // format as array style output  
260 - // NOTE only concerned with attributes at this time  
261 - // TODO add support for properties  
262 - $typeDefinition = $typeDefinitionResult['attributes'];  
263 -  
264 - return array (  
265 - "status_code" => 0,  
266 - "results" => $typeDefinition  
267 - );  
268 - }  
269 -  
270 -}  
271 -  
272 -/*  
273 - * Handles repository navigation  
274 - */  
275 -class KTNavigationService extends KTCMISBase {  
276 -  
277 - protected $NavigationService;  
278 -  
279 - public function __construct(&$ktapi = null, $username = null, $password = null)  
280 - {  
281 - parent::__construct($ktapi, $username, $password);  
282 - // instantiate underlying CMIS service  
283 - $this->NavigationService = new CMISNavigationService();  
284 - $this->setInterface();  
285 - }  
286 -  
287 - public function startSession($username, $password)  
288 - {  
289 - parent::startSession($username, $password);  
290 - $this->setInterface();  
291 - return self::$session;  
292 - }  
293 -  
294 - public function setInterface(&$ktapi = null)  
295 - {  
296 - parent::setInterface($ktapi);  
297 - $this->NavigationService->setInterface(self::$ktapi);  
298 - }  
299 -  
300 - /**  
301 - * Get descendents of the specified folder, up to the depth indicated  
302 - *  
303 - * @param string $repositoryId  
304 - * @param string $folderId  
305 - * @param boolean $includeAllowableActions  
306 - * @param boolean $includeRelationships  
307 - * @param string $typeID  
308 - * @param int $depth  
309 - * @param string $filter  
310 - * @return array $descendants  
311 - */  
312 - public function getDescendants($repositoryId, $folderId, $includeAllowableActions, $includeRelationships,  
313 - $depth = 1, $typeID = 'Any', $filter = '')  
314 - {  
315 - // TODO optional parameters  
316 - $descendantsResult = $this->NavigationService->getDescendants($repositoryId, $folderId, $includeAllowableActions,  
317 - $includeRelationships, $depth);  
318 -  
319 - if (PEAR::isError($descendantsResult))  
320 - {  
321 - return array(  
322 - "status_code" => 1,  
323 - "message" => "Failed getting descendants for folder"  
324 - );  
325 - }  
326 -  
327 - // format for webservices consumption  
328 - // NOTE this will almost definitely be changing in the future, this is just to get something working  
329 - $descendants = CMISUtil::decodeObjectHierarchy($descendantsResult, 'child');  
330 -  
331 - return array (  
332 - "status_code" => 0,  
333 - "results" => $descendants  
334 - );  
335 - }  
336 -  
337 - /**  
338 - * Get direct children of the specified folder  
339 - *  
340 - * @param string $repositoryId  
341 - * @param string $folderId  
342 - * @param boolean $includeAllowableActions  
343 - * @param boolean $includeRelationships  
344 - * @param string $typeID  
345 - * @param string $filter  
346 - * @param int $maxItems  
347 - * @param int $skipCount  
348 - * @return array $descendants  
349 - */  
350 - public function getChildren($repositoryId, $folderId, $includeAllowableActions, $includeRelationships,  
351 - $typeID = 'Any', $filter = '', $maxItems = 0, $skipCount = 0)  
352 - {  
353 - // TODO paging  
354 - // TODO optional parameters  
355 - $childrenResult = $this->NavigationService->getChildren($repositoryId, $folderId, $includeAllowableActions, $includeRelationships);  
356 -  
357 - if (PEAR::isError($childrenResult))  
358 - {  
359 - return array(  
360 - "status_code" => 1,  
361 - "message" => "Failed getting descendants for folder"  
362 - );  
363 - }  
364 -  
365 - $children = CMISUtil::decodeObjectHierarchy($childrenResult, 'child');  
366 -  
367 - return array(  
368 - "status_code" => 0,  
369 - "results" => $children  
370 - );  
371 - }  
372 -  
373 - /**  
374 - * Gets the parent of the selected folder  
375 - *  
376 - * @param string $repositoryId  
377 - * @param string $folderId  
378 - * @param boolean $includeAllowableActions  
379 - * @param boolean $includeRelationships  
380 - * @param boolean $returnToRoot  
381 - * @param string $filter  
382 - * @return ancestry[]  
383 - */  
384 - public function getFolderParent($repositoryId, $folderId, $includeAllowableActions, $includeRelationships, $returnToRoot, $filter = '')  
385 - {  
386 - $ancestryResult = $this->NavigationService->getFolderParent($repositoryId, $folderId, $includeAllowableActions,  
387 - $includeRelationships, $returnToRoot);  
388 -  
389 - if (PEAR::isError($ancestryResult))  
390 - {  
391 - return array(  
392 - "status_code" => 1,  
393 - "message" => "Failed getting ancestry for folder"  
394 - );  
395 - }  
396 -  
397 - $ancestry = CMISUtil::decodeObjectHierarchy($ancestryResult, 'child');  
398 -  
399 - return array(  
400 - "status_code" => 0,  
401 - "results" => $ancestry  
402 - );  
403 - }  
404 -  
405 - /**  
406 - * Gets the parents for the selected object  
407 - *  
408 - * @param string $repositoryId  
409 - * @param string $folderId  
410 - * @param boolean $includeAllowableActions  
411 - * @param boolean $includeRelationships  
412 - * @param string $filter  
413 - * @return ancestry[]  
414 - */  
415 - function getObjectParents($repositoryId, $objectId, $includeAllowableActions, $includeRelationships, $filter = '')  
416 - {  
417 - $ancestryResult = $this->NavigationService->getObjectParents($repositoryId, $objectId, $includeAllowableActions,  
418 - $includeRelationships);  
419 -  
420 - if (PEAR::isError($ancestryResult))  
421 - {  
422 - return array(  
423 - "status_code" => 1,  
424 - "message" => "Failed getting ancestry for object"  
425 - );  
426 - }  
427 -  
428 - $ancestry = CMISUtil::decodeObjectHierarchy($ancestryResult, 'child');  
429 -  
430 - return array(  
431 - "status_code" => 0,  
432 - "results" => $ancestry  
433 - );  
434 - }  
435 -  
436 - /**  
437 - * Returns a list of checked out documents from the selected repository  
438 - *  
439 - * @param string $repositoryId  
440 - * @param string $folderId The folder for which checked out docs are requested  
441 - * @param string $filter  
442 - * @param boolean $includeAllowableActions  
443 - * @param boolean $includeRelationships  
444 - * @param int $maxItems  
445 - * @param int $skipCount  
446 - * @return array $checkedout The collection of checked out documents  
447 - */  
448 - function getCheckedOutDocs($repositoryId, $includeAllowableActions, $includeRelationships, $folderId = null, $filter = '',  
449 - $maxItems = 0, $skipCount = 0)  
450 - {  
451 - $checkedout = $this->NavigationService->getCheckedOutDocs($repositoryId, $includeAllowableActions, $includeRelationships,  
452 - $folderId, $filter, $maxItems, $skipCount);  
453 -  
454 - if (PEAR::isError($checkedout))  
455 - {  
456 - return array(  
457 - "status_code" => 1,  
458 - "message" => "Failed getting list of checked out documents"  
459 - );  
460 - }  
461 -  
462 - // convert to array format for external code  
463 - $co = array();  
464 - foreach ($checkedout as $documentProperties)  
465 - {  
466 - $co[] = CMISUtil::createObjectPropertiesEntry($documentProperties);;  
467 - }  
468 -  
469 - return array(  
470 - "status_code" => 0,  
471 - "results" => $co  
472 - );  
473 - }  
474 -  
475 -}  
476 -  
477 -/**  
478 - * Handles requests for and actions on Folders and Documents  
479 - */  
480 -class KTObjectService extends KTCMISBase {  
481 -  
482 - protected $ObjectService;  
483 -  
484 - public function __construct(&$ktapi = null, $username = null, $password = null)  
485 - {  
486 - parent::__construct($ktapi, $username, $password);  
487 - // instantiate underlying CMIS service  
488 - $this->ObjectService = new CMISObjectService();  
489 - $this->setInterface();  
490 - }  
491 -  
492 - public function startSession($username, $password)  
493 - {  
494 - parent::startSession($username, $password);  
495 - $this->setInterface();  
496 - return self::$session;  
497 - }  
498 -  
499 - public function setInterface(&$ktapi = null)  
500 - {  
501 - parent::setInterface($ktapi);  
502 - $this->ObjectService->setInterface(self::$ktapi);  
503 - }  
504 -  
505 - /**  
506 - * Gets the properties for the selected object  
507 - *  
508 - * @param string $repositoryId  
509 - * @param string $objectId  
510 - * @param boolean $includeAllowableActions  
511 - * @param boolean $includeRelationships  
512 - * @param string $returnVersion  
513 - * @param string $filter  
514 - * @return properties[]  
515 - */  
516 - public function getProperties($repositoryId, $objectId, $includeAllowableActions, $includeRelationships,  
517 - $returnVersion = false, $filter = '')  
518 - {  
519 - try {  
520 - $propertyCollection = $this->ObjectService->getProperties($repositoryId, $objectId, $includeAllowableActions,  
521 - $includeRelationships);  
522 - }  
523 - catch (Exception $e)  
524 - {  
525 - return array(  
526 - "status_code" => 1,  
527 - "message" => $e->getMessage()  
528 - );  
529 - }  
530 -  
531 - $properties = CMISUtil::createObjectPropertiesEntry($propertyCollection);  
532 -  
533 - return array(  
534 - "status_code" => 0,  
535 - "results" => $properties  
536 - );  
537 - }  
538 -  
539 - /**  
540 - * Creates a new document within the repository  
541 - *  
542 - * @param string $repositoryId The repository to which the document must be added  
543 - * @param string $typeId Object Type id for the document object being created  
544 - * @param array $properties Array of properties which must be applied to the created document object  
545 - * @param string $folderId The id of the folder which will be the parent of the created document object  
546 - * This parameter is optional IF unfilingCapability is supported  
547 - * @param contentStream $contentStream optional content stream data  
548 - * @param string $versioningState optional version state value: checkedout/major/minor  
549 - * @return string $objectId The id of the created folder object  
550 - */  
551 - public function createDocument($repositoryId, $typeId, $properties, $folderId = null,  
552 - $contentStream = null, $versioningState = null)  
553 - {  
554 - $objectId = null;  
555 -  
556 - try {  
557 - $objectId = $this->ObjectService->createDocument($repositoryId, $typeId, $properties, $folderId,  
558 - $contentStream, $versioningState);  
559 - }  
560 - catch (Exception $e)  
561 - {  
562 - return array(  
563 - "status_code" => 1,  
564 - "message" => $e->getMessage()  
565 - );  
566 - }  
567 -  
568 - return array(  
569 - 'status_code' => 0,  
570 - 'results' => $objectId  
571 - );  
572 - }  
573 -  
574 - /**  
575 - * Creates a new folder within the repository  
576 - *  
577 - * @param string $repositoryId The repository to which the folder must be added  
578 - * @param string $typeId Object Type id for the folder object being created  
579 - * @param array $properties Array of properties which must be applied to the created folder object  
580 - * @param string $folderId The id of the folder which will be the parent of the created folder object  
581 - * @return string $objectId The id of the created folder object  
582 - */  
583 - public function createFolder($repositoryId, $typeId, $properties, $folderId)  
584 - {  
585 - $objectId = null;  
586 -  
587 - try {  
588 - $objectId = $this->ObjectService->createFolder($repositoryId, $typeId, $properties, $folderId);  
589 - }  
590 - catch (Exception $e)  
591 - {  
592 - return array(  
593 - "status_code" => 1,  
594 - "message" => $e->getMessage()  
595 - );  
596 - }  
597 -  
598 - return array(  
599 - 'status_code' => 0,  
600 - 'results' => $objectId  
601 - );  
602 - }  
603 -  
604 - /**  
605 - * Fetches the content stream data for an object  
606 - *  
607 - * @param string $repositoryId  
608 - * @param string $objectId  
609 - * @return string $contentStream (binary or text data)  
610 - */  
611 - function getContentStream($repositoryId, $objectId)  
612 - {  
613 - try {  
614 - $contentStream = $this->ObjectService->getContentStream($repositoryId, $objectId);  
615 - }  
616 - catch (Exception $e)  
617 - {  
618 - return array(  
619 - "status_code" => 1,  
620 - "message" => $e->getMessage()  
621 - );  
622 - }  
623 -  
624 - return array(  
625 - 'status_code' => 0,  
626 - 'results' => $contentStream  
627 - );  
628 - }  
629 -  
630 - /**  
631 - * Moves a fileable object from one folder to another.  
632 - *  
633 - * @param object $repositoryId  
634 - * @param object $objectId  
635 - * @param object $changeToken [optional]  
636 - * @param object $targetFolderId  
637 - * @param object $sourceFolderId [optional]  
638 - */  
639 - public function moveObject($repositoryId, $objectId, $changeToken = '', $targetFolderId, $sourceFolderId = null)  
640 - {  
641 - try {  
642 - $this->ObjectService->moveObject($repositoryId, $objectId, $changeToken, $targetFolderId, $sourceFolderId);  
643 - }  
644 - catch (Exception $e)  
645 - {  
646 - return array(  
647 - "status_code" => 1,  
648 - "message" => $e->getMessage()  
649 - );  
650 - }  
651 -  
652 - return array(  
653 - 'status_code' => 0,  
654 - 'results' => $objectId  
655 - );  
656 - }  
657 -  
658 - /**  
659 - * Deletes an object from the repository  
660 - *  
661 - * @param string $repositoryId  
662 - * @param string $objectId  
663 - * @param string $changeToken [optional]  
664 - * @return array  
665 - */  
666 - // NOTE Invoking this service method on an object SHALL not delete the entire version series for a Document Object.  
667 - // To delete an entire version series, use the deleteAllVersions() service  
668 - public function deleteObject($repositoryId, $objectId, $changeToken = null)  
669 - {  
670 - try {  
671 - $this->ObjectService->deleteObject($repositoryId, $objectId, $changeToken);  
672 - }  
673 - catch (Exception $e)  
674 - {  
675 - return array(  
676 - "status_code" => 1,  
677 - "message" => $e->getMessage()  
678 - );  
679 - }  
680 -  
681 - return array(  
682 - 'status_code' => 0,  
683 - 'results' => $objectId  
684 - );  
685 - }  
686 -  
687 - public function deleteTree($repositoryId, $objectId, $changeToken = null, $unfileNonfolderObject = 'delete', $continueOnFailure = false)  
688 - {  
689 - try {  
690 - $result = $this->ObjectService->deleteTree($repositoryId, $objectId, $changeToken, $unfileNonfolderObject, $continueOnFailure);  
691 - }  
692 - catch (Exception $e)  
693 - {  
694 - return array(  
695 - "status_code" => 1,  
696 - "message" => $e->getMessage()  
697 - );  
698 - }  
699 -  
700 - // check whether there is a list of items which did not delete  
701 - if (count($result) > 0)  
702 - {  
703 - return array(  
704 - "status_code" => 1,  
705 - "message" => $result  
706 - );  
707 - }  
708 -  
709 - return array(  
710 - 'status_code' => 0,  
711 - 'results' => $objectId  
712 - );  
713 - }  
714 -  
715 - /**  
716 - * Sets the content stream data for an existing document  
717 - *  
718 - * if $overwriteFlag = TRUE, the new content stream is applied whether or not the document has an existing content stream  
719 - * if $overwriteFlag = FALSE, the new content stream is applied only if the document does not have an existing content stream  
720 - *  
721 - * NOTE A Repository MAY automatically create new Document versions as part of this service method.  
722 - * Therefore, the documentId output NEED NOT be identical to the documentId input.  
723 - *  
724 - * @param string $repositoryId  
725 - * @param string $documentId  
726 - * @param boolean $overwriteFlag  
727 - * @param string $contentStream  
728 - * @param string $changeToken  
729 - * @return string $documentId  
730 - */  
731 - function setContentStream($repositoryId, $documentId, $overwriteFlag, $contentStream, $changeToken = null)  
732 - {  
733 - try {  
734 - $documentId = $this->ObjectService->setContentStream($repositoryId, $documentId, $overwriteFlag, $contentStream, $changeToken);  
735 - }  
736 - catch (Exception $e)  
737 - {  
738 - return array(  
739 - "status_code" => 1,  
740 - "message" => $e->getMessage()  
741 - );  
742 - }  
743 -  
744 - return array(  
745 - 'status_code' => 0,  
746 - 'results' => $documentId  
747 - );  
748 - }  
749 -  
750 -}  
751 -  
752 -/**  
753 - * Handles requests for and actions on versionable objects  
754 - */  
755 -class KTVersioningService extends KTCMISBase {  
756 -  
757 - protected $VersioningService;  
758 -  
759 - public function __construct(&$ktapi = null, $username = null, $password = null)  
760 - {  
761 - parent::__construct($ktapi, $username, $password);  
762 - // instantiate underlying CMIS service  
763 - $this->VersioningService = new CMISVersioningService();  
764 - $this->setInterface();  
765 - }  
766 -  
767 - public function startSession($username, $password)  
768 - {  
769 - parent::startSession($username, $password);  
770 - $this->setInterface();  
771 - return self::$session;  
772 - }  
773 -  
774 - public function setInterface(&$ktapi = null)  
775 - {  
776 - parent::setInterface($ktapi);  
777 - $this->VersioningService->setInterface(self::$ktapi);  
778 - }  
779 -  
780 - /**  
781 - * Deletes all Document Objects in the specified Version Series, including the Private Working Copy  
782 - *  
783 - * @param string $repositoryId  
784 - * @param string $versionSeriesId  
785 - * @return boolean true if successful  
786 - */  
787 - public function deleteAllVersions($repositoryId, $versionSeriesId)  
788 - {  
789 - try {  
790 - $result = $this->VersioningService->deleteAllVersions($repositoryId, $versionSeriesId);  
791 - }  
792 - catch (Exception $e)  
793 - {  
794 - return array(  
795 - "status_code" => 1,  
796 - "message" => $e->getMessage()  
797 - );  
798 - }  
799 -  
800 - return array(  
801 - 'status_code' => 0,  
802 - 'results' => $result  
803 - );  
804 - }  
805 -  
806 - /**  
807 - * Checks out a document and creates the PWC (Private Working Copy) which will represent the checked out document  
808 - *  
809 - * @param string $repositoryId  
810 - * @param string $documentId  
811 - * @param string $changeToken [optional]  
812 - * @return array results  
813 - */  
814 - // TODO set up delivery of content stream? or is that up to the CMIS client?  
815 - public function checkOut($repositoryId, $documentId, $changeToken = '')  
816 - {  
817 - try {  
818 - $result = $this->VersioningService->checkOut($repositoryId, $documentId, $changeToken);  
819 - }  
820 - catch (Exception $e)  
821 - {  
822 - return array(  
823 - "status_code" => 1,  
824 - "message" => $e->getMessage()  
825 - );  
826 - }  
827 -  
828 - return array(  
829 - 'status_code' => 0,  
830 - 'results' => (!empty($result) ? $result : 'Document Checked Out')  
831 - );  
832 - }  
833 -  
834 - /**  
835 - * Reverses the effect of a checkout: I.E. deletes the PWC (Private Working Copy) and re-sets the status of the document to "not checked out"  
836 - *  
837 - * @param string $repositoryId  
838 - * @param string $documentId  
839 - * @param string $changeToken [optional]  
840 - */  
841 - // TODO exceptions:  
842 - // • ConstraintViolationException: The Repository SHALL throw this exception if ANY of the following conditions are met:  
843 - // o The Document’s Object-Type definition’s versionable attribute is FALSE.  
844 - // • updateConflictException  
845 - // • versioningException  
846 - public function cancelCheckOut($repositoryId, $documentId, $changeToken = '')  
847 - {  
848 - try {  
849 - $result = $this->VersioningService->cancelCheckOut($repositoryId, $documentId, $changeToken);  
850 - }  
851 - catch (Exception $e)  
852 - {  
853 - return array(  
854 - "status_code" => 1,  
855 - "message" => $e->getMessage()  
856 - );  
857 - }  
858 -  
859 - return array(  
860 - 'status_code' => 0,  
861 - 'results' => (!empty($result) ? $result : 'Document Checkout Cancelled')  
862 - );  
863 - }  
864 -  
865 - /**  
866 - * Checks in a checked out document  
867 - *  
868 - * @param string $repositoryId  
869 - * @param string $documentId  
870 - * @param boolean $major  
871 - * @param string $changeToken [optional]  
872 - * @param array $properties [optional]  
873 - * @param contentStream $contentStream [optional]  
874 - * @param string $checkinComment [optional]  
875 - * @return string $documentId  
876 - */  
877 - public function checkIn($repositoryId, $documentId, $major, $changeToken = '', $properties = array(), $contentStream = null, $checkinComment = '')  
878 - {  
879 - try {  
880 - $result = $this->VersioningService->checkIn($repositoryId, $documentId, $major, $changeToken, $properties, $contentStream, $checkinComment);  
881 - }  
882 - catch (Exception $e)  
883 - {  
884 - return array(  
885 - "status_code" => 1,  
886 - "message" => $e->getMessage()  
887 - );  
888 - }  
889 -  
890 - return array(  
891 - 'status_code' => 0,  
892 - 'results' => (!empty($result) ? $result : 'Document Checked In Successfully')  
893 - );  
894 - }  
895 -  
896 -}  
897 -  
898 -?>  
lib/api/ktcmis/services/CMISObjectService.inc.php
@@ -61,7 +61,7 @@ class CMISObjectService { @@ -61,7 +61,7 @@ class CMISObjectService {
61 // NOTE The latter method has been adopted for the moment 61 // NOTE The latter method has been adopted for the moment
62 catch (Exception $e) 62 catch (Exception $e)
63 { 63 {
64 - throw new ConstraintViolationException('Object is not of base type document. ' . $e->getMessage()); 64 + throw new ConstraintViolationException('Object base type could not be determined. ' . $e->getMessage());
65 } 65 }
66 66
67 if ($typeDefinition['attributes']['baseType'] != 'document') 67 if ($typeDefinition['attributes']['baseType'] != 'document')
@@ -103,49 +103,41 @@ class CMISObjectService { @@ -103,49 +103,41 @@ class CMISObjectService {
103 } 103 }
104 } 104 }
105 105
106 - if (!$typeAllowed)  
107 - { 106 + if (!$typeAllowed) {
108 throw new ConstraintViolationException('Parent folder may not hold objects of this type (' . $typeId . ')'); 107 throw new ConstraintViolationException('Parent folder may not hold objects of this type (' . $typeId . ')');
109 } 108 }
110 109
111 // if content stream is required and no content stream is supplied, throw a ConstraintViolationException 110 // if content stream is required and no content stream is supplied, throw a ConstraintViolationException
112 - if (($typeDefinition['attributes']['contentStreamAllowed'] == 'required') && is_null($contentStream))  
113 - { 111 + if (($typeDefinition['attributes']['contentStreamAllowed'] == 'required') && is_null($contentStream)) {
114 throw new ConstraintViolationException('This repository requires a content stream for document creation. ' 112 throw new ConstraintViolationException('This repository requires a content stream for document creation. '
115 . 'Refusing to create an empty document'); 113 . 'Refusing to create an empty document');
116 } 114 }
117 - else if (($typeDefinition['attributes']['contentStreamAllowed'] == 'notAllowed') && !empty($contentStream))  
118 - { 115 + else if (($typeDefinition['attributes']['contentStreamAllowed'] == 'notAllowed') && !empty($contentStream)) {
119 throw new StreamNotSupportedException('Content Streams are not supported'); 116 throw new StreamNotSupportedException('Content Streams are not supported');
120 } 117 }
121 118
122 // if versionable attribute is set to false and versioningState is supplied, throw a ConstraintViolationException 119 // if versionable attribute is set to false and versioningState is supplied, throw a ConstraintViolationException
123 - if (!$typeDefinition['attributes']['versionable'] && !empty($versioningState))  
124 - { 120 + if (!$typeDefinition['attributes']['versionable'] && !empty($versioningState)) {
125 throw new ConstraintViolationException('This repository does not support versioning'); 121 throw new ConstraintViolationException('This repository does not support versioning');
126 } 122 }
127 123
128 // TODO deal with $versioningState when supplied 124 // TODO deal with $versioningState when supplied
129 125
130 // set title and name identical if only one submitted 126 // set title and name identical if only one submitted
131 - if ($properties['title'] == '')  
132 - { 127 + if ($properties['title'] == '') {
133 $properties['title'] = $properties['name']; 128 $properties['title'] = $properties['name'];
134 } 129 }
135 - else if ($properties['name'] == '')  
136 - { 130 + else if ($properties['name'] == '') {
137 $properties['name'] = $properties['title']; 131 $properties['name'] = $properties['title'];
138 } 132 }
139 133
140 // if name is blank throw exception (check type) - using invalidArgument Exception for now 134 // if name is blank throw exception (check type) - using invalidArgument Exception for now
141 - if (trim($properties['name']) == '')  
142 - { 135 + if (trim($properties['name']) == '') {
143 throw new InvalidArgumentException('Refusing to create an un-named document'); 136 throw new InvalidArgumentException('Refusing to create an un-named document');
144 } 137 }
145 138
146 // TODO also set to Default if a non-supported type is submitted 139 // TODO also set to Default if a non-supported type is submitted
147 - if ($properties['type'] == '')  
148 - { 140 + if ($properties['type'] == '') {
149 $properties['type'] = 'Default'; 141 $properties['type'] = 'Default';
150 } 142 }
151 143
@@ -154,17 +146,7 @@ class CMISObjectService { @@ -154,17 +146,7 @@ class CMISObjectService {
154 // this check isn't strictly necessary; however it is needed for a repository which does not support content streams 146 // this check isn't strictly necessary; however it is needed for a repository which does not support content streams
155 if (!is_null($contentStream)) 147 if (!is_null($contentStream))
156 { 148 {
157 - // TODO consider checking whether content is encoded (currently we expect encoded)  
158 - // TODO choose between this and the alternative decode function (see CMISUtil class)  
159 - // this will require some basic benchmarking  
160 - $contentStream = CMISUtil::decodeChunkedContentStream($contentStream);  
161 -  
162 - // NOTE There is a function in CMISUtil to do this, written for the unit tests but since KTUploadManager exists  
163 - // and has more functionality which could come in useful at some point I decided to go with that instead  
164 - // (did not know this existed when I wrote the CMISUtil function)  
165 - $uploadManager = new KTUploadManager();  
166 - // assumes already decoded from base64, should use store_base64_file if not  
167 - $tempfilename = $uploadManager->store_file($contentStream, 'cmis_'); 149 + $tempfilename = CMISUtil::createTemporaryFile($contentStream);
168 150
169 // metadata 151 // metadata
170 $metadata = array(); 152 $metadata = array();
@@ -192,12 +174,10 @@ class CMISObjectService { @@ -192,12 +174,10 @@ class CMISObjectService {
192 ); 174 );
193 } 175 }
194 176
195 - if (!empty($properties['category']))  
196 - { 177 + if (!empty($properties['category'])) {
197 $category = $properties['category']; 178 $category = $properties['category'];
198 } 179 }
199 - else  
200 - { 180 + else {
201 $category = 'Miscellaneous'; 181 $category = 'Miscellaneous';
202 } 182 }
203 183
@@ -231,12 +211,10 @@ class CMISObjectService { @@ -231,12 +211,10 @@ class CMISObjectService {
231 $KTMime = new KTMime(); 211 $KTMime = new KTMime();
232 $mimetype = $KTMime->getMimeTypeFromFile($tempfilename); 212 $mimetype = $KTMime->getMimeTypeFromFile($tempfilename);
233 preg_match('/^([^\/]*)\/([^\/]*)/', $mimetype, $matches); 213 preg_match('/^([^\/]*)\/([^\/]*)/', $mimetype, $matches);
234 - if (($matches[1] == 'text') || ($matches[1] == 'image') || ($matches[1] == 'audio'))  
235 - { 214 + if (($matches[1] == 'text') || ($matches[1] == 'image') || ($matches[1] == 'audio')) {
236 $mediatype = ucwords($matches[1]); 215 $mediatype = ucwords($matches[1]);
237 } 216 }
238 - else if (($matches[2] == 'pdf') || ($matches[2] == 'msword'))  
239 - { 217 + else if (($matches[2] == 'pdf') || ($matches[2] == 'msword')) {
240 $mediatype = 'Text'; 218 $mediatype = 'Text';
241 } 219 }
242 220
@@ -262,12 +240,10 @@ class CMISObjectService { @@ -262,12 +240,10 @@ class CMISObjectService {
262 $response = $this->ktapi->add_document_with_metadata((int)$folderId, $properties['title'], $properties['name'], 240 $response = $this->ktapi->add_document_with_metadata((int)$folderId, $properties['title'], $properties['name'],
263 $properties['type'], $tempfilename, $metadata, $sysdata); 241 $properties['type'], $tempfilename, $metadata, $sysdata);
264 242
265 - if ($response['status_code'] != 0)  
266 - { 243 + if ($response['status_code'] != 0) {
267 throw new StorageException('The repository was unable to create the document. ' . $response['message']); 244 throw new StorageException('The repository was unable to create the document. ' . $response['message']);
268 } 245 }
269 - else  
270 - { 246 + else {
271 $objectId = CMISUtil::encodeObjectId('Document', $response['results']['document_id']); 247 $objectId = CMISUtil::encodeObjectId('Document', $response['results']['document_id']);
272 } 248 }
273 249
@@ -314,13 +290,11 @@ class CMISObjectService { @@ -314,13 +290,11 @@ class CMISObjectService {
314 // exception propogate upward... 290 // exception propogate upward...
315 // Alternatively: throw new exception with original exception message appended 291 // Alternatively: throw new exception with original exception message appended
316 // NOTE The latter method has been adopted for the moment 292 // NOTE The latter method has been adopted for the moment
317 - catch (Exception $e)  
318 - { 293 + catch (Exception $e) {
319 throw new ConstraintViolationException('Object is not of base type folder. ' . $e->getMessage()); 294 throw new ConstraintViolationException('Object is not of base type folder. ' . $e->getMessage());
320 } 295 }
321 296
322 - if ($typeDefinition['attributes']['baseType'] != 'folder')  
323 - { 297 + if ($typeDefinition['attributes']['baseType'] != 'folder') {
324 throw new ConstraintViolationException('Object is not of base type folder'); 298 throw new ConstraintViolationException('Object is not of base type folder');
325 } 299 }
326 300
@@ -333,20 +307,17 @@ class CMISObjectService { @@ -333,20 +307,17 @@ class CMISObjectService {
333 // if parent folder is not allowed to hold this type, throw exception 307 // if parent folder is not allowed to hold this type, throw exception
334 $CMISFolder = new CMISFolderObject($folderId, $this->ktapi); 308 $CMISFolder = new CMISFolderObject($folderId, $this->ktapi);
335 $allowed = $CMISFolder->getProperty('AllowedChildObjectTypeIds'); 309 $allowed = $CMISFolder->getProperty('AllowedChildObjectTypeIds');
336 - if (!is_array($allowed) || !in_array($typeId, $allowed))  
337 - { 310 + if (!is_array($allowed) || !in_array($typeId, $allowed)) {
338 throw new ConstraintViolationException('Parent folder may not hold objects of this type (' . $typeId . ')'); 311 throw new ConstraintViolationException('Parent folder may not hold objects of this type (' . $typeId . ')');
339 } 312 }
340 313
341 // TODO if name is blank! throw another exception (check type) - using invalidArgument Exception for now 314 // TODO if name is blank! throw another exception (check type) - using invalidArgument Exception for now
342 - if (trim($properties['name']) == '')  
343 - { 315 + if (trim($properties['name']) == '') {
344 throw new InvalidArgumentException('Refusing to create an un-named folder'); 316 throw new InvalidArgumentException('Refusing to create an un-named folder');
345 } 317 }
346 318
347 $response = $this->ktapi->create_folder((int)$folderId, $properties['name'], $sig_username = '', $sig_password = '', $reason = ''); 319 $response = $this->ktapi->create_folder((int)$folderId, $properties['name'], $sig_username = '', $sig_password = '', $reason = '');
348 - if ($response['status_code'] != 0)  
349 - { 320 + if ($response['status_code'] != 0) {
350 throw new StorageException('The repository was unable to create the folder: ' . $response['message']); 321 throw new StorageException('The repository was unable to create the folder: ' . $response['message']);
351 } 322 }
352 else 323 else
@@ -380,8 +351,7 @@ class CMISObjectService { @@ -380,8 +351,7 @@ class CMISObjectService {
380 351
381 $objectId = CMISUtil::decodeObjectId($objectId, $typeId); 352 $objectId = CMISUtil::decodeObjectId($objectId, $typeId);
382 353
383 - if ($typeId == 'Unknown')  
384 - { 354 + if ($typeId == 'Unknown') {
385 throw new ObjectNotFoundException('The type of the requested object could not be determined'); 355 throw new ObjectNotFoundException('The type of the requested object could not be determined');
386 } 356 }
387 357
@@ -492,8 +462,7 @@ class CMISObjectService { @@ -492,8 +462,7 @@ class CMISObjectService {
492 // check type id of object against allowed child types for destination folder 462 // check type id of object against allowed child types for destination folder
493 $CMISFolder = new CMISFolderObject($targetFolderId, $this->ktapi); 463 $CMISFolder = new CMISFolderObject($targetFolderId, $this->ktapi);
494 $allowed = $CMISFolder->getProperty('AllowedChildObjectTypeIds'); 464 $allowed = $CMISFolder->getProperty('AllowedChildObjectTypeIds');
495 - if (!is_array($allowed) || !in_array($typeId, $allowed))  
496 - { 465 + if (!is_array($allowed) || !in_array($typeId, $allowed)) {
497 throw new ConstraintViolationException('Parent folder may not hold objects of this type (' . $typeId . ')'); 466 throw new ConstraintViolationException('Parent folder may not hold objects of this type (' . $typeId . ')');
498 } 467 }
499 468
@@ -517,8 +486,7 @@ class CMISObjectService { @@ -517,8 +486,7 @@ class CMISObjectService {
517 } 486 }
518 487
519 // if failed, throw StorageException 488 // if failed, throw StorageException
520 - if ($response['status_code'] != 0)  
521 - { 489 + if ($response['status_code'] != 0) {
522 throw new StorageException('The repository was unable to move the object: ' . $response['message']); 490 throw new StorageException('The repository was unable to move the object: ' . $response['message']);
523 } 491 }
524 } 492 }
@@ -541,13 +509,15 @@ class CMISObjectService { @@ -541,13 +509,15 @@ class CMISObjectService {
541 // TODO this should probably be a function, it is now used in two places... 509 // TODO this should probably be a function, it is now used in two places...
542 // throw updateConflictException if the operation is attempting to update an object that is no longer current (as determined by the repository). 510 // throw updateConflictException if the operation is attempting to update an object that is no longer current (as determined by the repository).
543 $exists = true; 511 $exists = true;
544 - if ($typeId == 'Folder') { 512 + if ($typeId == 'Folder')
  513 + {
545 $object = $this->ktapi->get_folder_by_id($objectId); 514 $object = $this->ktapi->get_folder_by_id($objectId);
546 if (PEAR::isError($object)) { 515 if (PEAR::isError($object)) {
547 $exists = false; 516 $exists = false;
548 } 517 }
549 } 518 }
550 - else if ($typeId == 'Document') { 519 + else if ($typeId == 'Document')
  520 + {
551 $object = $this->ktapi->get_document_by_id($objectId); 521 $object = $this->ktapi->get_document_by_id($objectId);
552 if (PEAR::isError($object)) { 522 if (PEAR::isError($object)) {
553 $exists = false; 523 $exists = false;
@@ -743,11 +713,7 @@ class CMISObjectService { @@ -743,11 +713,7 @@ class CMISObjectService {
743 throw new ContentAlreadyExistsException('Unable to overwrite existing content stream'); 713 throw new ContentAlreadyExistsException('Unable to overwrite existing content stream');
744 } 714 }
745 715
746 - // NOTE There is a function in CMISUtil to do this but since KTUploadManager exists and has more functionality  
747 - // which could come in useful at some point I decided to go with that instead (did not know it existed when  
748 - // I wrote the CMISUtil function)  
749 - $uploadManager = new KTUploadManager();  
750 - $tempfilename = $uploadManager->store_base64_file($contentStream, 'cmis_'); 716 + $tempfilename = CMISUtil::createTemporaryFile($contentStream);
751 // update the document content from this temporary file as per usual 717 // update the document content from this temporary file as per usual
752 // TODO Use checkin_document_with_metadata instead if metadata content submitted || update metadata separately? 718 // TODO Use checkin_document_with_metadata instead if metadata content submitted || update metadata separately?
753 $response = $this->ktapi->checkin_document($documentId, $csFileName, 'CMIS setContentStream action', $tempfilename, false); 719 $response = $this->ktapi->checkin_document($documentId, $csFileName, 'CMIS setContentStream action', $tempfilename, false);
lib/api/ktcmis/services/CMISVersioningService.inc.php
@@ -3,11 +3,12 @@ @@ -3,11 +3,12 @@
3 require_once(KT_DIR . '/ktapi/ktapi.inc.php'); 3 require_once(KT_DIR . '/ktapi/ktapi.inc.php');
4 require_once(CMIS_DIR . '/exceptions/ConstraintViolationException.inc.php'); 4 require_once(CMIS_DIR . '/exceptions/ConstraintViolationException.inc.php');
5 require_once(CMIS_DIR . '/exceptions/StorageException.inc.php'); 5 require_once(CMIS_DIR . '/exceptions/StorageException.inc.php');
  6 +require_once(CMIS_DIR . '/exceptions/StreamNotSupportedException.inc.php');
6 require_once(CMIS_DIR . '/exceptions/UpdateConflictException.inc.php'); 7 require_once(CMIS_DIR . '/exceptions/UpdateConflictException.inc.php');
7 require_once(CMIS_DIR . '/exceptions/VersioningException.inc.php'); 8 require_once(CMIS_DIR . '/exceptions/VersioningException.inc.php');
8 require_once(CMIS_DIR . '/services/CMISObjectService.inc.php'); 9 require_once(CMIS_DIR . '/services/CMISObjectService.inc.php');
9 require_once(CMIS_DIR . '/objecttypes/CMISDocumentObject.inc.php'); 10 require_once(CMIS_DIR . '/objecttypes/CMISDocumentObject.inc.php');
10 -//require_once(CMIS_DIR . '/util/CMISUtil.inc.php'); 11 +require_once(CMIS_DIR . '/util/CMISUtil.inc.php');
11 12
12 class CMISVersioningService { 13 class CMISVersioningService {
13 14
@@ -182,14 +183,8 @@ class CMISVersioningService { @@ -182,14 +183,8 @@ class CMISVersioningService {
182 * @return string $documentId 183 * @return string $documentId
183 */ 184 */
184 // TODO Exceptions: 185 // TODO Exceptions:
185 - // • ConstraintViolationException - SHALL throw if o The Document’s Object-Type definition’s versionable attribute is FALSE.  
186 - // • storageException - MAY throw  
187 - // • streamNotSupportedException - The Repository SHALL throw this exception if the Object-Type definition specified by the typeId  
188 - // parameter’s “contentStreamAllowed” attribute is set to “not allowed” and a contentStream input  
189 - // parameter is provided.  
190 - // • updateConflictException - MAY throw  
191 // • versioningException - The repository MAY throw this exception if the object is a non-current Document Version 186 // • versioningException - The repository MAY throw this exception if the object is a non-current Document Version
192 - public function checkIn($repositoryId, $documentId, $major, $changeToken = '', $properties = array(), $contentStream = null, $checkinComment = '') 187 + public function checkIn($repositoryId, $documentId, $major, $contentStream = null, $changeToken = '', $properties = array(), $checkinComment = '')
193 { 188 {
194 $documentId = CMISUtil::decodeObjectId($documentId, $typeId); 189 $documentId = CMISUtil::decodeObjectId($documentId, $typeId);
195 190
@@ -206,7 +201,35 @@ class CMISVersioningService { @@ -206,7 +201,35 @@ class CMISVersioningService {
206 throw new ConstraintViolationException('This document is not versionable and may not be checked in'); 201 throw new ConstraintViolationException('This document is not versionable and may not be checked in');
207 } 202 }
208 203
209 - return $documentId; 204 + $RepositoryService = new CMISRepositoryService();
  205 + try {
  206 + $typeDefinition = $RepositoryService->getTypeDefinition($repositoryId, $typeId);
  207 + }
  208 + catch (exception $e) {
  209 + // if we can't get the type definition, then we can't store the content
  210 + throw new StorageException($e->getMessage());
  211 + }
  212 +
  213 + if (($typeDefinition['attributes']['contentStreamAllowed'] == 'notAllowed') && !empty($contentStream)) {
  214 + throw new StreamNotSupportedException('Content Streams are not supported');
  215 + }
  216 +
  217 + // check that this is the latest version
  218 + if ($pwc->getProperty('IsLatestVersion') != true) {
  219 + throw new VersioningException('The document is not the latest version and cannot be checked in');
  220 + }
  221 +
  222 + // now do the checkin
  223 + $tempfilename = CMISUtil::createTemporaryFile($contentStream);
  224 + $response = $this->ktapi->checkin_document($documentId, $pwc->getProperty('ContentStreamFilename'), $reason, $tempfilename, $major,
  225 + $sig_username, $sig_password);
  226 +
  227 + // if there was any error in cancelling the checkout
  228 + if ($response['status_code'] == 1) {
  229 + throw new RuntimeException('There was an error checking in the document: ' . $response['message']);
  230 + }
  231 +
  232 + return CMISUtil::encodeObjectId(DOCUMENT, $documentId);
210 } 233 }
211 234
212 } 235 }
lib/api/ktcmis/util/CMISUtil.inc.php
@@ -406,30 +406,6 @@ class CMISUtil { @@ -406,30 +406,6 @@ class CMISUtil {
406 return (($input === true) ? 'true' : (($input === false) ? 'false' : $input)); 406 return (($input === true) ? 'true' : (($input === false) ? 'false' : $input));
407 } 407 }
408 408
409 - /**  
410 - * Creates a temporary file  
411 - * Cleanup is the responsibility of the calling code  
412 - *  
413 - * @param string|binary $content The content to be written to the file.  
414 - * @param string $uploadDir Optional upload directory. Will use the KnowledgeTree system tmp directory if not supplied.  
415 - * @return string The path to the created file (for reference and cleanup.)  
416 - */  
417 - static public function createTemporaryFile($content, $encoding = null, $uploadDir = null)  
418 - {  
419 - if(is_null($uploadDir))  
420 - {  
421 - $oKTConfig =& KTConfig::getSingleton();  
422 - $uploadDir = $oKTConfig->get('webservice/uploadDirectory');  
423 - }  
424 -  
425 - $temp = tempnam($uploadDir, 'myfile');  
426 - $fp = fopen($temp, 'wb');  
427 - fwrite($fp, ($encoding == 'base64' ? base64_decode($content) : $content));  
428 - fclose($fp);  
429 -  
430 - return $temp;  
431 - }  
432 -  
433 // TODO more robust base64 encoding detection, if possible 409 // TODO more robust base64 encoding detection, if possible
434 410
435 /** 411 /**
@@ -610,6 +586,33 @@ class CMISUtil { @@ -610,6 +586,33 @@ class CMISUtil {
610 586
611 return $exists; 587 return $exists;
612 } 588 }
  589 +
  590 + /**
  591 + * Creates a temporary file
  592 + * Cleanup is the responsibility of the calling code
  593 + *
  594 + * @param string $contentStream The content to be stored (assumed to be base64)
  595 + * @return string The path to the created file (for reference and cleanup.)
  596 + */
  597 + static public function createTemporaryFile($contentStream)
  598 + {
  599 + // if contentStream is empty, cannot create file
  600 + if (empty($contentStream)) return null;
  601 +
  602 + // TODO consider checking whether content is encoded (currently we expect encoded)
  603 + // TODO choose between this and the alternative decode function (see CMISUtil class)
  604 + // this will require some basic benchmarking
  605 + $contentStream = CMISUtil::decodeChunkedContentStream($contentStream);
  606 +
  607 + // NOTE There is a function in CMISUtil to do this, written for the unit tests but since KTUploadManager exists
  608 + // and has more functionality which could come in useful at some point I decided to go with that instead
  609 + // (did not know this existed when I wrote the CMISUtil function)
  610 + $uploadManager = new KTUploadManager();
  611 + // assumes already decoded from base64, should use store_base64_file if not
  612 + $tempfilename = $uploadManager->store_file($contentStream, 'cmis_');
  613 +
  614 + return $tempfilename;
  615 + }
613 616
614 } 617 }
615 618
plugins/thumbnails/templates/thumbnail_viewlet.smarty 0 → 100644
plugins/thumbnails/thumbnails.php 0 → 100644
  1 +<?php
  2 +/*
  3 + * $Id: $
  4 + *
  5 + * The contents of this file are subject to the KnowledgeTree
  6 + * Commercial Editions On-Premise License ("License");
  7 + * You may not use this file except in compliance with the License.
  8 + * You may obtain a copy of the License at
  9 + * http://www.knowledgetree.com/about/legal/
  10 + * The terms of this license may change from time to time and the latest
  11 + * license will be published from time to time at the above Internet address.
  12 + *
  13 + * This edition of the KnowledgeTree software
  14 + * is NOT licensed to you under Open Source terms.
  15 + * You may not redistribute this source code.
  16 + * For more information please see the License above.
  17 + *
  18 + * (c) 2008 KnowledgeTree Inc.
  19 + * Portions copyright The Jam Warehouse Software (Pty) Ltd;
  20 + * All Rights Reserved.
  21 + *
  22 + */
  23 +
  24 +require_once(KT_LIB_DIR . "/actions/documentviewlet.inc.php");
  25 +require_once(KT_DIR . '/search2/documentProcessor/documentProcessor.inc.php');
  26 +
  27 +/**
  28 + * Generates thumbnails of documents using the pdf converter output
  29 + * Dependent on the pdfConverter
  30 + */
  31 +class thumbnailGenerator extends BaseProcessor
  32 +{
  33 + public $order = 3;
  34 + protected $namespace = 'thumbnails.generator.processor';
  35 +
  36 + /**
  37 + * Constructor
  38 + *
  39 + * @return thumbnailGenerator
  40 + */
  41 + public function thumbnailGenerator()
  42 + {
  43 + }
  44 +
  45 + /**
  46 + * Gets the document path and calls the generator function
  47 + *
  48 + * @return boolean
  49 + */
  50 + public function processDocument()
  51 + {
  52 + // do the generation
  53 + $res = $this->generateThumbnail();
  54 + return $res;
  55 + }
  56 +
  57 + /**
  58 + * The supported mime types for the converter.
  59 + *
  60 + * @return array
  61 + */
  62 + public function getSupportedMimeTypes()
  63 + {
  64 +// $aAcceptedMimeTypes = array('doc', 'ods', 'odt', 'ott', 'txt', 'rtf', 'sxw', 'stw',
  65 +// // 'html', 'htm',
  66 +// 'xml' , 'pdb', 'psw', 'ods', 'ots', 'sxc',
  67 +// 'stc', 'dif', 'dbf', 'xls', 'xlt', 'slk', 'csv', 'pxl',
  68 +// 'odp', 'otp', 'sxi', 'sti', 'ppt', 'pot', 'sxd', 'odg',
  69 +// 'otg', 'std', 'asc');
  70 +
  71 + // taken from the original list of accepted types in the pdf generator action
  72 + $mime_types = array();
  73 + $mime_types[] = 'text/plain';
  74 + $mime_types[] = 'text/html';
  75 + $mime_types[] = 'text/csv';
  76 + $mime_types[] = 'text/rtf';
  77 +
  78 + // Office OLE2 - 2003, XP, etc
  79 + $mime_types[] = 'application/msword';
  80 + $mime_types[] = 'application/vnd.ms-powerpoint';
  81 + $mime_types[] = 'application/vnd.ms-excel';
  82 +
  83 + // Star Office
  84 + $mime_types[] = 'application/vnd.sun.xml.writer';
  85 + $mime_types[] = 'application/vnd.sun.xml.writer.template';
  86 + $mime_types[] = 'application/vnd.sun.xml.calc';
  87 + $mime_types[] = 'application/vnd.sun.xml.calc.template';
  88 + $mime_types[] = 'application/vnd.sun.xml.draw';
  89 + $mime_types[] = 'application/vnd.sun.xml.draw.template';
  90 + $mime_types[] = 'application/vnd.sun.xml.impress';
  91 + $mime_types[] = 'application/vnd.sun.xml.impress.template';
  92 +
  93 + // Open Office
  94 + $mime_types[] = 'application/vnd.oasis.opendocument.text';
  95 + $mime_types[] = 'application/vnd.oasis.opendocument.text-template';
  96 + $mime_types[] = 'application/vnd.oasis.opendocument.graphics';
  97 + $mime_types[] = 'application/vnd.oasis.opendocument.graphics-template';
  98 + $mime_types[] = 'application/vnd.oasis.opendocument.presentation';
  99 + $mime_types[] = 'application/vnd.oasis.opendocument.presentation-template';
  100 + $mime_types[] = 'application/vnd.oasis.opendocument.spreadsheet';
  101 + $mime_types[] = 'application/vnd.oasis.opendocument.spreadsheet-template';
  102 +
  103 + /* OO3
  104 + // Office 2007
  105 + $mime_types[] = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';
  106 + $mime_types[] = 'application/vnd.openxmlformats-officedocument.wordprocessingml.template';
  107 + $mime_types[] = 'application/vnd.openxmlformats-officedocument.presentationml.template';
  108 + $mime_types[] = 'application/vnd.openxmlformats-officedocument.presentationml.slideshow';
  109 + $mime_types[] = 'application/vnd.openxmlformats-officedocument.presentationml.presentation';
  110 + $mime_types[] = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
  111 + $mime_types[] = 'application/vnd.openxmlformats-officedocument.spreadsheetml.template';
  112 + */
  113 +
  114 + return $mime_types;
  115 + }
  116 +
  117 + /**
  118 + * Generates the thumbnail from the pdf
  119 + *
  120 + * @return boolean
  121 + */
  122 + private function generateThumbnail()
  123 + {
  124 + /*
  125 + The thumbnail is displayed in the info panel and the document view
  126 + The info panel is in the plugin ktcore/documentpreview/
  127 + - add a hook in there but build the functionality in this plugin ie keep the plugins separate and don't create dependencies
  128 + - if the thumbnail plugin is disabled then maybe display a normal sized info panel
  129 +
  130 + The document view will display the thumbnail on the right in a document viewlet similar to the workflow viewlet
  131 + - check out ktcore/KTDocumentViewlets.php
  132 + - viewlet class is below
  133 + */
  134 +
  135 + $pdfDir = $default->pdfDirectory;
  136 + $pdfFile = $pdfDir .'/'. $this->document->iId.'.pdf';
  137 +
  138 + // if a previous version of the pdf exists - delete it
  139 + if(!file_exists($pdfFile)){
  140 + global $default;
  141 + $default->log->debug('Thumbnail Generator Plugin: PDF file does not exist, cannot generate a thumbnail');
  142 + return false;
  143 + }
  144 +
  145 + // do generation
  146 + return true;
  147 + }
  148 +}
  149 +
  150 +
  151 +class ThumbnailViewlet extends KTDocumentViewlet {
  152 + var $sName = 'thumbnail.viewlets';
  153 +
  154 + function display_viewlet() {
  155 + $oKTTemplating =& KTTemplating::getSingleton();
  156 + $oTemplate =& $oKTTemplating->loadTemplate('thumbnail_viewlet');
  157 + if (is_null($oTemplate)) return '';
  158 +
  159 + $oTemplate->setData(array());
  160 + return $oTemplate->render();
  161 + }
  162 +}
  163 +
  164 +?>
0 \ No newline at end of file 165 \ No newline at end of file
plugins/thumbnails/thumbnailsPlugin.php 0 → 100644
  1 +<?php
  2 +/**
  3 + * $Id: $
  4 + *
  5 + * The contents of this file are subject to the KnowledgeTree
  6 + * Commercial Editions On-Premise License ("License");
  7 + * You may not use this file except in compliance with the License.
  8 + * You may obtain a copy of the License at
  9 + * http://www.knowledgetree.com/about/legal/
  10 + * The terms of this license may change from time to time and the latest
  11 + * license will be published from time to time at the above Internet address.
  12 + *
  13 + * This edition of the KnowledgeTree software
  14 + * is NOT licensed to you under Open Source terms.
  15 + * You may not redistribute this source code.
  16 + * For more information please see the License above.
  17 + *
  18 + * (c) 2008 KnowledgeTree Inc.
  19 + * Portions copyright The Jam Warehouse Software (Pty) Ltd;
  20 + * All Rights Reserved.
  21 + *
  22 + */
  23 +
  24 +require_once(KT_LIB_DIR . '/plugins/plugin.inc.php');
  25 +require_once(KT_LIB_DIR . '/plugins/pluginregistry.inc.php');
  26 +
  27 +class thumbnailsPlugin extends KTPlugin {
  28 + var $sNamespace = 'thumbnails.generator.processor.plugin';
  29 + var $iVersion = 0;
  30 + var $autoRegister = true;
  31 +
  32 + function thumbnailsPlugin($sFilename = null) {
  33 + $res = parent::KTPlugin($sFilename);
  34 + $this->sFriendlyName = _kt('Thumbnail Generator');
  35 + return $res;
  36 + }
  37 +
  38 + /**
  39 + * Setup the plugin: add the processor, viewlet action and template location
  40 + *
  41 + */
  42 + function setup() {
  43 + $plugin_dir = dirname(__FILE__) . DIRECTORY_SEPARATOR;
  44 + $dir = $plugin_dir . 'thumbnails.php';
  45 + $this->registerProcessor('thumbnailGenerator', 'thumbnails.generator.processor', $dir);
  46 + $this->registerAction('documentviewlet', 'ThumbnailViewlet', 'thumbnail.viewlets', $dir);
  47 +
  48 + require_once(KT_LIB_DIR . '/templating/templating.inc.php');
  49 + $oTemplating =& KTTemplating::getSingleton();
  50 + $oTemplating->addLocation('thumbnails', $plugin_dir.'templates', 'thumbnails.generator.processor.plugin');
  51 + }
  52 +}
  53 +
  54 +$oPluginRegistry =& KTPluginRegistry::getSingleton();
  55 +$oPluginRegistry->registerPlugin('thumbnailsPlugin', 'thumbnails.generator.processor.plugin', __FILE__);
  56 +?>
0 \ No newline at end of file 57 \ No newline at end of file
setup/wizard/config/config.xml
@@ -7,7 +7,7 @@ @@ -7,7 +7,7 @@
7 Description: Installer steps 7 Description: Installer steps
8 --> 8 -->
9 9
10 -<install version="3.3"> 10 +<install version="3.7" type="Commercial Edition">
11 <steps> 11 <steps>
12 <step name="Welcome">welcome</step> 12 <step name="Welcome">welcome</step>
13 <step name="License Agreement">license</step> 13 <step name="License Agreement">license</step>
setup/wizard/installUtil.php
@@ -254,8 +254,8 @@ class InstallUtil { @@ -254,8 +254,8 @@ class InstallUtil {
254 */ 254 */
255 public function checkPermission($dir, $create=false) 255 public function checkPermission($dir, $create=false)
256 { 256 {
257 - $exist = 'Directory does not exist';  
258 - $write = 'Directory is not writable'; 257 + $exist = 'Directory doesn\'t exist';
  258 + $write = 'Directory not writable';
259 $ret = array('class' => 'cross'); 259 $ret = array('class' => 'cross');
260 260
261 if(!file_exists($dir)){ 261 if(!file_exists($dir)){
setup/wizard/installer.php
@@ -105,6 +105,15 @@ class Installer { @@ -105,6 +105,15 @@ class Installer {
105 protected $installOrders = array(); 105 protected $installOrders = array();
106 106
107 /** 107 /**
  108 + * List of installation properties
  109 + *
  110 + * @author KnowledgeTree Team
  111 + * @access protected
  112 + * @var array string
  113 + */
  114 + protected $installProperties = array();
  115 +
  116 + /**
108 * Flag if a step object needs confirmation 117 * Flag if a step object needs confirmation
109 * 118 *
110 * @author KnowledgeTree Team 119 * @author KnowledgeTree Team
@@ -281,11 +290,7 @@ class Installer { @@ -281,11 +290,7 @@ class Installer {
281 */ 290 */
282 private function _runStepAction($stepName) { 291 private function _runStepAction($stepName) {
283 $this->stepAction = new stepAction($stepName); 292 $this->stepAction = new stepAction($stepName);
284 - $this->stepAction->setSteps($this->getSteps());  
285 - $this->stepAction->setStepNames($this->getStepNames());  
286 - $this->stepAction->setDisplayConfirm($this->stepConfirmation);  
287 - $this->stepAction->setDisplayFirst($this->stepDisplayFirst());  
288 - $this->stepAction->loadSession($this->session); 293 + $this->stepAction->setUpStepAction($this->getSteps(), $this->getStepNames(), $this->getStepConfirmation(), $this->stepDisplayFirst(), $this->getSession(), $this->getInstallProperties());
289 294
290 return $this->stepAction->doAction(); 295 return $this->stepAction->doAction();
291 } 296 }
@@ -367,6 +372,22 @@ class Installer { @@ -367,6 +372,22 @@ class Installer {
367 } 372 }
368 373
369 /** 374 /**
  375 + * Set install properties
  376 + *
  377 + * @author KnowledgeTree Team
  378 + * @param none
  379 + * @access private
  380 + * @return void
  381 + */
  382 + private function _xmlInstallProperties() {
  383 + if(isset($this->simpleXmlObj)) {
  384 + $this->installProperties['install_version'] = (string) $this->simpleXmlObj['version'];
  385 + $this->installProperties['install_type'] = (string) $this->simpleXmlObj['type'];
  386 + $this->_loadToSession('installProperties', $this->installProperties);
  387 + }
  388 + }
  389 +
  390 + /**
370 * Install steps 391 * Install steps
371 * 392 *
372 * @author KnowledgeTree Team 393 * @author KnowledgeTree Team
@@ -456,7 +477,11 @@ class Installer { @@ -456,7 +477,11 @@ class Installer {
456 $this->installOrders = $this->session->get('installOrders'); 477 $this->installOrders = $this->session->get('installOrders');
457 if(!$this->installOrders) { 478 if(!$this->installOrders) {
458 $this->_xmlStepsOrders(); 479 $this->_xmlStepsOrders();
459 - } 480 + }
  481 + $this->installProperties = $this->session->get('installProperties');
  482 + if(!$this->installProperties) {
  483 + $this->_xmlInstallProperties();
  484 + }
460 } 485 }
461 486
462 private function loadNeeded() { 487 private function loadNeeded() {
@@ -576,6 +601,42 @@ class Installer { @@ -576,6 +601,42 @@ class Installer {
576 } 601 }
577 602
578 /** 603 /**
  604 + * Returns whether or not a confirmation step is needed
  605 + *
  606 + * @author KnowledgeTree Team
  607 + * @param none
  608 + * @access public
  609 + * @return boolean
  610 + */
  611 + public function getStepConfirmation() {
  612 + return $this->stepConfirmation;
  613 + }
  614 +
  615 + /**
  616 + * Return install properties
  617 + *
  618 + * @author KnowledgeTree Team
  619 + * @param string
  620 + * @access public
  621 + * @return string
  622 + */
  623 + public function getInstallProperties() {
  624 + return $this->installProperties;
  625 + }
  626 +
  627 + /**
  628 + * Returns session
  629 + *
  630 + * @author KnowledgeTree Team
  631 + * @param none
  632 + * @access public
  633 + * @return boolean
  634 + */
  635 + public function getSession() {
  636 + return $this->session;
  637 + }
  638 +
  639 + /**
579 * Dump of SESSION 640 * Dump of SESSION
580 * 641 *
581 * @author KnowledgeTree Team 642 * @author KnowledgeTree Team
setup/wizard/lib/services/unixOpenOffice.php
@@ -42,10 +42,70 @@ @@ -42,10 +42,70 @@
42 42
43 class unixOpenOffice extends unixService { 43 class unixOpenOffice extends unixService {
44 44
  45 + // utility
  46 + public $util;
  47 + // path to office
  48 + private $path;
  49 + // host
  50 + private $host;
  51 + // pid running
  52 + private $pidFile;
  53 + // port to bind to
  54 + private $port;
  55 + // bin folder
  56 + private $bin;
  57 + // office executable
  58 + private $soffice;
  59 + // office log file
  60 + private $log;
  61 +
  62 + # nohup /home/jarrett/ktdms/openoffice/program/soffice.bin -nofirststartwizard -nologo -headless -accept=socket,host=127.0.0.1,port=8100;urp;StarOffice.ServiceManager &> /home/jarrett/ktdms/var/log/dmsctl.log &
45 public function __construct() { 63 public function __construct() {
46 $this->name = "KTOpenOfficeTest"; 64 $this->name = "KTOpenOfficeTest";
  65 + $this->util = new InstallUtil();
47 } 66 }
48 67
49 - 68 + public function load() {
  69 + $this->setPort("8100");
  70 + $this->setHost("localhost");
  71 +
  72 + }
  73 +
  74 + private function setPort($port = "8100") {
  75 + $this->port = $port;
  76 + }
  77 +
  78 + private function setHost($host = "localhost") {
  79 + $this->host = $host;
  80 + }
  81 +
  82 + public function install() {
  83 + $status = $this->status();
  84 + if($status == '') {
  85 + return $this->start();
  86 + } else {
  87 + return $status;
  88 + }
  89 + }
  90 +
  91 + public function start() {
  92 + return false;
  93 + $state = $this->status();
  94 + if($state != 'STARTED') {
  95 + $cmd = "";
  96 + $cmd .= "";
  97 + $response = $this->util->pexec($cmd);
  98 +
  99 + return $response;
  100 + } elseif ($state == '') {
  101 + // Start Service
  102 + return true;
  103 + } else {
  104 + // Service Running Already
  105 + return true;
  106 + }
  107 +
  108 + return false;
  109 + }
50 } 110 }
51 ?> 111 ?>
52 \ No newline at end of file 112 \ No newline at end of file
setup/wizard/resources/graphics/dame/installer-header_logo.png 0 → 100644

2.85 KB

setup/wizard/resources/graphics/dame/installer_head.png

9.27 KB | W: | H:

2.78 KB | W: | H:

  • 2-up
  • Swipe
  • Onion skin
setup/wizard/resources/graphics/dropbox.png

13.6 KB | W: | H:

182 KB | W: | H:

  • 2-up
  • Swipe
  • Onion skin
setup/wizard/resources/graphics/dropbox_old.png 0 → 100644

13.6 KB

setup/wizard/resources/graphics/question.gif 0 → 100644

1.03 KB

setup/wizard/resources/wizard.css
@@ -66,7 +66,7 @@ select { @@ -66,7 +66,7 @@ select {
66 border:1px solid #B7B7B7; 66 border:1px solid #B7B7B7;
67 left:215px; 67 left:215px;
68 position:relative; 68 position:relative;
69 - top:25px; 69 + top:20px;
70 width:1024px; 70 width:1024px;
71 } 71 }
72 72
@@ -92,9 +92,8 @@ select { @@ -92,9 +92,8 @@ select {
92 } 92 }
93 93
94 #content { 94 #content {
95 - margin-left: 200px; 95 + margin-left: 220px;
96 height:515px; 96 height:515px;
97 -  
98 } 97 }
99 98
100 #content_container { 99 #content_container {
@@ -110,13 +109,65 @@ select { @@ -110,13 +109,65 @@ select {
110 height: 400px; 109 height: 400px;
111 } 110 }
112 111
  112 +#step_content_dependencies {
  113 + border: 1px solid rgb(207, 207, 207);
  114 + padding: 5px;
  115 + min-height:265px;
  116 +}
  117 +
  118 +#step_content_configuration {
  119 + border: 1px solid rgb(207, 207, 207);
  120 + padding: 5px;
  121 + min-height:290px;
  122 +}
  123 +
  124 +#step_content_registration {
  125 + border: 1px solid rgb(207, 207, 207);
  126 + padding: 5px;
  127 + height:295px;
  128 +}
  129 +
  130 +#step_content_registration_confirm {
  131 + border: 1px solid rgb(207, 207, 207);
  132 + padding: 5px;
  133 + height:400px;
  134 +}
  135 +
  136 +#step_content_install {
  137 + border: 1px solid rgb(207, 207, 207);
  138 + padding: 5px;
  139 + height:290px;
  140 +}
  141 +
  142 +#step_content_database {
  143 + border: 1px solid rgb(207, 207, 207);
  144 + padding: 5px;
  145 + min-height:355px;
  146 +}
  147 +
  148 +#step_content_database_confirm {
  149 + border: 1px solid rgb(207, 207, 207);
  150 + padding: 5px;
  151 + height:375px;
  152 +}
  153 +
  154 +#step_content_complete {
  155 + border: 1px solid rgb(207, 207, 207);
  156 + padding: 5px;
  157 + min-height:355px;
  158 +}
  159 +
  160 +.radio {
  161 + float:none;
  162 +}
  163 +
113 #sidebar { 164 #sidebar {
114 background: rgb(239, 239, 239) none repeat scroll 0% 0%; 165 background: rgb(239, 239, 239) none repeat scroll 0% 0%;
115 - font-size: 75%; 166 + font-size: 90%;
116 color: grey; 167 color: grey;
117 font-family: sans-serif; 168 font-family: sans-serif;
118 margin-top: 0px; 169 margin-top: 0px;
119 - width: 200px; 170 + width: 235px;
120 float: left; 171 float: left;
121 padding-top: 20px; 172 padding-top: 20px;
122 padding-bottom: 20px; 173 padding-bottom: 20px;
@@ -143,6 +194,18 @@ select { @@ -143,6 +194,18 @@ select {
143 margin-left: 10px; 194 margin-left: 10px;
144 } 195 }
145 196
  197 +#logo {
  198 + position:relative;
  199 + right:760px;
  200 + top:20px;
  201 +}
  202 +
  203 +#install_details {
  204 + bottom:30px;
  205 + position:relative;
  206 + right:10px;
  207 +}
  208 +
146 .menu { 209 .menu {
147 color: #616161; 210 color: #616161;
148 text-align: left; 211 text-align: left;
@@ -217,6 +280,16 @@ select { @@ -217,6 +280,16 @@ select {
217 color: red; 280 color: red;
218 } 281 }
219 282
  283 +/*
  284 +td.error {
  285 + width:190px;
  286 +}
  287 +*/
  288 +
  289 +.conf_paths {
  290 + width:755px;
  291 +}
  292 +
220 .errors { 293 .errors {
221 color: #9F0000; 294 color: #9F0000;
222 } 295 }
@@ -228,31 +301,6 @@ select { @@ -228,31 +301,6 @@ select {
228 width:120px; 301 width:120px;
229 } 302 }
230 303
231 -/*  
232 -#buttons_double input {  
233 - float: left;  
234 - margin-top: 10px;  
235 - margin-left: 5px;  
236 - font-size: 12px;  
237 - font-weight: bold;  
238 - background-image: url("graphics/dame/kt_gradient.jpg");  
239 - background-repeat: repeat-x;  
240 - background-position-y: 0%;  
241 - border: 1px solid #cecece;  
242 -}  
243 -  
244 -#buttons_single input {  
245 - float: right;  
246 - margin-top: 10px;  
247 - margin-left: 5px;  
248 - font-size: 12px;  
249 - font-weight: bold;  
250 - background-image: url("graphics/dame/kt_gradient.jpg");  
251 - background-repeat: repeat-x;  
252 - background-position-y: 0%;  
253 - border: 1px solid #cecece;  
254 -}*/  
255 -  
256 .back { 304 .back {
257 background-image: url("graphics/dame/kt_gradient.jpg"); 305 background-image: url("graphics/dame/kt_gradient.jpg");
258 background-repeat:repeat-x; 306 background-repeat:repeat-x;
@@ -275,6 +323,11 @@ input { @@ -275,6 +323,11 @@ input {
275 margin-top:10px; 323 margin-top:10px;
276 } 324 }
277 325
  326 +.textinput {
  327 + margin-top:0px;
  328 + float:left;
  329 +}
  330 +
278 .buttons a { 331 .buttons a {
279 background: #DDDDDD; 332 background: #DDDDDD;
280 border: solid 1px #888; 333 border: solid 1px #888;
@@ -326,12 +379,16 @@ input { @@ -326,12 +379,16 @@ input {
326 height:45px; 379 height:45px;
327 } 380 }
328 381
  382 +#dbconf {
  383 + width:755px;
  384 +}
  385 +
329 table#dbconf tr td { 386 table#dbconf tr td {
330 width:50%; 387 width:50%;
331 } 388 }
332 389
333 -input#dname {  
334 - size:40px; 390 +table#dbconf tr td input{
  391 +
335 } 392 }
336 393
337 .options { 394 .options {
@@ -343,48 +400,92 @@ input#dname { @@ -343,48 +400,92 @@ input#dname {
343 } 400 }
344 401
345 #section { 402 #section {
346 - /*border:1px solid;*/ 403 +
347 } 404 }
348 405
349 -sup {  
350 - font-size: 11px; 406 +.php_ext_details table {
  407 + width:745px;
351 } 408 }
352 409
353 -refresh {  
354 - /*  
355 - style="color: #000000;  
356 - font-weight: normal;  
357 - */ 410 +.php_ext_details table tr {
  411 +
358 } 412 }
359 413
360 -.php_ext_details table {  
361 - width:800px; 414 +td.ext_indicator {
  415 + width:10px;
  416 +}
  417 +
  418 +td.ext_name {
  419 + width:110p;
  420 +}
  421 +
  422 +td.ext_description {
  423 + width:360px;
  424 +}
  425 +
  426 +td.ext_error {
  427 + width:350px;
  428 +}
  429 +
  430 +td.ext_refresh {
  431 + width:10px;
  432 +}
  433 +
  434 +td.dir_name {
  435 + width:200px;
  436 +}
  437 +
  438 +td.dir_description {
  439 + width:200px;
362 } 440 }
363 441
364 .php_con_details table { 442 .php_con_details table {
365 - width:800px; 443 + width:745px;
  444 + /*border:1px solid;*/
366 } 445 }
367 446
368 .error_message { 447 .error_message {
369 border:none; 448 border:none;
370 - background-color:#FFCCCC;  
371 color:#A30000; 449 color:#A30000;
372 -/* width:550px; */  
373 padding:0px; 450 padding:0px;
  451 + color:red;
  452 + font-size:90%;
  453 + margin-bottom:0.75em;
  454 + font-weight:bold;
374 } 455 }
375 456
376 .continue_message { 457 .continue_message {
  458 + background: url("graphics/big-ok.png") no-repeat;
377 border:none; 459 border:none;
378 - background:transparent url("graphics/big-ok.png") no-repeat scroll 0 50%;  
379 width:550px; 460 width:550px;
380 padding:0px; 461 padding:0px;
  462 + color:#898989;
  463 + font-size:90%;
  464 + margin-bottom:0.75em;
381 } 465 }
382 466
383 .license_agreement { 467 .license_agreement {
384 overflow: scroll; 468 overflow: scroll;
385 height: 255px; 469 height: 255px;
386 - width:785px; 470 + width:765px;
387 height:370px; 471 height:370px;
388 overflow-x:hidden; 472 overflow-x:hidden;
389 border:1px solid #CFCFCF; 473 border:1px solid #CFCFCF;
  474 +}
  475 +
  476 +.db_adv_options {
  477 + height:200px;
  478 + width:720px;
  479 +}
  480 +
  481 +.adv_option {
  482 + height:65px;
  483 + width:720px;
  484 +}
  485 +
  486 +#tooltips {
  487 + background: url("graphics/question.gif") no-repeat;
  488 + width:16px;
  489 + height:16px;
  490 + cursor:pointer;
390 } 491 }
391 \ No newline at end of file 492 \ No newline at end of file
setup/wizard/resources/wizard.js
@@ -5,6 +5,7 @@ function wizard() { @@ -5,6 +5,7 @@ function wizard() {
5 // Does a form check on every new page load 5 // Does a form check on every new page load
6 wizard.prototype.doFormCheck = function() { 6 wizard.prototype.doFormCheck = function() {
7 w.addReadOnly(); 7 w.addReadOnly();
  8 + w.load();
8 } 9 }
9 10
10 // Toggle Advance Database options 11 // Toggle Advance Database options
@@ -134,61 +135,87 @@ wizard.prototype.onSubmitValidate = function(silent) { @@ -134,61 +135,87 @@ wizard.prototype.onSubmitValidate = function(silent) {
134 return true; 135 return true;
135 } 136 }
136 137
  138 +wizard.prototype.pClick = function() {
  139 + var state = document.getElementById('state');
  140 + if(state != "undefined") {
  141 + state.name = 'previous';
  142 + }
  143 +}
  144 +
  145 +wizard.prototype.nClick = function() {
  146 + var state = document.getElementById('state');
  147 + if(state != "undefined") {
  148 + state.name = 'next';
  149 + }
  150 +}
  151 +
137 // Validate Registration Page 152 // Validate Registration Page
138 wizard.prototype.validateRegistration = function() { 153 wizard.prototype.validateRegistration = function() {
139 - return true; 154 + // See if next or previous is clicked.
  155 + var state = document.getElementById('state').name;
  156 + if(state == 'next') {
  157 + if(w.valRegHelper()) {
  158 + document.getElementById('sendAll').name = 'Next'; // Force the next step
  159 + document.getElementById('sendAll').value = 'next';
  160 + document.getElementById('registration').submit();
  161 + }
  162 + } else if(state == 'previous') {
  163 + document.getElementById('sendAll').name = 'Previous'; // Force the previous step
  164 + document.getElementById('sendAll').value = 'previous';
  165 + document.getElementById('registration').submit();
  166 + }
  167 +}
  168 +
  169 +wizard.prototype.valRegHelper = function() {
140 var first = document.getElementById('first'); 170 var first = document.getElementById('first');
141 var last = document.getElementById('last'); 171 var last = document.getElementById('last');
142 var email = document.getElementById('email'); 172 var email = document.getElementById('email');
143 173
144 - if(first.value < 2) {  
145 - 174 + if(first.value.length < 2) {
  175 + document.getElementById("reg_error").innerHTML = "Please enter a First Name";
  176 + w.focusElement(first);
146 return false; 177 return false;
147 } 178 }
148 - if(last.value < 2) {  
149 -  
150 - 179 + if(last.value.length < 2) {
  180 + document.getElementById("reg_error").innerHTML = "Please enter a Last Name";
  181 + w.focusElement(last);
  182 + return false;
151 } 183 }
152 - if(w.emailCheck(email.value)) {  
153 - 184 + if(!w.emailCheck(email.value)) {
  185 + document.getElementById("reg_error").innerHTML = "Please enter a valid email address";
  186 + w.focusElement(email);
  187 + return false;
154 } 188 }
155 189
156 - return false; 190 + return true;
157 } 191 }
158 192
159 // Validate Registration Page Courtesy of SmartWebby.com (http://www.smartwebby.com/dhtml/) 193 // Validate Registration Page Courtesy of SmartWebby.com (http://www.smartwebby.com/dhtml/)
160 -wizard.prototype.emailCheck = function() { 194 +wizard.prototype.emailCheck = function(str) {
161 var at="@"; 195 var at="@";
162 var dot="."; 196 var dot=".";
163 var lat=str.indexOf(at); 197 var lat=str.indexOf(at);
164 var lstr=str.length; 198 var lstr=str.length;
165 var ldot=str.indexOf(dot); 199 var ldot=str.indexOf(dot);
166 if (str.indexOf(at)==-1) { 200 if (str.indexOf(at)==-1) {
167 - // alert("Invalid E-mail ID")  
168 return false; 201 return false;
169 } 202 }
170 if (str.indexOf(at)==-1 || str.indexOf(at)==0 || str.indexOf(at)==lstr) { 203 if (str.indexOf(at)==-1 || str.indexOf(at)==0 || str.indexOf(at)==lstr) {
171 - // alert("Invalid E-mail ID")  
172 return false; 204 return false;
173 } 205 }
174 if (str.indexOf(dot)==-1 || str.indexOf(dot)==0 || str.indexOf(dot)==lstr) { 206 if (str.indexOf(dot)==-1 || str.indexOf(dot)==0 || str.indexOf(dot)==lstr) {
175 - // alert("Invalid E-mail ID")  
176 return false; 207 return false;
177 } 208 }
178 if (str.indexOf(at,(lat+1))!=-1) { 209 if (str.indexOf(at,(lat+1))!=-1) {
179 - // alert("Invalid E-mail ID")  
180 return false; 210 return false;
181 } 211 }
182 if (str.substring(lat-1,lat)==dot || str.substring(lat+1,lat+2)==dot){ 212 if (str.substring(lat-1,lat)==dot || str.substring(lat+1,lat+2)==dot){
183 - // alert("Invalid E-mail ID")  
184 return false; 213 return false;
185 } 214 }
186 if (str.indexOf(dot,(lat+2))==-1){ 215 if (str.indexOf(dot,(lat+2))==-1){
187 - // alert("Invalid E-mail ID")  
188 return false; 216 return false;
189 } 217 }
190 if (str.indexOf(" ")!=-1){ 218 if (str.indexOf(" ")!=-1){
191 - // alert("Invalid E-mail ID")  
192 return false; 219 return false;
193 } 220 }
194 return true; 221 return true;
@@ -213,4 +240,9 @@ wizard.prototype.addReadOnly = function() { @@ -213,4 +240,9 @@ wizard.prototype.addReadOnly = function() {
213 // w.focusElement(inputs[i]); 240 // w.focusElement(inputs[i]);
214 } 241 }
215 } 242 }
  243 +}
  244 +
  245 +/* */
  246 +wizard.prototype.load = function() {
  247 +// $('#tooltips').tooltip();
216 } 248 }
217 \ No newline at end of file 249 \ No newline at end of file
setup/wizard/stepAction.php
@@ -78,6 +78,15 @@ class stepAction { @@ -78,6 +78,15 @@ class stepAction {
78 protected $displayFirst = false; 78 protected $displayFirst = false;
79 79
80 /** 80 /**
  81 + * List of install properties
  82 + *
  83 + * @author KnowledgeTree Team
  84 + * @access protected
  85 + * @var boolean
  86 + */
  87 + protected $installProperties = array();
  88 +
  89 + /**
81 * Reference to session object 90 * Reference to session object
82 * 91 *
83 * @author KnowledgeTree Team 92 * @author KnowledgeTree Team
@@ -107,6 +116,95 @@ class stepAction { @@ -107,6 +116,95 @@ class stepAction {
107 } 116 }
108 117
109 /** 118 /**
  119 + * Helper to initialize step actions
  120 + *
  121 + * @author KnowledgeTree Team
  122 + * @param string
  123 + * @access public
  124 + * @return string
  125 + */
  126 + public function setUpStepAction($steps, $stepNames, $stepConfirmation, $stepDisplayFirst, $session, $installProperties) {
  127 + $this->setSteps($steps);
  128 + $this->setStepNames($stepNames);
  129 + $this->setDisplayConfirm($stepConfirmation);
  130 + $this->setDisplayFirst($stepDisplayFirst);
  131 + $this->loadSession($session);
  132 + $this->setInstallProperties($installProperties);
  133 + }
  134 +
  135 + /**
  136 + * Sets steps class names in string format
  137 + *
  138 + * @author KnowledgeTree Team
  139 + * @param array
  140 + * @access public
  141 + * @return void
  142 + */
  143 + public function setSteps($stepClassNames) {
  144 + $this->stepClassNames = $stepClassNames;
  145 + }
  146 +
  147 + /**
  148 + * Sets steps in human readable string format
  149 + *
  150 + * @author KnowledgeTree Team
  151 + * @param array
  152 + * @access public
  153 + * @return void
  154 + */
  155 + public function setStepNames($step_names) {
  156 + $this->step_names = $step_names;
  157 + }
  158 +
  159 + /**
  160 + * Sets confirmation page flag
  161 + *
  162 + * @author KnowledgeTree Team
  163 + * @param boolean
  164 + * @access public
  165 + * @return void
  166 + */
  167 + public function setDisplayConfirm($displayConfirm) {
  168 + $this->displayConfirm = $displayConfirm;
  169 + }
  170 +
  171 + /**
  172 + * Sets confirmation page first flag
  173 + *
  174 + * @author KnowledgeTree Team
  175 + * @param boolean
  176 + * @access public
  177 + * @return void
  178 + */
  179 + public function setDisplayFirst($displayFirst) {
  180 + $this->displayFirst = $displayFirst;
  181 + }
  182 +
  183 + /**
  184 + * Sets session object
  185 + *
  186 + * @author KnowledgeTree Team
  187 + * @param object Session
  188 + * @access public
  189 + * @return void
  190 + */
  191 + public function loadSession($ses) {
  192 + $this->session = $ses;
  193 + }
  194 +
  195 + /**
  196 + * Sets install properties
  197 + *
  198 + * @author KnowledgeTree Team
  199 + * @param array
  200 + * @access public
  201 + * @return void
  202 + */
  203 + public function setInstallProperties($installProperties) {
  204 + $this->installProperties = $installProperties;
  205 + }
  206 +
  207 + /**
110 * Main control to handle the steps actions 208 * Main control to handle the steps actions
111 * 209 *
112 * @author KnowledgeTree Team 210 * @author KnowledgeTree Team
@@ -181,43 +279,7 @@ class stepAction { @@ -181,43 +279,7 @@ class stepAction {
181 279
182 return $str; 280 return $str;
183 } 281 }
184 -  
185 - /**  
186 - * Sets steps class names in string format  
187 - *  
188 - * @author KnowledgeTree Team  
189 - * @param array  
190 - * @access public  
191 - * @return void  
192 - */  
193 - public function setSteps($stepClassNames) {  
194 - $this->stepClassNames = $stepClassNames;  
195 - }  
196 -  
197 - /**  
198 - * Sets steps in human readable string format  
199 - *  
200 - * @author KnowledgeTree Team  
201 - * @param array  
202 - * @access public  
203 - * @return void  
204 - */  
205 - public function setStepNames($step_names) {  
206 - $this->step_names = $step_names;  
207 - }  
208 -  
209 - /**  
210 - * Returns a message to display at the top of template  
211 - *  
212 - * @author KnowledgeTree Team  
213 - * @param none  
214 - * @access public  
215 - * @return string  
216 - */  
217 - public function getTop() {  
218 - return '<span class="top">'.$this->getCurrentStepName().'</span>';  
219 - }  
220 - 282 +
221 /** 283 /**
222 * Returns current step name 284 * Returns current step name
223 * 285 *
@@ -270,10 +332,6 @@ class stepAction { @@ -270,10 +332,6 @@ class stepAction {
270 return $menu; 332 return $menu;
271 } 333 }
272 334
273 - public function getActions() {  
274 -  
275 - }  
276 -  
277 /** 335 /**
278 * Returns confirmation page flag 336 * Returns confirmation page flag
279 * 337 *
@@ -283,7 +341,6 @@ class stepAction { @@ -283,7 +341,6 @@ class stepAction {
283 * @return boolean 341 * @return boolean
284 */ 342 */
285 public function displayConfirm() { 343 public function displayConfirm() {
286 - // TODO:No other way I can think of doing this  
287 return $this->displayConfirm; 344 return $this->displayConfirm;
288 } 345 }
289 346
@@ -300,42 +357,6 @@ class stepAction { @@ -300,42 +357,6 @@ class stepAction {
300 } 357 }
301 358
302 /** 359 /**
303 - * Sets confirmation page flag  
304 - *  
305 - * @author KnowledgeTree Team  
306 - * @param boolean  
307 - * @access public  
308 - * @return void  
309 - */  
310 - public function setDisplayConfirm($displayConfirm) {  
311 - $this->displayConfirm = $displayConfirm;  
312 - }  
313 -  
314 - /**  
315 - * Sets confirmation page first flag  
316 - *  
317 - * @author KnowledgeTree Team  
318 - * @param boolean  
319 - * @access public  
320 - * @return void  
321 - */  
322 - public function setDisplayFirst($displayFirst) {  
323 - $this->displayFirst = $displayFirst;  
324 - }  
325 -  
326 - /**  
327 - * Sets session object  
328 - *  
329 - * @author KnowledgeTree Team  
330 - * @param object Session  
331 - * @access public  
332 - * @return void  
333 - */  
334 - public function loadSession($ses) {  
335 - $this->session = $ses;  
336 - }  
337 -  
338 - /**  
339 * Returns session object 360 * Returns session object
340 * 361 *
341 * @author KnowledgeTree Team 362 * @author KnowledgeTree Team
@@ -356,8 +377,7 @@ class stepAction { @@ -356,8 +377,7 @@ class stepAction {
356 * @return string 377 * @return string
357 */ 378 */
358 public function paintAction() { 379 public function paintAction() {
359 - $left = $this->getLeftMenu();  
360 - $top = $this->getTop(); 380 +
361 $step_errors = $this->action->getErrors(); // Get errors 381 $step_errors = $this->action->getErrors(); // Get errors
362 $step_warnings = $this->action->getWarnings(); // Get warnings 382 $step_warnings = $this->action->getWarnings(); // Get warnings
363 if($this->displayConfirm()) { // Check if theres a confirm step 383 if($this->displayConfirm()) { // Check if theres a confirm step
@@ -382,11 +402,19 @@ class stepAction { @@ -382,11 +402,19 @@ class stepAction {
382 } 402 }
383 $content = $step_tpl->fetch(); 403 $content = $step_tpl->fetch();
384 $tpl = new Template("templates/wizard.tpl"); 404 $tpl = new Template("templates/wizard.tpl");
  405 + $vars = $this->getVars(); // Get template variables
  406 + $tpl->set("vars", $vars); // Set template errors
385 $tpl->set('content', $content); 407 $tpl->set('content', $content);
386 - $tpl->set('left', $left);  
387 echo $tpl->fetch(); 408 echo $tpl->fetch();
388 } 409 }
389 410
  411 + public function getVars() {
  412 + $left = $this->getLeftMenu();
  413 + $vars['left'] = $left; // Set left menu
  414 + $vars['install_version'] = $this->installProperties['install_version']; // Set version
  415 + $vars['install_type'] = $this->installProperties['install_type']; // Set type
  416 + return $vars;
  417 + }
390 /** 418 /**
391 * Load class to session 419 * Load class to session
392 * 420 *
setup/wizard/steps/complete.php
@@ -65,14 +65,6 @@ class complete extends Step { @@ -65,14 +65,6 @@ class complete extends Step {
65 65
66 protected $util = null; 66 protected $util = null;
67 67
68 - /**  
69 - * List of services to check  
70 - *  
71 - * @access private  
72 - * @var array  
73 - */  
74 - private $_services = array('Lucene', 'Scheduler');  
75 -  
76 public function __construct() { 68 public function __construct() {
77 $this->temp_variables = array("step_name"=>"complete", "silent"=>$this->silent); 69 $this->temp_variables = array("step_name"=>"complete", "silent"=>$this->silent);
78 $this->_dbhandler = new dbUtil(); 70 $this->_dbhandler = new dbUtil();
setup/wizard/steps/dependencies.php
@@ -361,7 +361,7 @@ class dependencies extends Step @@ -361,7 +361,7 @@ class dependencies extends Step
361 private function getConfigurations() 361 private function getConfigurations()
362 { 362 {
363 return array( 363 return array(
364 - array('name' => 'Safe Mode', 'configuration' => 'safe_mode', 'recommended' => 'ON', 'type' => 'bool'), 364 + array('name' => 'Safe Mode', 'configuration' => 'safe_mode', 'recommended' => 'OFF', 'type' => 'bool'),
365 array('name' => 'Display Errors', 'configuration' => 'display_errors', 'recommended' => 'OFF', 'type' => 'bool'), 365 array('name' => 'Display Errors', 'configuration' => 'display_errors', 'recommended' => 'OFF', 'type' => 'bool'),
366 array('name' => 'Display Startup Errors', 'configuration' => 'display_startup_errors', 'recommended' => 'ON', 'type' => 'bool'), 366 array('name' => 'Display Startup Errors', 'configuration' => 'display_startup_errors', 'recommended' => 'ON', 'type' => 'bool'),
367 array('name' => 'File Uploads', 'configuration' => 'file_uploads', 'recommended' => 'ON', 'type' => 'bool'), 367 array('name' => 'File Uploads', 'configuration' => 'file_uploads', 'recommended' => 'ON', 'type' => 'bool'),
setup/wizard/steps/registration.php
@@ -42,9 +42,6 @@ @@ -42,9 +42,6 @@
42 42
43 class registration extends Step 43 class registration extends Step
44 { 44 {
45 -  
46 - public $temp_variables = array("step_name"=>"registration");  
47 -  
48 /** 45 /**
49 * Initialise the registration step 46 * Initialise the registration step
50 * 47 *
@@ -66,10 +63,6 @@ class registration extends Step @@ -66,10 +63,6 @@ class registration extends Step
66 public function doStep() 63 public function doStep()
67 { 64 {
68 $this->setFormInfo(); 65 $this->setFormInfo();
69 -// die('a');  
70 -//print_r($_POST);  
71 -//print_r($_GET);  
72 -return 'next';  
73 if(!$this->inStep("registration")) { 66 if(!$this->inStep("registration")) {
74 return 'landing'; 67 return 'landing';
75 } 68 }
@@ -98,7 +91,7 @@ return &#39;next&#39;; @@ -98,7 +91,7 @@ return &#39;next&#39;;
98 if(isset($_POST['registered']) && $_POST['registered'] == 'yes'){ 91 if(isset($_POST['registered']) && $_POST['registered'] == 'yes'){
99 return true; 92 return true;
100 } 93 }
101 - 94 +return true;
102 //$this->postForm($_POST); 95 //$this->postForm($_POST);
103 //$this->sendToHost($_POST); 96 //$this->sendToHost($_POST);
104 97
setup/wizard/steps/services.php
@@ -61,6 +61,7 @@ class services extends Step @@ -61,6 +61,7 @@ class services extends Step
61 protected $runInstall = true; 61 protected $runInstall = true;
62 62
63 private $services = array('Lucene', 'Scheduler', 'OpenOffice'); 63 private $services = array('Lucene', 'Scheduler', 'OpenOffice');
  64 +// private $services = array('OpenOffice');
64 65
65 protected $java; 66 protected $java;
66 67
@@ -68,7 +69,7 @@ class services extends Step @@ -68,7 +69,7 @@ class services extends Step
68 69
69 protected $util; 70 protected $util;
70 71
71 - private $javaVersion = '1.7'; 72 + private $javaVersion = '1.5';
72 73
73 /** 74 /**
74 * Java Installed 75 * Java Installed
@@ -294,8 +295,10 @@ class services extends Step @@ -294,8 +295,10 @@ class services extends Step
294 $service = new $className(); 295 $service = new $className();
295 $status = $this->serviceStatus($service); 296 $status = $this->serviceStatus($service);
296 if($status != 'STARTED') { 297 if($status != 'STARTED') {
297 - $this->temp_variables['services'][] = array('class'=>'cross_orange', 'msg'=>$service->getName()." Could not be added as a Service"); 298 + $msg = $service->getName()." Could not be added as a Service";
  299 + $this->temp_variables['services'][] = array('class'=>'cross_orange', 'msg'=>$msg);
298 $this->serviceCheck = 'cross_orange'; 300 $this->serviceCheck = 'cross_orange';
  301 + $this->warnings[] = $msg;
299 } else { 302 } else {
300 if(WINDOWS_OS) { 303 if(WINDOWS_OS) {
301 $this->temp_variables['services'][] = array('class'=>'tick', 'msg'=>$service->getName()." has been added as a Service"); } 304 $this->temp_variables['services'][] = array('class'=>'tick', 'msg'=>$service->getName()." has been added as a Service"); }
@@ -356,7 +359,7 @@ class services extends Step @@ -356,7 +359,7 @@ class services extends Step
356 } 359 }
357 360
358 private function useDetected() { 361 private function useDetected() {
359 - return $this->detSettings(); 362 + return $this->detSettings(true);
360 } 363 }
361 364
362 private function specifyJava() { 365 private function specifyJava() {
@@ -387,7 +390,7 @@ class services extends Step @@ -387,7 +390,7 @@ class services extends Step
387 * @access private 390 * @access private
388 * @return boolean 391 * @return boolean
389 */ 392 */
390 - private function detSettings() { 393 + private function detSettings($attempt) {
391 $javaExecutable = $this->util->javaSpecified();// Retrieve java bin 394 $javaExecutable = $this->util->javaSpecified();// Retrieve java bin
392 $cmd = "$javaExecutable -version > output/outJV 2>&1 echo $!"; 395 $cmd = "$javaExecutable -version > output/outJV 2>&1 echo $!";
393 $response = $this->util->pexec($cmd); 396 $response = $this->util->pexec($cmd);
@@ -398,7 +401,7 @@ class services extends Step @@ -398,7 +401,7 @@ class services extends Step
398 if($matches[1] < $this->javaVersion) { // Check Version of java 401 if($matches[1] < $this->javaVersion) { // Check Version of java
399 $this->javaVersionInCorrect(); 402 $this->javaVersionInCorrect();
400 $this->javaCheck = 'cross'; 403 $this->javaCheck = 'cross';
401 - $this->error[] = "Requires Java 1.5+ to be installed"; 404 + if(!$attempt) $this->error[] = "Requires Java 1.5+ to be installed";
402 return false; 405 return false;
403 } else { 406 } else {
404 $this->javaVersionCorrect(); 407 $this->javaVersionCorrect();
@@ -411,10 +414,12 @@ class services extends Step @@ -411,10 +414,12 @@ class services extends Step
411 $this->javaVersionWarning(); 414 $this->javaVersionWarning();
412 $this->javaCheck = 'cross_orange'; 415 $this->javaCheck = 'cross_orange';
413 $this->javaExeError = "Java : Incorrect path specified"; 416 $this->javaExeError = "Java : Incorrect path specified";
414 - $this->error[] = "Requires Java 1.5+ to be installed"; 417 + if(!$attempt) $this->error[] = "Requires Java 1.5+ to be installed";
415 return false; 418 return false;
416 } 419 }
417 } 420 }
  421 +
  422 + return false;
418 } 423 }
419 424
420 function detPhpSettings() { 425 function detPhpSettings() {
setup/wizard/templates/complete.tpl
1 -<h1>Installation Completed</h1>  
2 -  
3 -<h2>KnowledgeTree post-configuration checkup</h2>  
4 -  
5 -<p>This allows you to check that your KnowledgeTree configuration is set  
6 -up correctly. You can run this at any time after configuration to check  
7 -that things are still set up correctly.</p>  
8 -  
9 -<?php  
10 -if($errors || $warnings){  
11 - echo '<div>'  
12 - . '<a href="http://wiki.knowledgetree.com/Web_Based_Installer#Post_Install" target="_blank">'  
13 - . 'Click Here for help on overcoming post install issues</a></div><br/>';  
14 -}  
15 -?> 1 +<form>
  2 + <p class="title">Installation Completed</p>
  3 +
  4 +<!-- <h2>KnowledgeTree post-configuration checkup</h2>-->
16 5
17 -<div>  
18 - <h3><?php echo "<span class='{$paths_check}'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>"; ?>Paths and Permissions</h3>  
19 -<?php if($silent) { ?>  
20 - <div id="options" class="onclick" onclick="javascript:{w.toggleClass('paths_check');}">Show Details</div>  
21 - <div class="paths_check" style="display:none">  
22 -<?php } ?>  
23 - <table>  
24 - <tr><?php echo $varDirectory; ?></tr>  
25 - <tr><?php echo $documentRoot; ?></tr>  
26 - <tr><?php echo $logDirectory; ?></tr>  
27 - <tr><?php echo $tmpDirectory; ?></tr>  
28 - <tr><?php echo $uploadDirectory; ?></tr>  
29 - <tr><?php echo $config; ?></tr>  
30 - <tr><?php echo $docLocation; ?></tr>  
31 - </table>  
32 -<?php if($silent) { ?> 6 + <p>This allows you to check that your KnowledgeTree configuration is set
  7 + up correctly. You can run this at any time after configuration to check
  8 + that things are still set up correctly.</p>
  9 +
  10 + <?php
  11 + if($errors || $warnings){
  12 + echo '<div>'
  13 + . '<a href="http://wiki.knowledgetree.com/Web_Based_Installer#Post_Install" target="_blank">'
  14 + . 'Click Here for help on overcoming post install issues</a></div><br/>';
  15 + }
  16 + ?>
  17 + <div id="step_content_complete">
  18 + <div>
  19 + <h3><?php echo "<span class='{$paths_check}'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>"; ?>Paths and Permissions</h3>
  20 + <?php if($silent) { ?>
  21 + <div id="options" class="onclick" onclick="javascript:{w.toggleClass('paths_check');}">Show Details</div>
  22 + <div class="paths_check" style="display:none">
  23 + <?php } ?>
  24 + <table>
  25 + <tr><?php echo $varDirectory; ?></tr>
  26 + <tr><?php echo $documentRoot; ?></tr>
  27 + <tr><?php echo $logDirectory; ?></tr>
  28 + <tr><?php echo $tmpDirectory; ?></tr>
  29 + <tr><?php echo $uploadDirectory; ?></tr>
  30 + <tr><?php echo $config; ?></tr>
  31 + <tr><?php echo $docLocation; ?></tr>
  32 + </table>
  33 + <?php if($silent) { ?>
  34 + </div>
  35 + <?php } ?>
33 </div> 36 </div>
34 -<?php } ?>  
35 -</div>  
36 -<div>  
37 - <h3><?php echo "<span class='{$database_check}'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>"; ?>Database connectivity</h3>  
38 -<?php if($silent) { ?>  
39 - <div id="options" class="onclick" onclick="javascript:{w.toggleClass('database_check');}">Show Details</div>  
40 - <div class="database_check" style="display:none">  
41 -<?php } ?>  
42 - <table>  
43 - <tr><?php echo $dbConnectAdmin; ?></tr>  
44 - <tr><?php echo $dbConnectUser; ?></tr>  
45 - </table>  
46 -<?php if($silent) { ?> 37 + <div>
  38 + <h3><?php echo "<span class='{$database_check}'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>"; ?>Database connectivity</h3>
  39 + <?php if($silent) { ?>
  40 + <div id="options" class="onclick" onclick="javascript:{w.toggleClass('database_check');}">Show Details</div>
  41 + <div class="database_check" style="display:none">
  42 + <?php } ?>
  43 + <table>
  44 + <tr><?php echo $dbConnectAdmin; ?></tr>
  45 + <tr><?php echo $dbConnectUser; ?></tr>
  46 + </table>
  47 + <?php if($silent) { ?>
  48 + </div>
  49 + <?php } ?>
  50 + <h3><?php echo "<span class='{$privileges_check}'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>"; ?>Privileges</h3>
  51 + <?php if($silent) { ?>
  52 + <div id="options" class="onclick" onclick="javascript:{w.toggleClass('privileges_check');}">Show Details</div>
  53 + <div class="privileges_check" style="display:none">
  54 + <?php } ?>
  55 + <table>
  56 + <tr><?php echo $dbPrivileges; ?></tr>
  57 + <tr><?php echo $dbTransaction; ?></tr>
  58 + </table>
  59 + <?php if($silent) { ?>
  60 + </div>
  61 + <?php } ?>
47 </div> 62 </div>
48 -<?php } ?>  
49 - <h3><?php echo "<span class='{$privileges_check}'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>"; ?>Privileges</h3>  
50 -<?php if($silent) { ?>  
51 - <div id="options" class="onclick" onclick="javascript:{w.toggleClass('privileges_check');}">Show Details</div>  
52 - <div class="privileges_check" style="display:none">  
53 -<?php } ?>  
54 - <table>  
55 - <tr><?php echo $dbPrivileges; ?></tr>  
56 - <tr><?php echo $dbTransaction; ?></tr>  
57 - </table>  
58 -<?php if($silent) { ?> 63 + <div>
  64 + <h3><?php echo "<span class='{$services_check}'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>"; ?>Services</h3>
  65 + <?php if($silent) { ?>
  66 + <div id="options" class="onclick" onclick="javascript:{w.toggleClass('services_check');}">Show Details</div>
  67 + <div class="services_check" style="display:none">
  68 + <?php } ?>
  69 + <table>
  70 + <tr>
  71 + <td><?php echo "<span class='{$LuceneStatus}'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>"; ?>Lucene Service</td>
  72 + <?php if ($LuceneStatus != 'tick') { ?>
  73 + <td><a href="javascript:this.location.reload();" class="refresh">Refresh</a></td>
  74 + <?php } ?>
  75 + </tr>
  76 + <tr>
  77 + <td><?php echo "<span class='{$SchedulerStatus}'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>"; ?>Scheduler Service</td>
  78 + <?php if ($SchedulerStatus != 'tick') { ?>
  79 + <td><a href="javascript:this.location.reload();" class="refresh">Refresh</a></td>
  80 + <?php } ?>
  81 + </tr>
  82 + </table>
  83 + <?php if($silent) { ?>
  84 + </div>
  85 + <?php } ?>
59 </div> 86 </div>
60 -<?php } ?>  
61 -</div>  
62 -<div>  
63 - <h3><?php echo "<span class='{$services_check}'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>"; ?>Services</h3>  
64 -<?php if($silent) { ?>  
65 - <div id="options" class="onclick" onclick="javascript:{w.toggleClass('services_check');}">Show Details</div>  
66 - <div class="services_check" style="display:none">  
67 -<?php } ?>  
68 - <table>  
69 - <tr>  
70 - <td><?php echo "<span class='{$LuceneStatus}'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>"; ?>Lucene Service</td>  
71 - <?php if ($LuceneStatus != 'tick') { ?>  
72 - <td><a href="javascript:this.location.reload();" class="refresh">Refresh</a></td>  
73 - <?php } ?>  
74 - </tr>  
75 - <tr>  
76 - <td><?php echo "<span class='{$SchedulerStatus}'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>"; ?>Scheduler Service</td>  
77 - <?php if ($SchedulerStatus != 'tick') { ?>  
78 - <td><a href="javascript:this.location.reload();" class="refresh">Refresh</a></td>  
79 - <?php } ?>  
80 - </tr>  
81 - </table>  
82 -<?php if($silent) { ?>  
83 </div> 87 </div>
84 -<?php } ?>  
85 -</div>  
86 -<form>  
87 - <div class="buttons">  
88 -<!-- <a href="index.php?step_name=complete&step=previous" class="previous">Previous</a>-->  
89 -<!-- <a href="">Refresh</a>-->  
90 - <a href="../../">Goto Login</a>  
91 - <?php  
92 - if (INSTALL_TYPE == 'Zend') {  
93 - echo '<a href="http://' . $_SERVER['HTTP_HOST'] . '/ZendServer/Index">Zend Server Configuration</a>';  
94 - }  
95 - ?>  
96 -</div> 88 + <a href="../../" class="buttons back" style="width:80px;">Goto Login</a>
  89 + <?php
  90 + if (INSTALL_TYPE == 'Zend') {
  91 + ?>
  92 + <a href="<?php echo "http://".$_SERVER['HTTP_HOST'].":10081/ZendServer/Index"; ?>" class="back" target="_blank">Zend Server Configuration</a>
  93 + <?php
  94 + }
  95 + ?>
97 </form> 96 </form>
98 \ No newline at end of file 97 \ No newline at end of file
setup/wizard/templates/configuration.tpl
1 -<h1>Checking System Configuration</h1> 1 +<form action="index.php?step_name=configuration" method="post">
  2 +<p class="title">Checking System Configuration</p>
2 3
3 <p class="description"> 4 <p class="description">
4 The wizard will review your system to determine whether KnowledgeTree is correctly configured. You&rsquo;ll see whether KnowledgeTree has the correct settings or whether changes are required. 5 The wizard will review your system to determine whether KnowledgeTree is correctly configured. You&rsquo;ll see whether KnowledgeTree has the correct settings or whether changes are required.
@@ -15,7 +16,7 @@ The wizard will review your system to determine whether KnowledgeTree is correct @@ -15,7 +16,7 @@ The wizard will review your system to determine whether KnowledgeTree is correct
15 </div> 16 </div>
16 <div class="error_message"> 17 <div class="error_message">
17 <?php if($errors) { ?> 18 <?php if($errors) { ?>
18 - <span class='cross'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Your system is not quite ready to run KnowledgeTree. See the list below to determine which areas you need to address. <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Once you&rsquo;ve fixed these items, return to this wizard and try again.</span><br/> 19 + <span class='cross'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Your system is not quite ready to run KnowledgeTree. See the list below to determine which areas you need &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;to address. Once you&rsquo;ve fixed these items, return to this wizard and try again.</span><br/>
19 <?php } elseif ($warnings) { 20 <?php } elseif ($warnings) {
20 ?> 21 ?>
21 <span class='cross_orange'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KnowledgeTree Optional Dependencies not met, but you will be able to continue.</span><br/> 22 <span class='cross_orange'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KnowledgeTree Optional Dependencies not met, but you will be able to continue.</span><br/>
@@ -28,40 +29,47 @@ The wizard will review your system to determine whether KnowledgeTree is correct @@ -28,40 +29,47 @@ The wizard will review your system to determine whether KnowledgeTree is correct
28 <?php } ?> 29 <?php } ?>
29 </div> 30 </div>
30 31
31 -<form action="index.php?step_name=configuration" method="post"> 32 +<div id="step_content_configuration">
32 <h3>Server Settings</h3> 33 <h3>Server Settings</h3>
33 34
34 <p class="description"> 35 <p class="description">
35 The settings below have been drawn from the system information. The host and port should reflect the host and port that will be used to access KnowledgeTree. The Root Url is only needed if your installation is in a directory off the main web server root. 36 The settings below have been drawn from the system information. The host and port should reflect the host and port that will be used to access KnowledgeTree. The Root Url is only needed if your installation is in a directory off the main web server root.
36 </p> 37 </p>
37 38
38 -<table> 39 +<table class="dbconf">
39 <tr> 40 <tr>
40 - <td><label for='host'>Host: </label></td>  
41 - <td><input name='host' id='host' size='60' value='<?php echo $server['host']['value']; ?>' /></td> 41 + <td width="150px"><label for='host'>Host: </label></td>
  42 + <td> <div id="tooltips" title="Location of your web root">&nbsp;</div> </td>
  43 + <td><input name='host' id='host' size='35' value='<?php echo $server['host']['value']; ?>' /></td>
42 </tr> 44 </tr>
43 <tr> 45 <tr>
44 <td><label for='port'>Port: </label></td> 46 <td><label for='port'>Port: </label></td>
45 - <td><input name='port' id='port' size='5' value='<?php echo $server['port']['value']; ?>' /></td> 47 + <td> <div id="tooltips" title="The port that the web server listens on.">&nbsp;</div> </td>
  48 + <td><input name='port' id='port' size='5' value='<?php echo $server['port']['value']; ?>' style="float:left;"/></td>
46 </tr> 49 </tr>
47 <tr> 50 <tr>
48 <td><label for='root_url'>Root URL: </label></td> 51 <td><label for='root_url'>Root URL: </label></td>
49 - <td><input name='root_url' id='root_url' size='60' value='<?php echo $server['root_url']['value']; ?>' /></td> 52 + <td> <div id="tooltips" title="Relative path to KnowledgeTree Source directory">&nbsp;</div> </td>
  53 + <td><input name='root_url' id='root_url' size='35' value='<?php echo $server['root_url']['value']; ?>' /></td>
50 </tr> 54 </tr>
51 <tr> 55 <tr>
52 <td><label for='file_system_root'>Web Root: </label></td> 56 <td><label for='file_system_root'>Web Root: </label></td>
53 - <td><input name='file_system_root' id='file_system_root' size='60' value='<?php echo $server['file_system_root']['value']; ?>' /></td> 57 + <td> <div id="tooltips" title="Absolute path to KnowledgeTree Source directory">&nbsp;</div> </td>
  58 + <td><input name='file_system_root' id='file_system_root' size='35' value='<?php echo $server['file_system_root']['value']; ?>' /></td>
54 </tr> 59 </tr>
55 <tr> 60 <tr>
56 - <td><label for='yes'>Do you have SSL Enabled?: </label></td>  
57 - <td>  
58 - <label for='yes'>Yes: </label><input type='radio' name='ssl_enabled' id='yes' value='yes' <?php echo $server['ssl_enabled']['value'] == 'yes' ? 'CHECKED' : ''; ?> />&nbsp;&nbsp;  
59 - <label for='no'>No: </label><input type='radio' name='ssl_enabled' id='no' value='no' <?php echo $server['ssl_enabled']['value'] == 'no' ? 'CHECKED' : ''; ?> />  
60 - </td> 61 + <td> <label for='yes'>Do you have SSL Enabled?: </label> </td>
  62 + <td> <div id="tooltips" title="Whether or not you have SSL installed">&nbsp;</div> </td>
  63 + <td>
  64 + <label for='yes'>Yes: </label>
  65 + <input class="radio" type='radio' name='ssl_enabled' id='yes' value='yes' <?php echo $server['ssl_enabled']['value'] == 'yes' ? 'CHECKED' : ''; ?> />
  66 + <label for='no'>No: </label>
  67 + <input class="radio" type='radio' name='ssl_enabled' id='no' value='no' <?php echo $server['ssl_enabled']['value'] == 'no' ? 'CHECKED' : ''; ?> />
  68 + </td>
61 </tr> 69 </tr>
62 </table> 70 </table>
63 71
64 -<h3><?php echo "<span class='{$paths_perms}'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>"; ?>Paths and Permissions</h3> 72 +<h3><?php echo "<span class='{$paths_perms}'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>"; ?>Directory Paths and Permissions</h3>
65 <?php if($silent) { ?> 73 <?php if($silent) { ?>
66 <div id="options" class="onclick" onclick="javascript:{w.toggleClass('paths_perms');}">Show Details</div> 74 <div id="options" class="onclick" onclick="javascript:{w.toggleClass('paths_perms');}">Show Details</div>
67 <div class="paths_perms" style="display:none"> 75 <div class="paths_perms" style="display:none">
@@ -76,12 +84,17 @@ The following folders must be writable for KnowledgeTree to be able to run. The @@ -76,12 +84,17 @@ The following folders must be writable for KnowledgeTree to be able to run. The
76 <tr> 84 <tr>
77 <td> <div class='<?php echo $path['class']; ?>'></div> </td> 85 <td> <div class='<?php echo $path['class']; ?>'></div> </td>
78 <td> <label for='<?php echo $path['setting']; ?>'> <?php echo $path['name']; ?>: </label> </td> 86 <td> <label for='<?php echo $path['setting']; ?>'> <?php echo $path['name']; ?>: </label> </td>
79 - <td><input name='<?php echo $path['setting']; ?>' id='<?php echo $path['setting']; ?>' size='60' value='<?php echo $path['path']; ?>' /></td> 87 + <td><input name='<?php echo $path['setting']; ?>' id='<?php echo $path['setting']; ?>' style="float:left;width:290px;" value='<?php echo $path['path']; ?>' /></td>
80 <?php if(isset($path['msg'])) { 88 <?php if(isset($path['msg'])) {
81 ?> 89 ?>
82 <td class="error"> <?php echo $path['msg']; ?> </td> 90 <td class="error"> <?php echo $path['msg']; ?> </td>
83 <td><a href="javascript:this.location.reload();" class="refresh">Refresh</a></td> 91 <td><a href="javascript:this.location.reload();" class="refresh">Refresh</a></td>
84 <?php 92 <?php
  93 + } else {
  94 + ?>
  95 + <td class="error"> </td>
  96 + <td> </td>
  97 + <?php
85 } 98 }
86 ?> 99 ?>
87 </tr> 100 </tr>
@@ -92,8 +105,7 @@ The following folders must be writable for KnowledgeTree to be able to run. The @@ -92,8 +105,7 @@ The following folders must be writable for KnowledgeTree to be able to run. The
92 <?php if($silent) { ?> 105 <?php if($silent) { ?>
93 </div> 106 </div>
94 <?php } ?> 107 <?php } ?>
95 -<div class="buttons">  
96 - <input type="submit" name="Previous" value="Previous"/>  
97 - <input type="submit" name="Next" value="Next"/>  
98 -</div> 108 + </div>
  109 + <input type="submit" name="Previous" value="Previous" class="back"/>
  110 + <input type="submit" name="Next" value="Next" class="input"/>
99 </form> 111 </form>
100 \ No newline at end of file 112 \ No newline at end of file
setup/wizard/templates/configuration_confirm.tpl
1 -<h1>System Configuration</h1>  
2 -  
3 -<h3>Server Settings</h3>  
4 -  
5 -<table>  
6 - <tr>  
7 - <td>Host: </td>  
8 - <td><?php echo $server['host']['value']; ?></td>  
9 - </tr>  
10 - <tr>  
11 - <td>Port: </td>  
12 - <td><?php echo $server['port']['value']; ?></td>  
13 - </tr>  
14 - <tr>  
15 - <td>Root Url: </td>  
16 - <td><?php echo $server['root_url']['value']; ?></td>  
17 - </tr>  
18 - <tr>  
19 - <td>File System Root: </td>  
20 - <td><?php echo $server['file_system_root']['value']; ?></td>  
21 - </tr>  
22 - <tr>  
23 - <td>SSL Enabled: </td>  
24 - <td><?php echo $server['ssl_enabled']['value']; ?></td>  
25 - </tr>  
26 -</table>  
27 -  
28 -<h3>Paths and Permissions</h3>  
29 -  
30 -<table>  
31 -<?php  
32 - foreach ($paths as $key => $path){  
33 -?>  
34 - <tr>  
35 - <td><div class='<?php echo $path['class']; ?>'></div></td>  
36 - <td><?php echo $path['name']; ?>:</td>  
37 - <td><?php echo $path['path']; ?></td>  
38 - </tr>  
39 -<?php  
40 - }  
41 -?>  
42 -</table>  
43 -  
44 <form action="index.php?step_name=configuration" method="post"> 1 <form action="index.php?step_name=configuration" method="post">
45 -  
46 -<div class="buttons">  
47 - <!--<input type="submit" onclick="history.back();" name="Back" value="Back"/>  
48 - <input type="submit" name="Back" value="Back"/>-->  
49 - <input type="submit" name="Edit" value="Edit"/>  
50 - <input type="submit" name="Confirm" value="Confirm"/>  
51 -</div> 2 + <p class="title">System Configuration</p>
  3 + <div class="continue_message">
  4 + <?php
  5 + if(!$errors && !$warnings) {
  6 + ?>
  7 + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;All configuration settings are correctly set. Please click next to continue.
  8 + <?php
  9 + }
  10 + ?>
  11 + </div>
  12 + <div class="error_message">
  13 + <?php if($errors) { ?>
  14 + <span class='cross'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Your system is not quite ready to run KnowledgeTree. See the list below to determine which areas you need &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;to address. Once you&rsquo;ve fixed these items, return to this wizard and try again.</span><br/>
  15 + <?php } elseif ($warnings) {
  16 + ?>
  17 + <span class='cross_orange'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KnowledgeTree Optional Dependencies not met, but you will be able to continue.</span><br/>
  18 + <?php
  19 + }?>
  20 + <?php
  21 + if($errors || $warnings) {
  22 + ?>
  23 + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://wiki.knowledgetree.com/Web_Based_Installer#System_Configuration" target="_blank">Click here for help on overcoming configuration issues</a>
  24 + <?php } ?>
  25 + </div>
  26 +
  27 + <div id="step_content_configuration">
  28 + <h3>Server Settings</h3>
  29 + <table>
  30 + <tr>
  31 + <td width="150px">Host: </td>
  32 + <td> <div id="tooltips" title="Location of your web root">&nbsp;</div> </td>
  33 + <td><?php echo $server['host']['value']; ?></td>
  34 + </tr>
  35 + <tr>
  36 + <td>Port: </td>
  37 + <td> <div id="tooltips" title="The port that the web server listens on.">&nbsp;</div> </td>
  38 + <td><?php echo $server['port']['value']; ?></td>
  39 + </tr>
  40 + <tr>
  41 + <td>Root Url: </td>
  42 + <td> <div id="tooltips" title="Relative path to KnowledgeTree Source directory">&nbsp;</div> </td>
  43 + <td><?php echo $server['root_url']['value']; ?></td>
  44 + </tr>
  45 + <tr>
  46 + <td>File System Root: </td>
  47 + <td> <div id="tooltips" title="Absolute path to KnowledgeTree Source directory">&nbsp;</div> </td>
  48 + <td><?php echo $server['file_system_root']['value']; ?></td>
  49 + </tr>
  50 + <tr>
  51 + <td>SSL Enabled: </td>
  52 + <td> <div id="tooltips" title="Whether or not you have SSL installed">&nbsp;</div> </td>
  53 + <td><?php echo $server['ssl_enabled']['value']; ?></td>
  54 + </tr>
  55 + </table>
  56 +
  57 + <h3>Paths and Permissions</h3>
  58 +
  59 + <table class="conf_paths">
  60 + <?php
  61 + foreach ($paths as $key => $path){
  62 + ?>
  63 + <tr>
  64 + <td width="10"><div class='<?php echo $path['class']; ?>'></div></td>
  65 + <td width="22%"><?php echo $path['name']; ?>:</td>
  66 + <td width="50%"><?php echo $path['path']; ?></td>
  67 + <?php if(isset($path['msg'])) { ?>
  68 + <td class="error" width="27%"> <?php echo $path['msg']; ?> </td>
  69 + <td width="10"><a href="javascript:this.location.reload();" class="refresh">Refresh</a></td>
  70 + <?php } else { ?>
  71 + <td class="error" width="27%"> </td>
  72 + <td width="10"> </td>
  73 + <?php } ?>
  74 + </tr>
  75 + <?php
  76 + }
  77 + ?>
  78 + </table>
  79 + <br/>
  80 + </div>
  81 + <input type="submit" name="Edit" value="Edit" class="back"/>
  82 + <input type="submit" name="Confirm" value="Confirm" class="input"/>
52 </form> 83 </form>
53 \ No newline at end of file 84 \ No newline at end of file
setup/wizard/templates/database.tpl
1 -<h1>Confirming Database Configurations</h1> 1 +<form id="dbsettings" action="index.php?step_name=<?php echo $step_name; ?>" method="post" onsubmit="w.onSubmitValidate(<?php if ($silent) echo 'true'; else echo 'false'; ?>);return false;">
  2 +<p class="title">Confirming Database Configurations</p>
2 <!-- Check For immediate Errors --> 3 <!-- Check For immediate Errors -->
3 <span class="error"> <?php if($errors['con']) { echo $errors['con']; } ?> </span> 4 <span class="error"> <?php if($errors['con']) { echo $errors['con']; } ?> </span>
4 -<form id="dbsettings" action="index.php?step_name=<?php echo $step_name; ?>" method="post" onsubmit="w.onSubmitValidate(<?php if ($silent) echo 'true'; else echo 'false'; ?>);return false;">  
5 <!-- Hidden Fields --> 5 <!-- Hidden Fields -->
6 <input type="hidden" id='ddrop' name="ddrop" <?php echo ($ddrop) ? 'CHECKED' : ''; ?>/> 6 <input type="hidden" id='ddrop' name="ddrop" <?php echo ($ddrop) ? 'CHECKED' : ''; ?>/>
7 <input type="hidden" id="sendAll" name="" value="" /> 7 <input type="hidden" id="sendAll" name="" value="" />
@@ -11,6 +11,7 @@ @@ -11,6 +11,7 @@
11 This step configures the connection to the database server and installs the database. The details for an administrative <br/> 11 This step configures the connection to the database server and installs the database. The details for an administrative <br/>
12 user on the database server are required in order to be able to configure and install the installation database. 12 user on the database server are required in order to be able to configure and install the installation database.
13 </div> 13 </div>
  14 + <div id="step_content_database">
14 <table class="dbconf"> 15 <table class="dbconf">
15 <!-- TODO: Different Databases--> 16 <!-- TODO: Different Databases-->
16 <tr><td>Your current database type is: </td> 17 <tr><td>Your current database type is: </td>
@@ -26,53 +27,50 @@ @@ -26,53 +27,50 @@
26 </tr> 27 </tr>
27 <tr> 28 <tr>
28 <td><label for='dname'>Enter a name for the database: </label></td> 29 <td><label for='dname'>Enter a name for the database: </label></td>
29 - <td><input type='text' value="<?php echo $dname?>" id='dname' name='dname' size='40'/></td> 30 + <td><input type='text' value="<?php echo $dname?>" id='dname' name='dname' size='45'/></td>
30 <td id="error" class="error"><?php if($errors['dname']) echo $errors['dname']; ?></td> 31 <td id="error" class="error"><?php if($errors['dname']) echo $errors['dname']; ?></td>
31 </tr> 32 </tr>
32 <tr> 33 <tr>
33 <td><label for='duname'>Enter Database Administrative username: </label></td> 34 <td><label for='duname'>Enter Database Administrative username: </label></td>
34 - <td><input type='text' value="<?php echo $duname?>" id='duname' name='duname' size='40' /></td> 35 + <td><input type='text' value="<?php echo $duname?>" id='duname' name='duname' size='45' /></td>
35 <td id="error" class="error"><?php if($errors['duname']) echo $errors['duname']; ?></td> 36 <td id="error" class="error"><?php if($errors['duname']) echo $errors['duname']; ?></td>
36 </tr> 37 </tr>
37 <tr> 38 <tr>
38 <td><label for='dpassword'>Enter the password for the user: </label></td> 39 <td><label for='dpassword'>Enter the password for the user: </label></td>
39 - <td><input type='password' value="<?php echo $dpassword?>" id='dpassword' name='dpassword' size='40' /></td> 40 + <td><input type='password' value="<?php echo $dpassword?>" id='dpassword' name='dpassword' size='45' /></td>
40 <td id="error" class="error"><?php if($errors['dpassword']) echo $errors['dpassword']; ?></td> 41 <td id="error" class="error"><?php if($errors['dpassword']) echo $errors['dpassword']; ?></td>
41 </tr> 42 </tr>
42 </table> 43 </table>
43 44
44 <div id="options" class="onclick" onclick="javascript:{w.toggleClass('adv_options');}">Advanced Options</div> 45 <div id="options" class="onclick" onclick="javascript:{w.toggleClass('adv_options');}">Advanced Options</div>
45 -  
46 <div id="database" class="adv_options" style="display:none;"> 46 <div id="database" class="adv_options" style="display:none;">
47 <div class="description"> 47 <div class="description">
48 These options are only necessary for some sites. If you're not sure what you should enter here, leave the default settings. 48 These options are only necessary for some sites. If you're not sure what you should enter here, leave the default settings.
49 </div> 49 </div>
50 - <p>  
51 - <label for='dhost'>Host: </label><br />  
52 - <span class="description">The address of the server where the database is located, if different to the current server.</span><br/>  
53 - <input type="text" value="<?php echo $dhost?>" id="dhost" name="dhost" size='60'/>  
54 - </p>  
55 -  
56 - <p>  
57 - <label for='dport'>Port: </label><br />  
58 - <span class="description">The port on which your database server is listening, if it is a non-standard port please enter the number here.</span><br/>  
59 - <input type="text" value="<?php echo $dport?>" id="dport" name="dport" size='10'/>  
60 - </p>  
61 -  
62 - <p>  
63 - <label for='dbbinary'>Socket: </label><br />  
64 - <span class="description">The path to the database binary. If it is not on your system path then please enter it here.</span><br/>  
65 - <input type="text" value="<?php echo $dbbinary?>" id="dbbinary" name="dbbinary" size='60'/>  
66 - </p> 50 + <div class="db_adv_options">
  51 + <div class="adv_option">
  52 + <label for='dhost'>Host: </label><br>
  53 + <span class="description">The address of the server where the database is located, if different to the current server.</span>
  54 + <input type="text" value="<?php echo $dhost?>" id="dhost" name="dhost" size='45' class="textinput"/>
  55 + </div>
  56 + <div class="adv_option">
  57 + <label for='dport'>Port: </label><br>
  58 + <span class="description">The port on which your database server is listening, if it is a non-standard port please enter the number here.</span>
  59 + <input type="text" value="<?php echo $dport?>" id="dport" name="dport" size='10' class="textinput"/>
  60 + </div>
  61 + <div class="adv_option">
  62 + <label for='dport'>Socket: </label><br>
  63 + <span class="description">The path to the database binary. If it is not on your system path then please enter it here.</span> <input type="text" value="<?php echo $dbbinary?>" id="dbbinary" name="dbbinary" size='45' class="textinput"/>
  64 + </div>
  65 + </div>
  66 + </div>
67 </div> 67 </div>
68 - <div class="buttons">  
69 - <input type="submit" name="Previous" value="Previous" /> 68 + <input type="submit" class="back" name="Previous" value="Previous" />
70 <?php if ($silent) { ?> 69 <?php if ($silent) { ?>
71 - <input type="submit" name="Next" value="Next" /> 70 + <input type="submit" class="input" name="Next" value="Next" />
72 <?php } else { ?> 71 <?php } else { ?>
73 - <input type="button" name="Next" value="Next" onclick="javascript:{w.showStep(1, 'n');}"/> 72 + <input type="button" class="input" name="Next" value="Next" onclick="javascript:{w.showStep(1, 'n');}"/>
74 <?php } ?> 73 <?php } ?>
75 - </div>  
76 </div> 74 </div>
77 75
78 <!-- STEP 2 of the database configuration - Admin user password settings --> 76 <!-- STEP 2 of the database configuration - Admin user password settings -->
@@ -99,10 +97,8 @@ An administrative user is required for creating tables within the database. @@ -99,10 +97,8 @@ An administrative user is required for creating tables within the database.
99 </tr> 97 </tr>
100 </table> 98 </table>
101 99
102 - <div class="buttons">  
103 - <input type="button" name="Previous" value="Previous" onclick="javascript:{w.showStep(2, 'p');}"/>  
104 - <input type="button" name="Next" value="Next" onclick="javascript:{w.showStep(2, 'n');}"/>  
105 - </div> 100 + <input type="button" name="Previous" class="back" value="Previous" onclick="javascript:{w.showStep(2, 'p');}"/>
  101 + <input type="button" name="Next" class="input" value="Next" onclick="javascript:{w.showStep(2, 'n');}"/>
106 </div> 102 </div>
107 103
108 <!-- STEP 3 of the database configuration - default user password settings --> 104 <!-- STEP 3 of the database configuration - default user password settings -->
@@ -129,10 +125,7 @@ An second user is required for normal database interaction, the reading and writ @@ -129,10 +125,7 @@ An second user is required for normal database interaction, the reading and writ
129 <td id="error_4_3" class="error" style="display:none">Passwords Do Not Match</td> 125 <td id="error_4_3" class="error" style="display:none">Passwords Do Not Match</td>
130 </tr> 126 </tr>
131 </table> 127 </table>
132 - <div class="buttons">  
133 - <input type="button" name="Previous" value="previous" onclick="javascript:{w.showStep(3, 'p');}"/>  
134 -<!-- <input type="button" name="Next" value="next" onclick="showStep(3, 'n');"/>-->  
135 - <input type="submit" name="Next" value="next" />  
136 - </div> 128 + <input type="button" name="Previous" value="previous" onclick="javascript:{w.showStep(3, 'p');}" class="back"/>
  129 + <input type="submit" name="Next" value="next" class="input"/>
137 </div> 130 </div>
138 </form> 131 </form>
139 \ No newline at end of file 132 \ No newline at end of file
setup/wizard/templates/database_confirm.tpl
1 -<h1>Confirming Database Configurations</h1>  
2 -  
3 -<div class="description">  
4 -Please confirm whether KnowledgeTree has correctly determined your database settings before proceeding.  
5 -</div>  
6 -<!--<div id="section">-->  
7 -  
8 <form action="index.php?step_name=<?php echo $step_name; ?>" method="post"> 1 <form action="index.php?step_name=<?php echo $step_name; ?>" method="post">
9 -<h3><b>Database Settings</b></h3>  
10 -<table width="33%" class="dbconf">  
11 -<?php  
12 -if($dtypes) {  
13 - $type = '';  
14 - foreach($dtypes as $k=>$v) {  
15 - $type = (!$k) ? $v : $type;  
16 - }  
17 - ?>  
18 - <tr>  
19 - <td>Database type: </td>  
20 - <td><?php echo $type; ?></td>  
21 - </tr>  
22 -<?php } ?>  
23 - <tr>  
24 - <td>Name: </td>  
25 - <td><?php echo $dname; ?></td>  
26 - </tr>  
27 - <tr>  
28 - <td>Root Username: </td>  
29 - <td><?php echo $duname; ?></td>  
30 - </tr>  
31 - <tr>  
32 - <td>Root Password: </td>  
33 - <td><?php echo $dpassword; ?></td>  
34 - </tr>  
35 - <?php if($ddrop) { ?>  
36 - <tr>  
37 - <td colspan="2"><b>You are about to drop the database if it exists </b></td>  
38 - </tr>  
39 - <?php } ?>  
40 -</table>  
41 -<!--</div>-->  
42 -<h3><b>Advanced Settings</b></h3>  
43 -  
44 -<table width="35%" class="dbconf">  
45 - <tr>  
46 - <td>Host: </td>  
47 - <td><?php echo $dhost; ?></td>  
48 - </tr>  
49 - <tr>  
50 - <td>Port: </td>  
51 - <td><?php echo $dport; ?></td>  
52 - </tr>  
53 - <tr>  
54 - <td>Mysql Binary: </td>  
55 - <td><?php echo $dbbinary; ?></td>  
56 - </tr>  
57 - <?php if (!$silent) { ?>  
58 - <tr>  
59 - <td><b>Table Prefix: </td>  
60 - <td><?php echo $tprefix; ?></td>  
61 - </tr>  
62 -<?php } ?>  
63 -</table>  
64 -  
65 -<h3><b>Database Users</b></h3>  
66 -  
67 -<table width="35%" class="dbconf">  
68 - <?php //if (!$silent) { ?>  
69 - <tr>  
70 - <td>DMS Admin Username: </td>  
71 - <td><?php echo $dmsname; ?></td>  
72 - </tr>  
73 - <?php //} ?>  
74 - <tr>  
75 - <td>DMS Admin Password: </td>  
76 - <td><?php echo $dmspassword; ?></td>  
77 - </tr>  
78 - <?php //if (!$silent) { ?>  
79 - <tr>  
80 - <td>DMS User Username: </td>  
81 - <td><?php echo $dmsusername; ?></td>  
82 - </tr>  
83 - <?php //} ?>  
84 - <tr>  
85 - <td>DMS User Password: </td>  
86 - <td><?php echo $dmsuserpassword; ?></td>  
87 - </tr>  
88 -</table> 2 +<p class="title">Confirming Database Configurations</p>
89 3
90 -<div class="buttons">  
91 - <input type="submit" name="Edit" value="Edit"/>  
92 - <input type="submit" name="Confirm" value="Confirm"/>  
93 -</div> 4 + <div class="description">
  5 + Please confirm whether KnowledgeTree has correctly determined your database settings before proceeding.
  6 + </div>
  7 + <div id="step_content_database_confirm">
  8 + <h3><b>Database Settings</b></h3>
  9 + <table class="dbconf">
  10 + <?php
  11 + if($dtypes) {
  12 + $type = '';
  13 + foreach($dtypes as $k=>$v) {
  14 + $type = (!$k) ? $v : $type;
  15 + }
  16 + ?>
  17 + <tr>
  18 + <td width="160px">Database Type: </td>
  19 + <td width="150px"> <div id="tooltips" title="Type of database being used.">&nbsp;</div> </td>
  20 + <td><?php echo $type; ?></td>
  21 + </tr>
  22 + <?php } ?>
  23 + <tr>
  24 + <td>Database Name: </td>
  25 + <td> <div id="tooltips" title="Name of the database being created.">&nbsp;</div> </td>
  26 + <td><?php echo $dname; ?></td>
  27 + </tr>
  28 + <tr>
  29 + <td>Root Username: </td>
  30 + <td> <div id="tooltips" title="Root user name of the database.">&nbsp;</div> </td>
  31 + <td><?php echo $duname; ?></td>
  32 + </tr>
  33 + <tr>
  34 + <td>Root Password: </td>
  35 + <td> <div id="tooltips" title="Root user password of the database">&nbsp;</div> </td>
  36 + <td><?php echo $dpassword; ?></td>
  37 + </tr>
  38 + <?php if($ddrop) { ?>
  39 + <tr>
  40 + <td colspan="2"><b>You are about to drop the database if it exists </b></td>
  41 + </tr>
  42 + <?php } ?>
  43 + </table>
  44 + <!--</div>-->
  45 + <h3><b>Advanced Settings</b></h3>
  46 +
  47 + <table class="dbconf">
  48 + <tr>
  49 + <td width="160px">Host: </td>
  50 + <td width="150px"> <div id="tooltips" title="The address of the server where the database is located">&nbsp;</div> </td>
  51 + <td><?php echo $dhost; ?></td>
  52 + </tr>
  53 + <tr>
  54 + <td>Port: </td>
  55 + <td> <div id="tooltips" title="The port on which your database server is listening">&nbsp;</div> </td>
  56 + <td><?php echo $dport; ?></td>
  57 + </tr>
  58 + <tr>
  59 + <td>Mysql Binary: </td>
  60 + <td> <div id="tooltips" title="The path to the database binary">&nbsp;</div> </td>
  61 + <td><?php echo $dbbinary; ?></td>
  62 + </tr>
  63 + <?php if (!$silent) { ?>
  64 + <tr>
  65 + <td><b>Table Prefix: </td>
  66 + <td> <div id="tooltips" title="If needed, a prefix to the database name.">&nbsp;</div> </td>
  67 + <td><?php echo $tprefix; ?></td>
  68 + </tr>
  69 + <?php } ?>
  70 + </table>
  71 +
  72 + <h3><b>Database Users</b></h3>
  73 +
  74 + <table class="dbconf">
  75 + <?php //if (!$silent) { ?>
  76 + <tr>
  77 + <td width="160px">DMS Admin Username: </td>
  78 + <td width="150px"> <div id="tooltips" title="Database Administrative User for KnowledgeTree System">&nbsp;</div> </td>
  79 + <td><?php echo $dmsname; ?></td>
  80 + </tr>
  81 + <?php //} ?>
  82 + <tr>
  83 + <td>DMS Admin Password: </td>
  84 + <td> <div id="tooltips" title="Database Administrative User password">&nbsp;</div> </td>
  85 + <td><?php echo $dmspassword; ?></td>
  86 + </tr>
  87 + <?php //if (!$silent) { ?>
  88 + <tr>
  89 + <td>DMS User Username: </td>
  90 + <td> <div id="tooltips" title="Database User for KnowledgeTree System">&nbsp;</div> </td>
  91 + <td><?php echo $dmsusername; ?></td>
  92 + </tr>
  93 + <?php //} ?>
  94 + <tr>
  95 + <td>DMS User Password: </td>
  96 + <td> <div id="tooltips" title="Database User password">&nbsp;</div> </td>
  97 + <td><?php echo $dmsuserpassword; ?></td>
  98 + </tr>
  99 + </table>
  100 + </div>
  101 + <input type="submit" name="Edit" value="Edit" class="back"/>
  102 + <input type="submit" name="Confirm" value="Confirm" class="input"/>
94 </form> 103 </form>
95 \ No newline at end of file 104 \ No newline at end of file
setup/wizard/templates/dependencies.tpl
1 -<h1>Checking PHP Dependencies</h1>  
2 -  
3 -<p class="description">  
4 -The wizard will review your system to determine whether you have the right PHP components in place to run KnowledgeTree. <br/>  
5 -Once the scan is completed, you&rsquo;ll see whether your system has met the requirements or whether there are areas you need to address.  
6 -</p>  
7 -  
8 -<div class="continue_message">  
9 -<?php  
10 - if(!$errors && $warnings) {  
11 - ?>  
12 - &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Congratulations! Your system is ready to run KnowledgeTree. Click Next to continue.  
13 - <?php  
14 - }  
15 -?>  
16 -</div>  
17 -  
18 -<div class="error_message">  
19 -<?php if($errors) { ?>  
20 - <span class='cross'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Your system is not quite ready to run KnowledgeTree. See the list below to determine which areas you need to address. <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Once you&rsquo;ve fixed these items, return to this wizard and try again.</span><br/>  
21 -<?php } elseif ($warnings) { ?>  
22 - <span class='cross_orange'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KnowledgeTree Optional Dependencies not met, but you will be able to continue.</span><br/>  
23 -<?php } ?>  
24 -  
25 -<?php  
26 - if($errors || $warnings) {  
27 - ?>  
28 - &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://wiki.knowledgetree.com/Web_Based_Installer#PHP_Dependencies" target="_blank">Click here for help on overcoming dependency issues</a>  
29 -<?php } ?>  
30 -</div>  
31 -  
32 -<h3><?php echo "<span class='{$php}'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>"; ?>PHP Version Check</h3>  
33 -<?php if($silent) { ?>  
34 - <div id="options" class="onclick" onclick="javascript:{w.toggleClass('php_details');}">Show Details</div>  
35 - <div class="php_details" style="display:none">  
36 -<?php } ?>  
37 -<p class="description">  
38 -Your version of PHP must be between 5.0 and 5.3.2 to run optimally. Versions higher than 5.3.2 are not recommended.  
39 -</p>  
40 -<?php echo "<span class='{$version['class']}'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>{$version['version']}"; ?>  
41 -<?php if($silent) { ?>  
42 - </div>  
43 -<?php } ?>  
44 -<br />  
45 -<h3><?php echo "<span class='{$php_ext}'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>"; ?>PHP Extensions</h3>  
46 -<?php  
47 -if($silent) { ?>  
48 - <div id="options" class="onclick" onclick="javascript:{w.toggleClass('php_ext_details');}">Show Details</div>  
49 - <div class="php_ext_details" style="display:none">  
50 -<?php } ?>  
51 -<p class="description">  
52 -The extensions shown in red below are required for KnowledgeTree to run optimally. Items shown in yellow are optional, but recommended.  
53 -</p>  
54 -<table>  
55 -<?php  
56 - foreach($extensions as $ext) {  
57 - ?>  
58 -<!-- $row = '<tr>';-->  
59 - <tr> 1 +<form action="index.php?step_name=dependencies" method="post">
  2 + <p class="title">Checking PHP Dependencies</p>
  3 +
  4 + <p class="description">
  5 + The wizard will review your system to determine whether you have the right PHP components in place to run KnowledgeTree. <br/>
  6 + Once the scan is completed, you&rsquo;ll see whether your system has met the requirements or whether there are areas you need to address.
  7 + </p>
  8 +
  9 + <div class="continue_message">
60 <?php 10 <?php
61 - switch($ext['available']){  
62 - case 'yes':  
63 - $class = 'tick';  
64 - break;  
65 - case 'optional':  
66 - $class = 'cross_orange';  
67 - break;  
68 - case 'no':  
69 - default:  
70 - $class = 'cross';  
71 - } 11 + if(!$errors && $warnings) {
  12 + ?>
  13 + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Congratulations! Your system is ready to run KnowledgeTree. Click Next to continue.
  14 + <?php
  15 + }
72 ?> 16 ?>
73 - <td><div class='<?php echo $class; ?>'></div></td>  
74 - <td><?php echo $ext['name']; ?></td>  
75 - <?php echo ($ext['available'] != 'yes') ? "<td>{$ext['details']}</td>" : '<td></td>'; ?>  
76 - <?php echo isset($errors[$ext['extension']]) ? "<td><span class='error'>{$errors[$ext['extension']]}</span></td>" : '<td></td>'; ?>  
77 - <?php  
78 - if ($class == 'orange' || $class == 'cross') {  
79 - ?>  
80 - <td><a href="javascript:this.location.reload();" class="refresh">Refresh</a></td>  
81 - <?php  
82 - }  
83 - ?>  
84 - <?php  
85 - }  
86 -?>  
87 -</table>  
88 -<?php if($silent) { ?>  
89 </div> 17 </div>
90 -<?php } ?>  
91 -<br />  
92 -<h3><?php echo "<span class='{$php_con}'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>"; ?>PHP Configuration</h3>  
93 -<?php  
94 -if($silent) { ?>  
95 - <div id="options" class="onclick" onclick="javascript:{w.toggleClass('php_con_details');}">Show Details</div>  
96 - <div class="php_con_details" style="display:none">  
97 -<?php } ?>  
98 -<p class="description">  
99 -The configurations shown in red below are required for KnowledgeTree to run optimally. Items shown in yellow are optional, but recommended.  
100 -</p>  
101 -<table>  
102 -<tr>  
103 - <th>Setting</th>  
104 - <th>Recommended value</th>  
105 - <th>Current value</th>  
106 -</tr>  
107 -<?php  
108 - foreach($configurations as $config) {  
109 - ?>  
110 - <tr>  
111 - <td><?php echo $config['name']; ?></td>  
112 - <td><?php echo $config['recommended']; ?></td>  
113 - <td class="<?php echo $config['class']; ?>"><?php echo $config['name']; ?></td>  
114 - <?php  
115 - if ($config['class'] == 'orange' || $config['class'] == 'cross') {  
116 - ?>  
117 - <td><a href="javascript:this.location.reload();">Refresh</a></td>  
118 - <?php  
119 - }  
120 - ?>  
121 - </tr> 18 + <div class="error_message">
  19 + <?php if($errors) { ?>
  20 + <span class='cross'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Your system is not quite ready to run KnowledgeTree. See the list below to determine which areas you need &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;to address. Once you&rsquo;ve fixed these items, return to this wizard and try again.</span><br/>
  21 + <?php } elseif ($warnings) { ?>
  22 + <span class='cross_orange'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KnowledgeTree Optional Dependencies are not met, but you will be able to continue.</span><br/>
  23 + <?php } ?>
  24 +
  25 + <?php
  26 + if($errors || $warnings) {
  27 + ?>
  28 + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://wiki.knowledgetree.com/Web_Based_Installer#PHP_Dependencies" target="_blank">Click here for help on overcoming dependency issues</a>
  29 + <?php } ?>
  30 + </div>
  31 + <div id="step_content_dependencies">
  32 + <h3><?php echo "<span class='{$php}'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>"; ?>PHP Version Check</h3>
  33 + <?php if($silent) { ?>
  34 + <div id="options" class="onclick" onclick="javascript:{w.toggleClass('php_details');}">Show Details</div>
  35 + <div class="php_details" style="display:none">
  36 + <?php } ?>
  37 + <p class="description">
  38 + Your version of PHP must be between 5.0 and 5.3.2 to run optimally. Versions higher than 5.3.2 are not recommended.
  39 + </p>
  40 + <?php echo "<span class='{$version['class']}'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>{$version['version']}"; ?>
  41 + <?php if($version['class'] != 'tick') { ?>
  42 + <a href="javascript:this.location.reload();" class="refresh">Refresh</a>
  43 + <?php } ?>
  44 + <?php if($silent) { ?>
  45 + </div>
  46 + <?php } ?>
  47 + <br />
  48 + <h3><?php echo "<span class='{$php_ext}'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>"; ?>PHP Extensions</h3>
122 <?php 49 <?php
123 - }  
124 -?>  
125 -</table>  
126 -<br/>  
127 -B = Bytes, K = Kilobytes, M = Megabytes, G = Gigabytes  
128 -<?php if($silent) { ?> 50 + if($silent) { ?>
  51 + <div id="options" class="onclick" onclick="javascript:{w.toggleClass('php_ext_details');}">Show Details</div>
  52 + <div class="php_ext_details" style="display:none">
  53 + <?php } ?>
  54 + <p class="description">
  55 + The extensions shown in red below are required for KnowledgeTree to run optimally. <br/>Items shown in yellow are optional, but recommended.
  56 + </p>
  57 + <table class="description">
  58 + <?php
  59 + foreach($extensions as $ext) {
  60 + ?>
  61 + <tr>
  62 + <?php
  63 + switch($ext['available']){
  64 + case 'yes':
  65 + $class = 'tick';
  66 + break;
  67 + case 'optional':
  68 + $class = 'cross_orange';
  69 + break;
  70 + case 'no':
  71 + default:
  72 + $class = 'cross';
  73 + }
  74 + ?>
  75 + <td class="ext_indicator"><div class='<?php echo $class; ?>'></div></td>
  76 + <td class="ext_name"><?php echo $ext['name']; ?></td>
  77 + <?php echo ($ext['available'] != 'yes') ? "<td class='ext_description'>{$ext['details']}</td>" : '<td></td>'; ?>
  78 + <?php echo isset($errors[$ext['extension']]) ? "<td class='ext_error'><span class='error'>{$errors[$ext['extension']]}</span></td>" : '<td></td>'; ?>
  79 + <?php
  80 + if ($class == 'orange' || $class == 'cross') {
  81 + ?>
  82 + <td class="ext_refresh"><a href="javascript:this.location.reload();" class="refresh">Refresh</a></td>
  83 + <?php
  84 + }
  85 + ?>
  86 + <?php
  87 + }
  88 + ?>
  89 + </table>
  90 + <?php if($silent) { ?>
  91 + </div>
  92 + <?php } ?>
  93 + <br />
  94 + <h3><?php echo "<span class='{$php_con}'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>"; ?>PHP Configuration</h3>
  95 + <?php
  96 + if($silent) { ?>
  97 + <div id="options" class="onclick" onclick="javascript:{w.toggleClass('php_con_details');}">Show Details</div>
  98 + <div class="php_con_details" style="display:none">
  99 + <?php } ?>
  100 + <p class="description">
  101 + The configurations shown in red below are required for KnowledgeTree to run optimally. Items shown in yellow are optional, but recommended.
  102 + </p>
  103 + <table class="description">
  104 + <tr>
  105 + <th>Setting</th>
  106 + <th>Recommended value</th>
  107 + <th>Current value</th>
  108 + </tr>
  109 + <?php
  110 + foreach($configurations as $config) {
  111 + ?>
  112 + <tr>
  113 + <td class="dir_name"><?php echo $config['name']; ?></td>
  114 + <td class="dir_description"><?php echo $config['recommended']; ?></td>
  115 + <td class="<?php echo $config['class']; ?>"><?php echo $config['name']; ?></td>
  116 + <?php
  117 + if ($config['class'] == 'orange' || $config['class'] == 'cross') {
  118 + ?>
  119 + <td class="ext_refresh"><a href="javascript:this.location.reload();">Refresh</a></td>
  120 + <?php
  121 + }
  122 + ?>
  123 + </tr>
  124 + <?php
  125 + }
  126 + ?>
  127 + </table>
  128 + <br/>
  129 + B = Bytes, K = Kilobytes, M = Megabytes, G = Gigabytes
  130 + <?php if($silent) { ?>
  131 + </div>
  132 + <?php } ?>
129 </div> 133 </div>
130 -<?php } ?>  
131 -<form action="index.php?step_name=dependencies" method="post">  
132 -<div class="buttons">  
133 - <input type="submit" name="Previous" value="Back"/>  
134 - <input type="submit" name="Next" value="Next"/>  
135 -</div> 134 + <input type="submit" class="back" name="Previous" value="Back"/>
  135 + <input type="submit" class="input" name="Next" value="Next"/>
136 </form> 136 </form>
137 \ No newline at end of file 137 \ No newline at end of file
setup/wizard/templates/error.tpl
1 <head> 1 <head>
2 - <title>KnowledgeTree Installer</title>  
3 - <script type="text/javascript" src="resources/wizard.js"></script>  
4 - <link rel="stylesheet" type="text/css" href="resources/wizard.css"> 2 + <title>KnowledgeTree Installer</title>
  3 + <script type="text/javascript" src="resources/wizard.js"></script>
  4 + <link rel="stylesheet" type="text/css" href="resources/wizard.css">
5 </head><body onload="w.doFormCheck();"> 5 </head><body onload="w.doFormCheck();">
6 <div id="outer-wrapper"> 6 <div id="outer-wrapper">
7 <div id="header"> 7 <div id="header">
8 <div class="logo"></div> 8 <div class="logo"></div>
9 </div> 9 </div>
10 -  
11 <div id="wrapper"> 10 <div id="wrapper">
12 <div id="container"> 11 <div id="container">
13 <div id="content"> 12 <div id="content">
14 - <h1>Welcome to the KnowledgeTree Setup Wizard</h1>  
15 -  
16 -<div style="width: 800px;">  
17 -<?php if(isset($error)) echo '';echo "<div class='error'>".$error."</div>"; ?>  
18 -<?php  
19 -if(isset($errors)) {  
20 - if($errors){  
21 - echo '<div class="error">';  
22 - foreach ($errors as $msg){  
23 - echo $msg . "<br />\n";  
24 - }  
25 - echo '</div>';  
26 - }  
27 -}  
28 -?>  
29 -</div>  
30 -  
31 -<form action="index.php?step_name=welcome" method="post">  
32 -<div class="buttons">  
33 -</div>  
34 -</form> </div>  
35 - </div>  
36 - 13 + <form action="index.php?step_name=welcome" method="post">
  14 + <p class="title">Welcome to the KnowledgeTree Setup Wizard</p>
  15 + <div style="width: 800px;">
  16 + <?php if(isset($error)) echo '';echo "<div class='error'>".$error."</div>"; ?>
  17 + <?php
  18 + if(isset($errors)) {
  19 + if($errors){
  20 + echo '<div class="error">';
  21 + foreach ($errors as $msg){
  22 + echo $msg . "<br />\n";
  23 + }
  24 + echo '</div>';
  25 + }
  26 + }
  27 + ?>
  28 + </div>
  29 + </form>
  30 + </div>
  31 + </div>
37 <div id="sidebar"> 32 <div id="sidebar">
38 - <div class="menu"><span class="active">Welcome</span><br><span class="inactive">License Agreement</span><br><span class="inactive">PHP Dependencies</span><br><span class="inactive">System Configuration</span><br><span class="inactive">Service Dependencies</span><br><span class="inactive">Database Configuration</span><br><span class="inactive">Registration</span><br><span class="inactive">Install</span><br><span class="inactive">Complete</span><br></div> </div> 33 + <div class="menu">
  34 + <span class="active">Welcome</span><br>
  35 + <span class="inactive">License Agreement</span><br>
  36 + <span class="inactive">PHP Dependencies</span><br>
  37 + <span class="inactive">System Configuration</span><br>
  38 + <span class="inactive">Service Dependencies</span><br>
  39 + <span class="inactive">Database Configuration</span><br>
  40 + <span class="inactive">Registration</span><br>
  41 + <span class="inactive">Install</span><br>
  42 + <span class="inactive">Complete</span><br>
  43 + </div>
  44 + </div>
39 <div class="clearing">&nbsp;</div> 45 <div class="clearing">&nbsp;</div>
40 </div> 46 </div>
41 -  
42 <div id="footer"> 47 <div id="footer">
43 <div class="powered-by"></div> 48 <div class="powered-by"></div>
44 </div> 49 </div>
setup/wizard/templates/errors.tpl
1 -<h1>Welcome to the KnowledgeTree Setup Wizard</h1> 1 +<p class="title">Welcome to the KnowledgeTree Setup Wizard</p>
2 2
3 <div style="width: 800px;"> 3 <div style="width: 800px;">
4 <?php if(isset($error)) echo $error; ?> 4 <?php if(isset($error)) echo $error; ?>
setup/wizard/templates/install.tpl
1 -<h1>Finalizing System Installation</h1>  
2 -  
3 -<p class="description">  
4 -The wizard will now complete the installation and run a final check on the system.  
5 -</p>  
6 -  
7 <form action="index.php?step_name=install" method="post"> 1 <form action="index.php?step_name=install" method="post">
8 - <div class="buttons">  
9 - <input type="submit" name="Previous" value="Previous"/>  
10 - <input type="submit" name="Install" value="Install"/>  
11 - </div> 2 + <p class="title">Finalizing System Installation</p>
  3 +
  4 + <div id="step_content">
  5 + The wizard will now complete the installation and run a final check on the system.
  6 + </div>
  7 + <input type="submit" name="Previous" value="Previous" class="back"/>
  8 + <input type="submit" name="Install" value="Install" class="input"/>
12 </form> 9 </form>
13 \ No newline at end of file 10 \ No newline at end of file
setup/wizard/templates/registration.tpl
1 -<form action="index.php?step_name=registration" method="post">  
2 -<h1>Registering KnowledgeTree</h1>  
3 -  
4 -<p>  
5 -Register with KnowledgeTree to receive important product updates. We respect your privacy and will not share your information with third parties. For more information, please refer to our Privacy and Data Retention Policies.  
6 -<a href="index.php?step_name=install">Skip Registration</a>  
7 -</p>  
8 -  
9 -<p class='disclaimer'>  
10 -We will not share your information with 3rd-parties, nor will we send you information not directly related to KnowledgeTree's products  
11 -and services. Please see our <a href="http://www.knowledgetree.com/about/legal" target="_blank">Privacy and Data Retention policies</a> for more information.  
12 -</p>  
13 -  
14 -<p>  
15 -  
16 -<table>  
17 - <tr>  
18 - <td><label for='first'>First Name</label></td>  
19 - <td rowspan='6' width='5%'>&nbsp;</td>  
20 - <td><input name='submitted[first_name]' id='first' size='37' /></td>  
21 - <td rowspan='6' width='5%'>&nbsp;</td>  
22 - <td rowspan='6'>  
23 - <img src='resources/graphics/dropbox.png' width="100%" height="100%"/>  
24 - </td>  
25 - </tr>  
26 - <tr>  
27 - <td><label for='last'>Last Name</label></td>  
28 - <td><input name='submitted[last_name]' id='last' size='37' /></td>  
29 - </tr>  
30 - <tr>  
31 - <td><label for='email'>Email Address</label></td>  
32 - <td><input name='submitted[email_address]' id='email' size='37' /></td>  
33 - </tr>  
34 - <tr>  
35 - <td><label for='country'>Country</label></td>  
36 - <td>  
37 - <select id='country' name='submitted[country]'>  
38 - <?php  
39 - $str = '';  
40 - foreach ($countries as $code => $country) {  
41 - $str .= "<option name='{$code}' value='{$country}'>{$country}</option>";  
42 - }  
43 -  
44 - echo $str;  
45 - ?>  
46 - </select>  
47 - </td>  
48 - </tr>  
49 - <tr>  
50 - <td><label for='industry'>Industry</label></td>  
51 - <td>  
52 - <select id='industry' name='submitted[industry]'>  
53 - <?php  
54 - $str = '';  
55 - foreach ($industries as $code => $industry) {  
56 - $str .= "<option name='{$code}' value='{$industry}'>{$industry}</option>";  
57 - }  
58 -  
59 - echo $str;  
60 - ?>  
61 - </select>  
62 - </td>  
63 - </tr>  
64 - <tr>  
65 - <td><label for='size'>Organization Size</label></td>  
66 - <td>  
67 - <select id='size' name='submitted[organization_size]'>  
68 - <?php  
69 - $str = '';  
70 - foreach ($org_size as $code => $size) {  
71 - $str .= "<option name='{$code}' value='{$size}'>{$size}</option>";  
72 - }  
73 -  
74 - echo $str;  
75 - ?>  
76 - </select>  
77 - </td>  
78 - </tr>  
79 -</table>  
80 -</p>  
81 -  
82 -<input type='hidden' name='form_id' value='webform_client_form_242' />  
83 -<input type='hidden' name='op' value='Submit' />  
84 -  
85 -  
86 -<div class="buttons">  
87 - <input type="submit" name="Previous" value="Previous"/>  
88 - <input type="submit" name="Next" value="Register"/>  
89 -</div> 1 +<form id="registration" action="index.php?step_name=<?php echo $step_name; ?>" method="post" onsubmit="w.validateRegistration();return false;">
  2 + <p class="title">Registering KnowledgeTree</p>
  3 +
  4 + <p class="description">
  5 + Register with KnowledgeTree to receive important product updates. We respect your privacy and will not share your information with third parties. For more information, please refer to our Privacy and Data Retention Policies.
  6 + <a href="index.php?step_name=install">Skip Registration</a>
  7 + </p>
  8 + <!-- Hidden Fields -->
  9 + <input type="hidden" id="sendAll" name="" value="" />
  10 + <input type="hidden" id="state" name="" />
  11 + <p class='disclaimer'>
  12 + We will not share your information with 3rd-parties, nor will we send you information not directly related to KnowledgeTree's products
  13 + and services. Please see our <a href="http://www.knowledgetree.com/about/legal" target="_blank">Privacy and Data Retention policies</a> for more information.
  14 + </p>
  15 + <br/>
  16 + <div id="step_content_registration">
  17 + <span class="error" id="reg_error"></span>
  18 + <table>
  19 + <tr>
  20 + <td><label for='first'>First Name</label></td>
  21 + <td rowspan='6' width='5%'>&nbsp;</td>
  22 + <td><input name='submitted[first_name]' id='first' size='37' /></td>
  23 + <td rowspan='6' width='5%'>&nbsp;</td>
  24 + <td rowspan='6'> <img src='resources/graphics/dropbox.png'/> </td>
  25 + </tr>
  26 +
  27 + <tr>
  28 + <td><label for='last'>Last Name</label></td>
  29 + <td><input name='submitted[last_name]' id='last' size='37' /></td>
  30 + </tr>
  31 + <tr>
  32 + <td><label for='email'>Email Address</label></td>
  33 + <td><input name='submitted[email_address]' id='email' size='37' /></td>
  34 + </tr>
  35 + <tr>
  36 + <td><label for='country'>Country</label></td>
  37 + <td>
  38 + <select id='country' name='submitted[country]'>
  39 + <?php
  40 + $str = '';
  41 + foreach ($countries as $code => $country) {
  42 + $str .= "<option name='{$code}' value='{$country}'>{$country}</option>";
  43 + }
  44 +
  45 + echo $str;
  46 + ?>
  47 + </select>
  48 + </td>
  49 + </tr>
  50 + <tr>
  51 + <td><label for='industry'>Industry</label></td>
  52 + <td>
  53 + <select id='industry' name='submitted[industry]'>
  54 + <?php
  55 + $str = '';
  56 + foreach ($industries as $code => $industry) {
  57 + $str .= "<option name='{$code}' value='{$industry}'>{$industry}</option>";
  58 + }
  59 +
  60 + echo $str;
  61 + ?>
  62 + </select>
  63 + </td>
  64 + </tr>
  65 + <tr>
  66 + <td><label for='size'>Organization Size</label></td>
  67 + <td>
  68 + <select id='size' name='submitted[organization_size]'>
  69 + <?php
  70 + $str = '';
  71 + foreach ($org_size as $code => $size) {
  72 + $str .= "<option name='{$code}' value='{$size}'>{$size}</option>";
  73 + }
  74 +
  75 + echo $str;
  76 + ?>
  77 + </select>
  78 + </td>
  79 + </tr>
  80 + </table>
  81 +
  82 + <input type='hidden' name='form_id' value='webform_client_form_242' />
  83 + <input type='hidden' name='op' value='Submit' />
  84 + </div>
  85 +
  86 + <input type="submit" name="Previous" value="Previous" class="back" onclick="w.pClick()"/>
  87 + <input type="submit" name="Next" value="Register" class="input" onclick="w.nClick()"/>
90 </form> 88 </form>
91 \ No newline at end of file 89 \ No newline at end of file
setup/wizard/templates/registration_confirm.tpl
1 -<h1>Thank you for registering</h1>  
2 -  
3 -<p>  
4 -Thank you for signing up. You'll receive an email from us shortly with download instructions for the KnowledgeTree Drop Box software.  
5 -</p>  
6 -  
7 <form action="index.php?step_name=registration" method="post"> 1 <form action="index.php?step_name=registration" method="post">
8 -  
9 -<div class="buttons">  
10 - <input type="submit" name="Previous" value="Previous"/>  
11 - <input type="submit" name="Confirm" value="Next"/>  
12 -</div> 2 + <p class="title">Thank you for registering</p>
  3 + <div id="step_content_registration_confirm">
  4 + Thank you for signing up. You'll receive an email from us shortly with download instructions for the KnowledgeTree Drop Box software.
  5 + </div>
  6 + <input type="submit" name="Previous" value="Previous" class="back"/>
  7 + <input type="submit" name="Confirm" value="Next" class="input"/>
13 </form> 8 </form>
14 \ No newline at end of file 9 \ No newline at end of file
setup/wizard/templates/services.tpl
1 <form action="index.php?step_name=services" method="post"> 1 <form action="index.php?step_name=services" method="post">
2 -<h1>Checking Service Dependencies</h1>  
3 -  
4 -<p class="description">  
5 -The wizard will review your system to determine whether you can run KnowledgeTree background services. <br/>Once the scan is completed, you&rsquo;ll see whether your system has met the requirements or whether there are areas you need to address.  
6 -</p>  
7 -  
8 -<div class="continue_message">  
9 -<?php  
10 - if(!$errors && !$warnings) { 2 + <p class="title">Checking Service Dependencies</p>
  3 +
  4 + <p class="description">
  5 + The wizard will review your system to determine whether you can run KnowledgeTree background services. <br/>Once the scan is completed, you&rsquo;ll see whether your system has met the requirements or whether there are areas you need to address.
  6 + </p>
  7 +
  8 + <div class="continue_message">
  9 + <?php
  10 + if(!$errors && !$warnings) {
  11 + ?>
  12 + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;All service dependencies are met. Please click next to continue.
  13 + <?php
  14 + }
  15 + ?>
  16 + </div>
  17 + <div class="error_message">
  18 + <?php if($errors) { ?>
  19 + <span class='cross'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Your system is not quite ready to run KnowledgeTree. See the list below to determine which areas you need &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;to address. Once you&rsquo;ve fixed these items, return to this wizard and try again.</span><br/>
  20 + <?php } elseif ($warnings) {
11 ?> 21 ?>
12 - &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;All service dependencies are met. Please click next to continue. 22 + <span class='cross_orange'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KnowledgeTree Optional Dependencies not met, but you will be able to continue.</span><br/>
13 <?php 23 <?php
14 - }  
15 -?>  
16 -</div>  
17 -<div class="error_message">  
18 -<?php if($errors) { ?>  
19 - <span class='cross'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Your system is not quite ready to run KnowledgeTree. See the list below to determine which areas you need to address. <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Once you&rsquo;ve fixed these items, return to this wizard and try again.</span><br/>  
20 -<?php } elseif ($warnings) {  
21 - ?>  
22 - <span class='cross_orange'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KnowledgeTree Optional Dependencies not met, but you will be able to continue.</span><br/> 24 + }?>
23 <?php 25 <?php
24 -}?>  
25 -<?php  
26 - if($errors || $warnings) {  
27 - ?>  
28 - &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://wiki.knowledgetree.com/Web_Based_Installer#Service_Dependencies" target="_blank">Click here for help on overcoming dependency issues</a>  
29 -<?php } ?>  
30 -</div>  
31 -  
32 -<?php if(!$alreadyInstalled) { ?>  
33 - <?php if($javaExeError != '') { ?>  
34 - Specify the location of your Java executable  
35 - &nbsp;&nbsp;&nbsp;  
36 - <input name='java' id='port' size='25' value='<?php echo $java['location']; ?>'/>  
37 - &nbsp;&nbsp;&nbsp;  
38 - <?php if($javaExeError != true) { ?><span class="error"><?php echo $javaExeError; ?></span><?php } ?> 26 + if($errors || $warnings) {
  27 + ?>
  28 + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://wiki.knowledgetree.com/Web_Based_Installer#Service_Dependencies" target="_blank">Click here for help on overcoming service issues</a>
39 <?php } ?> 29 <?php } ?>
40 - <?php if($phpExeError != '') { ?>  
41 - <br />  
42 - Specify the location of your PHP executable  
43 - <br />  
44 - <?php if($php['location'] == '') { ?>  
45 - <input name='php' id='port' size='25' value='<?php echo $php['location']; ?>'/> 30 + </div>
  31 + <div id="step_content_configuration" style="width:755px;">
  32 + <?php if(!$alreadyInstalled) { ?>
  33 + <?php if($javaExeError != '') { ?>
  34 + Specify the location of your Java executable
  35 + &nbsp;&nbsp;&nbsp;
  36 + <input name='java' id='port' size='25' value='<?php echo $java['location']; ?>' style="float:none;"/>
  37 + &nbsp;&nbsp;&nbsp;
  38 + <?php if($javaExeError != true) { ?><span class="error"><?php echo $javaExeError; ?></span><?php } ?>
  39 + <?php } ?>
  40 + <?php if($phpExeError != '') { ?>
  41 + <br />
  42 + Specify the location of your PHP executable
  43 + <br />
  44 + <?php if($php['location'] == '') { ?>
  45 + <input name='php' id='port' size='25' value='<?php echo $php['location']; ?>'/>
  46 + <?php } else { ?>
  47 + <input type="hidden" name='php' id='port' size='25' value='<?php echo $php['location']; ?>'/>
  48 + <?php } ?>
  49 + &nbsp;&nbsp;&nbsp;
  50 + <?php if($phpExeError != true) { ?><span class="error"><?php echo $phpExeError; ?></span><?php } ?>
  51 + <?php } ?>
  52 + <?php if($javaExeError != '' || $phpExeError != '') { ?>
  53 + <input type="submit" name="Refresh" value="Submit" style="float:none;"/>
  54 + <?php } ?>
  55 + <h3><?php echo "<span class='{$javaCheck}'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>"; ?>Java Check</h3>
  56 + <?php if($silent) { ?>
  57 + <div id="options" class="onclick" onclick="javascript:{w.toggleClass('java_details');}">Show Details</div>
  58 + <div class="java_details" style="display:none">
  59 + <?php } ?>
  60 + <p class="description">
  61 + The Java version must be higher than 1.5.
  62 + </p>
  63 + <table>
  64 + <tr>
  65 + <td> <span class='<?php echo $step_vars['java']['class']; ?>'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> </td>
  66 + <td style="width:645px;"> <?php echo $step_vars['java']['found']; ?> </td>
  67 + <?php
  68 + if ($step_vars['java']['class'] != 'tick') {
  69 + ?>
  70 + <td><a href="javascript:this.location.reload();" class="refresh">Refresh</a></td>
  71 + <?php
  72 + } else { ?>
  73 + <td> </td>
  74 + <?php } ?>
  75 + </tr>
  76 + <tr>
  77 + <td> <span class='<?php echo $step_vars['version']['class']; ?>'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> </td>
  78 + <td> <?php echo $step_vars['version']['found']; ?> </td>
  79 + <?php if ($step_vars['version']['class'] != 'tick') {
  80 + ?>
  81 + <td><a href="javascript:this.location.reload();" class="refresh">Refresh</a></td>
  82 + <?php
  83 + }
  84 + ?>
  85 + </tr>
  86 + </table>
  87 + <?php if($silent) { ?>
  88 + </div>
  89 + <?php } ?>
  90 + <?php if (!$disableExtension) { ?>
  91 + <h3><?php echo "<span class='{$javaExtCheck}'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>"; ?>Java Extensions</h3>
  92 + <?php if($silent) { ?>
  93 + <div id="options" class="onclick" onclick="javascript:{w.toggleClass('java_ext_details');}">Show Details</div>
  94 + <div class="java_ext_details" style="display:none">
  95 + <?php } ?>
  96 + <p class="description">
  97 + A PHP Java Bridge is required for KnowledgeTree to perform at an optimal level.
  98 + </p>
  99 + <table>
  100 + <tr>
  101 + <td> <span class='<?php echo $step_vars['extensions']['class']; ?>'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> </td>
  102 + <td style="width:645px;"> <?php echo $step_vars['extensions']['found']; ?> </td>
  103 + <?php if ($step_vars['extensions']['class'] != 'tick') {
  104 + ?>
  105 + <td><a href="javascript:this.location.reload();" class="refresh">Refresh</a></td>
  106 + <?php
  107 + }
  108 + ?>
  109 + </tr>
  110 + </table>
  111 + <?php //echo "<span class='{$step_vars['extensions']['class']}'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>{$step_vars['extensions']['found']}"; ?>
  112 + <!-- <br />-->
  113 + <?php if($silent) { ?>
  114 + </div>
  115 + <?php } ?>
  116 + <?php } ?>
46 <?php } else { ?> 117 <?php } else { ?>
47 - <input type="hidden" name='php' id='port' size='25' value='<?php echo $php['location']; ?>'/> 118 + <p class="description">
  119 + All services are already installed.
  120 + </p>
48 <?php } ?> 121 <?php } ?>
49 - &nbsp;&nbsp;&nbsp;  
50 - <?php if($phpExeError != true) { ?><span class="error"><?php echo $phpExeError; ?></span><?php } ?>  
51 - <?php } ?>  
52 - <?php if($javaExeError != '' || $phpExeError != '') { ?>  
53 - <input type="submit" name="Refresh" value="Submit"/>  
54 - <?php } ?>  
55 - <h3><?php echo "<span class='{$javaCheck}'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>"; ?>Java Check</h3>  
56 - <?php if($silent) { ?>  
57 - <div id="options" class="onclick" onclick="javascript:{w.toggleClass('java_details');}">Show Details</div>  
58 - <div class="java_details" style="display:none">  
59 - <?php } ?>  
60 - <p class="description">  
61 - The Java version must be higher than 1.5.  
62 - </p>  
63 - <table>  
64 - <tr>  
65 - <td> <span class='<?php echo $step_vars['java']['class']; ?>'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> </td>  
66 - <td> <?php echo $step_vars['java']['found']; ?> </td>  
67 - <?php if ($step_vars['java']['class'] != 'tick') {  
68 - ?>  
69 - <td><a href="javascript:this.location.reload();" class="refresh">Refresh</a></td>  
70 - <?php  
71 - }  
72 - ?>  
73 - </tr>  
74 - <tr>  
75 - <td> <span class='<?php echo $step_vars['version']['class']; ?>'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> </td>  
76 - <td> <?php echo $step_vars['version']['found']; ?> </td>  
77 - <?php if ($step_vars['version']['class'] != 'tick') {  
78 - ?>  
79 - <td><a href="javascript:this.location.reload();" class="refresh">Refresh</a></td>  
80 - <?php  
81 - }  
82 - ?>  
83 - </tr>  
84 - </table>  
85 - <?php if($silent) { ?>  
86 - </div>  
87 - <?php } ?>  
88 - <?php if (!$disableExtension) { ?>  
89 - <h3><?php echo "<span class='{$javaExtCheck}'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>"; ?>Java Extensions</h3> 122 + <h3><?php echo "<span class='{$serviceCheck}'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>"; ?>Services Check</h3>
90 <?php if($silent) { ?> 123 <?php if($silent) { ?>
91 - <div id="options" class="onclick" onclick="javascript:{w.toggleClass('java_ext_details');}">Show Details</div>  
92 - <div class="java_ext_details" style="display:none"> 124 + <div id="options" class="onclick" onclick="javascript:{w.toggleClass('service_details');}">Show Details</div>
  125 + <div class="service_details" style="display:none">
93 <?php } ?> 126 <?php } ?>
94 <p class="description"> 127 <p class="description">
95 - A PHP Java Bridge is required for KnowledgeTree to perform at an optimal level. 128 + Preload Services if posibble.
96 </p> 129 </p>
97 <table> 130 <table>
98 - <tr>  
99 - <td> <span class='<?php echo $step_vars['extensions']['class']; ?>'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> </td>  
100 - <td> <?php echo $step_vars['extensions']['found']; ?> </td>  
101 - <?php if ($step_vars['extensions']['class'] != 'tick') {  
102 - ?>  
103 - <td><a href="javascript:this.location.reload();" class="refresh">Refresh</a></td>  
104 - <?php  
105 - }  
106 - ?>  
107 - </tr> 131 + <?php
  132 + if($step_vars) {
  133 + if(isset($step_vars['services'])) {
  134 + foreach ($step_vars['services'] as $ser){
  135 + ?>
  136 + <tr>
  137 + <td> <span class='<?php echo $ser['class']; ?>'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> </td>
  138 + <td style="width:645px;"> <?php echo $ser['msg']; ?> </td>
  139 + <?php if ($ser['class'] != 'tick') {
  140 + ?>
  141 + <td><a href="javascript:this.location.reload();" class="refresh">Refresh</a></td>
  142 + <?php
  143 + } ?>
  144 + </tr>
  145 + <?php
  146 + }
  147 + }
  148 + }
  149 + ?>
108 </table> 150 </table>
109 - <?php //echo "<span class='{$step_vars['extensions']['class']}'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>{$step_vars['extensions']['found']}"; ?>  
110 -<!-- <br />-->  
111 <?php if($silent) { ?> 151 <?php if($silent) { ?>
112 </div> 152 </div>
113 <?php } ?> 153 <?php } ?>
114 - <?php } ?>  
115 -<?php } else { ?>  
116 - <p class="description">  
117 - All services are already installed.  
118 - </p>  
119 -<?php } ?>  
120 -<h3><?php echo "<span class='{$serviceCheck}'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>"; ?>Services Check</h3>  
121 -<?php if($silent) { ?>  
122 - <div id="options" class="onclick" onclick="javascript:{w.toggleClass('service_details');}">Show Details</div>  
123 - <div class="service_details" style="display:none">  
124 -<?php } ?>  
125 -<p class="description">  
126 -Preload Services if posibble.  
127 -</p>  
128 -<table>  
129 -<?php  
130 -if($step_vars) {  
131 - if(isset($step_vars['services'])) {  
132 - foreach ($step_vars['services'] as $ser){  
133 - ?>  
134 - <tr>  
135 - <td> <span class='<?php echo $ser['class']; ?>'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> </td>  
136 - <td> <?php echo $ser['msg']; ?> </td>  
137 - <?php if ($ser['class'] != 'tick') {  
138 - ?>  
139 - <td><a href="javascript:this.location.reload();" class="refresh">Refresh</a></td>  
140 - <?php  
141 - } ?>  
142 - </tr>  
143 - <?php  
144 - }  
145 - }  
146 -}  
147 -?>  
148 -</table>  
149 -<?php if($silent) { ?>  
150 </div> 154 </div>
151 -<?php } ?>  
152 -<div class="buttons">  
153 - <input type="submit" name="Previous" value="Back"/>  
154 - <input type="submit" name="Next" value="Next"/>  
155 -</div> 155 + <input type="submit" class="back" name="Previous" value="Back"/>
  156 + <input type="submit" class="input" name="Next" value="Next"/>
156 </form> 157 </form>
157 \ No newline at end of file 158 \ No newline at end of file
setup/wizard/templates/welcome.tpl
1 <form action="index.php?step_name=welcome" method="post"> 1 <form action="index.php?step_name=welcome" method="post">
2 -<p class="title">Welcome to KnowledgeTree</p>  
3 -  
4 -<div id="step_content">  
5 -<p>  
6 -This wizard will lead you through the steps needed to install and configure KnowledgeTree on your server.  
7 -</p>  
8 -</div>  
9 -  
10 -<!--<div class="buttons" id="buttons_single">-->  
11 - <input class="next" type="submit" name="Next" value="Next"/>  
12 -<!--</div>--> 2 + <p class="title">Welcome to KnowledgeTree</p>
  3 + <div id="step_content">
  4 + <p> This wizard will lead you through the steps needed to install and configure KnowledgeTree on your server. </p>
  5 + </div>
  6 + <input class="next" type="submit" name="Next" value="Next"/>
13 </form> 7 </form>
14 \ No newline at end of file 8 \ No newline at end of file
setup/wizard/templates/wizard.tpl
@@ -2,22 +2,24 @@ @@ -2,22 +2,24 @@
2 <html> 2 <html>
3 <head> 3 <head>
4 <title>KnowledgeTree Installer</title> 4 <title>KnowledgeTree Installer</title>
5 -<!-- <script type="text/javascript" src="resources/jquery-tooltip/lib/jquery.js"></script>-->  
6 -<!-- <script type="text/javascript" src="resources/jquery-tooltip/lib/jquery.bgiframe.js"></script>-->  
7 -<!-- <script type="text/javascript" src=".resources/jquery-tooltip/lib/jquery.dimensions.js"></script>-->  
8 -<!-- <script type="text/javascript" src="resources/jquery-tooltip/lib/jquery.tooltip.js"></script>--> 5 + <script type="text/javascript" src="resources/jquery-tooltip/lib/jquery.js"></script>
9 <script type="text/javascript" src="resources/wizard.js" ></script> 6 <script type="text/javascript" src="resources/wizard.js" ></script>
10 <link rel="stylesheet" type="text/css" href="resources/wizard.css" /> 7 <link rel="stylesheet" type="text/css" href="resources/wizard.css" />
11 8
12 </head> 9 </head>
13 <body onload="w.doFormCheck();"> 10 <body onload="w.doFormCheck();">
14 <div id="outer-wrapper"> 11 <div id="outer-wrapper">
15 - <div id="header"></div>  
16 - 12 + <div id="header">
  13 + <div id="logo"><img src="resources/graphics/dame/installer-header_logo.png"/></div>
  14 + <div id="install_details">
  15 + <span style="font-size:120%;"> <?php echo $vars['install_version']; ?> </span><br>
  16 + <span style="font-size:80%;"><?php echo $vars['install_type']; ?></span>
  17 + </div>
  18 + </div>
17 <div id="wrapper"> 19 <div id="wrapper">
18 <div id="container"> 20 <div id="container">
19 <div id="sidebar"> 21 <div id="sidebar">
20 - <?php echo $left; ?> 22 + <?php echo $vars['left']; ?>
21 </div> 23 </div>
22 <div id="content"> 24 <div id="content">
23 <div id="content_container"> 25 <div id="content_container">
tests/ktcmis/testCmisApi.php
@@ -3,7 +3,10 @@ @@ -3,7 +3,10 @@
3 // TODO use CMISUtil::encodeObjectId to create testing ids, as we may change how the encoding works in future 3 // TODO use CMISUtil::encodeObjectId to create testing ids, as we may change how the encoding works in future
4 4
5 require_once (KT_DIR . '/tests/test.php'); 5 require_once (KT_DIR . '/tests/test.php');
6 -require_once (KT_LIB_DIR . '/api/ktcmis/ktcmis.inc.php'); 6 +require_once (KT_LIB_DIR . '/api/ktcmis/ktNavigationService.inc.php');
  7 +require_once (KT_LIB_DIR . '/api/ktcmis/ktObjectService.inc.php');
  8 +require_once (KT_LIB_DIR . '/api/ktcmis/ktRepositoryService.inc.php');
  9 +require_once (KT_LIB_DIR . '/api/ktcmis/ktVersioningService.inc.php');
7 10
8 // username and password for authentication 11 // username and password for authentication
9 // must be set correctly for all of the tests to pass in all circumstances 12 // must be set correctly for all of the tests to pass in all circumstances
@@ -63,7 +66,7 @@ class CMISTestCase extends KTUnitTestCase { @@ -63,7 +66,7 @@ class CMISTestCase extends KTUnitTestCase {
63 } 66 }
64 67
65 // Repository service functions 68 // Repository service functions
66 - function tedstRepositoryService() 69 + function testRepositoryService()
67 { 70 {
68 $RepositoryService = new KTRepositoryService(); 71 $RepositoryService = new KTRepositoryService();
69 72
@@ -180,7 +183,7 @@ class CMISTestCase extends KTUnitTestCase { @@ -180,7 +183,7 @@ class CMISTestCase extends KTUnitTestCase {
180 } 183 }
181 184
182 // Navigation service functions 185 // Navigation service functions
183 - function tedstNavigationService() 186 + function testNavigationService()
184 { 187 {
185 $NavigationService = new KTNavigationService($this->ktapi); 188 $NavigationService = new KTNavigationService($this->ktapi);
186 189
@@ -302,7 +305,7 @@ class CMISTestCase extends KTUnitTestCase { @@ -302,7 +305,7 @@ class CMISTestCase extends KTUnitTestCase {
302 305
303 // Object Services 306 // Object Services
304 307
305 - function tedstObjectService() 308 + function testObjectService()
306 { 309 {
307 $ObjectService = new KTObjectService($this->ktapi); 310 $ObjectService = new KTObjectService($this->ktapi);
308 // $ObjectService->startSession(KT_TEST_USER, KT_TEST_PASS); 311 // $ObjectService->startSession(KT_TEST_USER, KT_TEST_PASS);
@@ -526,7 +529,7 @@ class CMISTestCase extends KTUnitTestCase { @@ -526,7 +529,7 @@ class CMISTestCase extends KTUnitTestCase {
526 $response = $NavigationService->getCheckedOutDocs($repositoryId, false, false); 529 $response = $NavigationService->getCheckedOutDocs($repositoryId, false, false);
527 $this->assertEqual($response['status_code'], 0); 530 $this->assertEqual($response['status_code'], 0);
528 $this->assertNotNull($response['results']); 531 $this->assertNotNull($response['results']);
529 - $this->assertTrue(in_array($documentId, $response['results'])); 532 + $this->assertTrue($this->findInPropertiesArray('ObjectId', $documentId, $response['results']));
530 // now let's cancel the checkout so that we can delete later during cleanup :) 533 // now let's cancel the checkout so that we can delete later during cleanup :)
531 $response = $VersioningService->cancelCheckOut($repositoryId, $pwcId); 534 $response = $VersioningService->cancelCheckOut($repositoryId, $pwcId);
532 535
@@ -537,7 +540,46 @@ class CMISTestCase extends KTUnitTestCase { @@ -537,7 +540,46 @@ class CMISTestCase extends KTUnitTestCase {
537 // tear down the folder/doc tree structure with which we were testing 540 // tear down the folder/doc tree structure with which we were testing
538 $this->cleanupFolderDocStructure(); 541 $this->cleanupFolderDocStructure();
539 } 542 }
  543 +
  544 + /**
  545 + * Searches a CMIS properties array for a specific value
  546 + *
  547 + * @param string $key The CMIS property key to look for
  548 + * @param string $needle The value to check
  549 + * @param array $haystack The CMIS properties array
  550 + * @param int $propeLevel -1 or positive value -> -1 = not yet found | positive = found
  551 + * @return boolean
  552 + */
  553 + function findInPropertiesArray($key, $needle, $haystack, $propLevel = null)
  554 + {
  555 + $found = false;
  556 +
  557 + if (empty($propLevel)) $propLevel = -1;
540 558
  559 + foreach($haystack as $elKey => $elValue)
  560 + {
  561 + if (($propLevel == -1) && ((string)$elKey != 'properties')) {
  562 + $found = $this->findInPropertiesArray($key, $needle, $elValue, $propLevel);
  563 + if ($found) break;
  564 + }
  565 + else if ((string)$elKey == 'properties') {
  566 + $propLevel = 1;
  567 + }
  568 +
  569 + // now check through actual properties array
  570 + $properties = $elValue;
  571 + foreach($properties as $propKey => $property)
  572 + {
  573 + if (($propKey == $key) && ($property['value'] == $needle)) {
  574 + $found = true;
  575 + break;
  576 + }
  577 + }
  578 + }
  579 +
  580 + return $found;
  581 + }
  582 +
541 /** 583 /**
542 * Helper function to create a document 584 * Helper function to create a document
543 */ 585 */
webservice/atompub/cmis/KT_cmis_atom_server.services.inc.php
@@ -30,6 +30,7 @@ i. Other (Content-less document, Folder, Relationship, Type, etc) – best effor @@ -30,6 +30,7 @@ i. Other (Content-less document, Folder, Relationship, Type, etc) – best effor
30 When POSTing an Atom Document, the atom fields take precedence over the CMIS property field for writeable properties. For example, atom:title will overwrite cmis:name 30 When POSTing an Atom Document, the atom fields take precedence over the CMIS property field for writeable properties. For example, atom:title will overwrite cmis:name
31 */ 31 */
32 32
  33 +// load all available CMIS services
33 include_once CMIS_ATOM_LIB_FOLDER . 'RepositoryService.inc.php'; 34 include_once CMIS_ATOM_LIB_FOLDER . 'RepositoryService.inc.php';
34 include_once CMIS_ATOM_LIB_FOLDER . 'NavigationService.inc.php'; 35 include_once CMIS_ATOM_LIB_FOLDER . 'NavigationService.inc.php';
35 include_once CMIS_ATOM_LIB_FOLDER . 'ObjectService.inc.php'; 36 include_once CMIS_ATOM_LIB_FOLDER . 'ObjectService.inc.php';
@@ -101,7 +102,7 @@ class KT_cmis_atom_service_folder extends KT_cmis_atom_service { @@ -101,7 +102,7 @@ class KT_cmis_atom_service_folder extends KT_cmis_atom_service {
101 $feed = KT_cmis_atom_service_helper::getObjectFeed($this, $ObjectService, $repositoryId, $folderId); 102 $feed = KT_cmis_atom_service_helper::getObjectFeed($this, $ObjectService, $repositoryId, $folderId);
102 } 103 }
103 104
104 - //Expose the responseFeed 105 + // Expose the responseFeed
105 $this->responseFeed = $feed; 106 $this->responseFeed = $feed;
106 } 107 }
107 108
@@ -140,7 +141,7 @@ class KT_cmis_atom_service_folder extends KT_cmis_atom_service { @@ -140,7 +141,7 @@ class KT_cmis_atom_service_folder extends KT_cmis_atom_service {
140 $objectId = $this->params[2]; 141 $objectId = $this->params[2];
141 } 142 }
142 143
143 - $cmisObjectProperties = KT_cmis_atom_service_helper::getCmisProperties($this->parsedXMLContent['@children']['cmis:object']); 144 + $cmisObjectProperties = KT_cmis_atom_service_helper::getCmisProperties($this->parsedXMLContent['@children']);
144 145
145 // check for existing object id as property of submitted object data 146 // check for existing object id as property of submitted object data
146 if (!empty($cmisObjectProperties['ObjectId'])) 147 if (!empty($cmisObjectProperties['ObjectId']))
@@ -159,7 +160,7 @@ class KT_cmis_atom_service_folder extends KT_cmis_atom_service { @@ -159,7 +160,7 @@ class KT_cmis_atom_service_folder extends KT_cmis_atom_service {
159 CMISUtil::decodeObjectId($objectId, $typeId); 160 CMISUtil::decodeObjectId($objectId, $typeId);
160 } 161 }
161 162
162 - // now check for content stream 163 + // check for content stream
163 $content = KT_cmis_atom_service_helper::getAtomValues($this->parsedXMLContent['@children'], 'content'); 164 $content = KT_cmis_atom_service_helper::getAtomValues($this->parsedXMLContent['@children'], 'content');
164 165
165 // TODO this will possibly need to change somewhat once Relationship Objects come into play. 166 // TODO this will possibly need to change somewhat once Relationship Objects come into play.
@@ -207,7 +208,7 @@ class KT_cmis_atom_service_folder extends KT_cmis_atom_service { @@ -207,7 +208,7 @@ class KT_cmis_atom_service_folder extends KT_cmis_atom_service {
207 $feed = KT_cmis_atom_service_helper::getErrorFeed($this, self::STATUS_SERVER_ERROR, $error); 208 $feed = KT_cmis_atom_service_helper::getErrorFeed($this, self::STATUS_SERVER_ERROR, $error);
208 } 209 }
209 210
210 - //Expose the responseFeed 211 + // Expose the responseFeed
211 $this->responseFeed = $feed; 212 $this->responseFeed = $feed;
212 } 213 }
213 214
@@ -236,7 +237,7 @@ class KT_cmis_atom_service_folder extends KT_cmis_atom_service { @@ -236,7 +237,7 @@ class KT_cmis_atom_service_folder extends KT_cmis_atom_service {
236 if (PEAR::isError($response)) 237 if (PEAR::isError($response))
237 { 238 {
238 $feed = KT_cmis_atom_service_helper::getErrorFeed($this, self::STATUS_SERVER_ERROR, $response->getMessage()); 239 $feed = KT_cmis_atom_service_helper::getErrorFeed($this, self::STATUS_SERVER_ERROR, $response->getMessage());
239 - //Expose the responseFeed 240 + // Expose the responseFeed
240 $this->responseFeed = $feed; 241 $this->responseFeed = $feed;
241 return null; 242 return null;
242 } 243 }
@@ -349,7 +350,7 @@ class KT_cmis_atom_service_types extends KT_cmis_atom_service { @@ -349,7 +350,7 @@ class KT_cmis_atom_service_types extends KT_cmis_atom_service {
349 $type = ((empty($this->params[0])) ? 'all' : $this->params[0]); 350 $type = ((empty($this->params[0])) ? 'all' : $this->params[0]);
350 $feed = KT_cmis_atom_service_helper::getTypeFeed($type, $types); 351 $feed = KT_cmis_atom_service_helper::getTypeFeed($type, $types);
351 352
352 - //Expose the responseFeed 353 + // Expose the responseFeed
353 $this->responseFeed = $feed; 354 $this->responseFeed = $feed;
354 } 355 }
355 356
@@ -385,7 +386,7 @@ class KT_cmis_atom_service_type extends KT_cmis_atom_service { @@ -385,7 +386,7 @@ class KT_cmis_atom_service_type extends KT_cmis_atom_service {
385 $feed = $this->getTypeChildrenFeed($this->params[1]); 386 $feed = $this->getTypeChildrenFeed($this->params[1]);
386 } 387 }
387 388
388 - //Expose the responseFeed 389 + // Expose the responseFeed
389 $this->responseFeed=$feed; 390 $this->responseFeed=$feed;
390 } 391 }
391 392
@@ -494,7 +495,7 @@ class KT_cmis_atom_service_checkedout extends KT_cmis_atom_service { @@ -494,7 +495,7 @@ class KT_cmis_atom_service_checkedout extends KT_cmis_atom_service {
494 // $entry = null; 495 // $entry = null;
495 // $feed->newField('cmis:hasMoreItems', 'false', $entry, true); 496 // $feed->newField('cmis:hasMoreItems', 'false', $entry, true);
496 497
497 - //Expose the responseFeed 498 + // Expose the responseFeed
498 $this->responseFeed = $feed; 499 $this->responseFeed = $feed;
499 } 500 }
500 501
@@ -513,7 +514,7 @@ class KT_cmis_atom_service_checkedout extends KT_cmis_atom_service { @@ -513,7 +514,7 @@ class KT_cmis_atom_service_checkedout extends KT_cmis_atom_service {
513 if (empty($cmisObjectProperties['ObjectId'])) 514 if (empty($cmisObjectProperties['ObjectId']))
514 { 515 {
515 $feed = KT_cmis_atom_service_helper::getErrorFeed($this, self::STATUS_SERVER_ERROR, 'No object was specified for checkout'); 516 $feed = KT_cmis_atom_service_helper::getErrorFeed($this, self::STATUS_SERVER_ERROR, 'No object was specified for checkout');
516 - //Expose the responseFeed 517 + // Expose the responseFeed
517 $this->responseFeed = $feed; 518 $this->responseFeed = $feed;
518 return null; 519 return null;
519 } 520 }
@@ -523,7 +524,7 @@ class KT_cmis_atom_service_checkedout extends KT_cmis_atom_service { @@ -523,7 +524,7 @@ class KT_cmis_atom_service_checkedout extends KT_cmis_atom_service {
523 if (PEAR::isError($response)) 524 if (PEAR::isError($response))
524 { 525 {
525 $feed = KT_cmis_atom_service_helper::getErrorFeed($this, self::STATUS_SERVER_ERROR, 'No object was specified for checkout'); 526 $feed = KT_cmis_atom_service_helper::getErrorFeed($this, self::STATUS_SERVER_ERROR, 'No object was specified for checkout');
526 - //Expose the responseFeed 527 + // Expose the responseFeed
527 $this->responseFeed = $feed; 528 $this->responseFeed = $feed;
528 return null; 529 return null;
529 } 530 }
@@ -531,7 +532,7 @@ class KT_cmis_atom_service_checkedout extends KT_cmis_atom_service { @@ -531,7 +532,7 @@ class KT_cmis_atom_service_checkedout extends KT_cmis_atom_service {
531 $this->setStatus(self::STATUS_CREATED); 532 $this->setStatus(self::STATUS_CREATED);
532 $feed = KT_cmis_atom_service_helper::getObjectFeed($this, $ObjectService, $repositoryId, $cmisObjectProperties['ObjectId'], 'POST'); 533 $feed = KT_cmis_atom_service_helper::getObjectFeed($this, $ObjectService, $repositoryId, $cmisObjectProperties['ObjectId'], 'POST');
533 534
534 - //Expose the responseFeed 535 + // Expose the responseFeed
535 $this->responseFeed = $feed; 536 $this->responseFeed = $feed;
536 } 537 }
537 538
@@ -559,13 +560,13 @@ class KT_cmis_atom_service_document extends KT_cmis_atom_service { @@ -559,13 +560,13 @@ class KT_cmis_atom_service_document extends KT_cmis_atom_service {
559 // this depends on $this->params[1] 560 // this depends on $this->params[1]
560 if (!empty($this->params[1])) 561 if (!empty($this->params[1]))
561 { 562 {
562 - $this->getContentStream($ObjectService, $repositoryId); 563 + KT_cmis_atom_service_helper::downloadContentStream($this, $ObjectService, $repositoryId);
563 return null; 564 return null;
564 } 565 }
565 566
566 $feed = KT_cmis_atom_service_helper::getObjectFeed($this, $ObjectService, $repositoryId, $this->params[0]); 567 $feed = KT_cmis_atom_service_helper::getObjectFeed($this, $ObjectService, $repositoryId, $this->params[0]);
567 568
568 - //Expose the responseFeed 569 + // Expose the responseFeed
569 $this->responseFeed = $feed; 570 $this->responseFeed = $feed;
570 } 571 }
571 572
@@ -594,7 +595,7 @@ class KT_cmis_atom_service_document extends KT_cmis_atom_service { @@ -594,7 +595,7 @@ class KT_cmis_atom_service_document extends KT_cmis_atom_service {
594 if (PEAR::isError($response)) 595 if (PEAR::isError($response))
595 { 596 {
596 $feed = KT_cmis_atom_service_helper::getErrorFeed($this, self::STATUS_SERVER_ERROR, $response->getMessage()); 597 $feed = KT_cmis_atom_service_helper::getErrorFeed($this, self::STATUS_SERVER_ERROR, $response->getMessage());
597 - //Expose the responseFeed 598 + // Expose the responseFeed
598 $this->responseFeed = $feed; 599 $this->responseFeed = $feed;
599 return null; 600 return null;
600 } 601 }
@@ -603,46 +604,6 @@ class KT_cmis_atom_service_document extends KT_cmis_atom_service { @@ -603,46 +604,6 @@ class KT_cmis_atom_service_document extends KT_cmis_atom_service {
603 $this->setStatus(self::STATUS_NO_CONTENT); 604 $this->setStatus(self::STATUS_NO_CONTENT);
604 } 605 }
605 606
606 - private function getContentStream(&$ObjectService, $repositoryId)  
607 - {  
608 - $response = $ObjectService->getProperties($repositoryId, $this->params[0], false, false);  
609 - if (PEAR::isError($response)) {  
610 - $feed = KT_cmis_atom_service_helper::getErrorFeed($this, KT_cmis_atom_service::STATUS_SERVER_ERROR, $response->getMessage());  
611 - $this->responseFeed = $feed;  
612 - return null;  
613 - }  
614 -  
615 - // TODO also check If-Modified-Since?  
616 -// $this->headers['If-Modified-Since'] => 2009-07-24 17:16:54  
617 -  
618 - $this->contentDownload = true;  
619 - $eTag = md5($response['properties']['LastModificationDate']['value'] . $response['properties']['ContentStreamLength']['value']);  
620 -  
621 - if ($this->headers['If-None-Match'] == $eTag)  
622 - {  
623 - $this->setStatus(self::STATUS_NOT_MODIFIED);  
624 - $this->contentDownload = false;  
625 - return null;  
626 - }  
627 -  
628 - $contentStream = $ObjectService->getContentStream($repositoryId, $this->params[0]);  
629 -  
630 - // headers specific to output  
631 - $this->setEtag($eTag);  
632 - $this->setHeader('Last-Modified', $response['properties']['LastModificationDate']['value']);  
633 -  
634 - if (!empty($response['properties']['ContentStreamMimeType']['value'])) {  
635 - $this->setHeader('Content-type', $response['properties']['ContentStreamMimeType']['value'] . ';charset=utf-8');  
636 - }  
637 - else {  
638 - $this->setHeader('Content-type', 'text/plain;charset=utf-8');  
639 - }  
640 -  
641 - $this->setHeader('Content-Disposition', 'attachment;filename="' . $response['properties']['ContentStreamFilename']['value'] . '"');  
642 - $this->setHeader('Content-Length', $response['properties']['ContentStreamLength']['value']);  
643 - $this->output = $contentStream;  
644 - }  
645 -  
646 } 607 }
647 608
648 class KT_cmis_atom_service_pwc extends KT_cmis_atom_service { 609 class KT_cmis_atom_service_pwc extends KT_cmis_atom_service {
@@ -665,13 +626,13 @@ class KT_cmis_atom_service_pwc extends KT_cmis_atom_service { @@ -665,13 +626,13 @@ class KT_cmis_atom_service_pwc extends KT_cmis_atom_service {
665 // this depends on $this->params[1] 626 // this depends on $this->params[1]
666 if (!empty($this->params[1])) 627 if (!empty($this->params[1]))
667 { 628 {
668 - $this->getContentStream($ObjectService, $repositoryId); 629 + KT_cmis_atom_service_helper::downloadContentStream($this, $ObjectService, $repositoryId);
669 return null; 630 return null;
670 } 631 }
671 632
672 $feed = KT_cmis_atom_service_helper::getObjectFeed($this, $ObjectService, $repositoryId, $this->params[0]); 633 $feed = KT_cmis_atom_service_helper::getObjectFeed($this, $ObjectService, $repositoryId, $this->params[0]);
673 634
674 - //Expose the responseFeed 635 + // Expose the responseFeed
675 $this->responseFeed = $feed; 636 $this->responseFeed = $feed;
676 } 637 }
677 638
@@ -696,7 +657,7 @@ class KT_cmis_atom_service_pwc extends KT_cmis_atom_service { @@ -696,7 +657,7 @@ class KT_cmis_atom_service_pwc extends KT_cmis_atom_service {
696 if (PEAR::isError($response)) 657 if (PEAR::isError($response))
697 { 658 {
698 $feed = KT_cmis_atom_service_helper::getErrorFeed($this, self::STATUS_SERVER_ERROR, $response->getMessage()); 659 $feed = KT_cmis_atom_service_helper::getErrorFeed($this, self::STATUS_SERVER_ERROR, $response->getMessage());
699 - //Expose the responseFeed 660 + // Expose the responseFeed
700 $this->responseFeed = $feed; 661 $this->responseFeed = $feed;
701 return null; 662 return null;
702 } 663 }
@@ -707,25 +668,58 @@ class KT_cmis_atom_service_pwc extends KT_cmis_atom_service { @@ -707,25 +668,58 @@ class KT_cmis_atom_service_pwc extends KT_cmis_atom_service {
707 668
708 public function PUT_action() 669 public function PUT_action()
709 { 670 {
710 - // call the checkin function  
711 $RepositoryService = new RepositoryService(); 671 $RepositoryService = new RepositoryService();
712 $VersioningService = new VersioningService(KT_cmis_atom_service_helper::getKt()); 672 $VersioningService = new VersioningService(KT_cmis_atom_service_helper::getKt());
713 673
714 $repositories = $RepositoryService->getRepositories(); 674 $repositories = $RepositoryService->getRepositories();
715 $repositoryId = $repositories[0]['repositoryId']; 675 $repositoryId = $repositories[0]['repositoryId'];
716 676
717 - $response = $VersioningService->checkIn($repositoryId, $this->params[0]); 677 + // check for content stream
  678 + // NOTE this is a hack! will not work with CMISSpaces at least, probably not with any client except RestTest and similar
  679 + // where we can manually modify the input
  680 + // first we try for an atom content tag
  681 + $content = KT_cmis_atom_service_helper::getAtomValues($this->parsedXMLContent['@children'], 'content');
  682 + if (!empty($content)) {
  683 + $contentStream = $content;
  684 + }
  685 + // not found? try for a regular content tag
  686 + else {
  687 + $content = KT_cmis_atom_service_helper::findTag('content', $this->parsedXMLContent['@children'], null, false);
  688 + $contentStream = $content['@value'];
  689 + }
  690 +
  691 + // if we haven't found it now, the real hack begins - retrieve the EXISTING content and submit this as the contentStream
  692 + // this is needed because KnowledgeTree will not accept a checkin without a content stream but CMISSpaces (and possibly
  693 + // other CMIS clients are the same, does not send a content stream on checkin nor does it offer the user a method to choose one)
  694 + // NOTE that if the content is INTENDED to be empty this and all the above checks will FAIL!
  695 + // FIXME this is horrible, terrible, ugly and bad!
  696 + if (empty($contentStream))
  697 + {
  698 + $ObjectService = new ObjectService(KT_cmis_atom_service_helper::getKt());
  699 + $contentStream = base64_encode(KT_cmis_atom_service_helper::getContentStream($this, $ObjectService, $repositoryId));
  700 + }
  701 +
  702 + // and if we don't have it by now, we give up...but leave the error to be generated by the underlying KnowledgeTree code
  703 +
  704 + // checkin function call
  705 + // TODO dynamically detect version change type - leaving this for now as the CMIS clients tested do not appear to
  706 + // offer the choice to the user - perhaps it will turn out that this will come from somewhere else but for now
  707 + // we assume minor version updates only
  708 + $major = false;
  709 + $response = $VersioningService->checkIn($repositoryId, $this->params[0], $major, $contentStream);
718 710
719 if (PEAR::isError($response)) 711 if (PEAR::isError($response))
720 { 712 {
721 $feed = KT_cmis_atom_service_helper::getErrorFeed($this, self::STATUS_SERVER_ERROR, $response->getMessage()); 713 $feed = KT_cmis_atom_service_helper::getErrorFeed($this, self::STATUS_SERVER_ERROR, $response->getMessage());
722 - //Expose the responseFeed 714 + // Expose the responseFeed
723 $this->responseFeed = $feed; 715 $this->responseFeed = $feed;
724 return null; 716 return null;
725 } 717 }
726 718
727 - $this->setStatus(self::STATUS_NO_CONTENT);  
728 - $this->responseFeed = null; 719 + $feed = KT_cmis_atom_service_helper::getObjectFeed($this, $ObjectService, $repositoryId, $this->params[0]);
  720 +
  721 + // Expose the responseFeed
  722 + $this->responseFeed = $feed;
729 } 723 }
730 724
731 } 725 }
webservice/atompub/cmis/KT_cmis_atom_service_helper.inc.php
@@ -418,7 +418,7 @@ class KT_cmis_atom_service_helper { @@ -418,7 +418,7 @@ class KT_cmis_atom_service_helper {
418 while($start < $numFolders) 418 while($start < $numFolders)
419 { 419 {
420 $name = $path[$numQ-$numFolders+$start]; 420 $name = $path[$numQ-$numFolders+$start];
421 - // hack to fix drupal url encoding issue 421 + // fix for possible url encoding issue
422 $name = str_replace('%2520', '%20', $name); 422 $name = str_replace('%2520', '%20', $name);
423 423
424 $folderName = urldecode($name); 424 $folderName = urldecode($name);
@@ -494,6 +494,71 @@ class KT_cmis_atom_service_helper { @@ -494,6 +494,71 @@ class KT_cmis_atom_service_helper {
494 return date('Y-m-d H:i:s', $time); 494 return date('Y-m-d H:i:s', $time);
495 } 495 }
496 496
  497 + /**
  498 + * Fetches the document content stream for internal use
  499 + *
  500 + * @param object $ObjectService
  501 + * @param string $repositoryId
  502 + * @return null | string $contentStream
  503 + */
  504 + static public function getContentStream(&$service, &$ObjectService, $repositoryId)
  505 + {
  506 + $response = $ObjectService->getProperties($repositoryId, $service->params[0], false, false);
  507 + if (PEAR::isError($response)) {
  508 + return null;
  509 + }
  510 +
  511 + $contentStream = $ObjectService->getContentStream($repositoryId, $service->params[0]);
  512 +
  513 + return $contentStream;
  514 + }
  515 + /**
  516 + * Fetches and prepares the document content stream for download/viewing
  517 + *
  518 + * @param object $ObjectService
  519 + * @param string $repositoryId
  520 + * @return null | nothing
  521 + */
  522 + static public function downloadContentStream(&$service, &$ObjectService, $repositoryId)
  523 + {
  524 + $response = $ObjectService->getProperties($repositoryId, $service->params[0], false, false);
  525 + if (PEAR::isError($response)) {
  526 + $feed = KT_cmis_atom_service_helper::getErrorFeed($service, KT_cmis_atom_service::STATUS_SERVER_ERROR, $response->getMessage());
  527 + $service->responseFeed = $feed;
  528 + return null;
  529 + }
  530 +
  531 + // TODO also check If-Modified-Since?
  532 +// $service->headers['If-Modified-Since'] => 2009-07-24 17:16:54
  533 +
  534 + $service->setContentDownload(true);
  535 + $eTag = md5($response['properties']['LastModificationDate']['value'] . $response['properties']['ContentStreamLength']['value']);
  536 +
  537 + if ($service->headers['If-None-Match'] == $eTag)
  538 + {
  539 + $service->setStatus(KT_cmis_atom_service::STATUS_NOT_MODIFIED);
  540 + $service->setContentDownload(false);
  541 + return null;
  542 + }
  543 +
  544 + $contentStream = $ObjectService->getContentStream($repositoryId, $service->params[0]);
  545 +
  546 + // headers specific to output
  547 + $service->setEtag($eTag);
  548 + $service->setHeader('Last-Modified', $response['properties']['LastModificationDate']['value']);
  549 +
  550 + if (!empty($response['properties']['ContentStreamMimeType']['value'])) {
  551 + $service->setHeader('Content-type', $response['properties']['ContentStreamMimeType']['value'] . ';charset=utf-8');
  552 + }
  553 + else {
  554 + $service->setHeader('Content-type', 'text/plain;charset=utf-8');
  555 + }
  556 +
  557 + $service->setHeader('Content-Disposition', 'attachment;filename="' . $response['properties']['ContentStreamFilename']['value'] . '"');
  558 + $service->setHeader('Content-Length', $response['properties']['ContentStreamLength']['value']);
  559 + $service->setOutput($contentStream);
  560 + }
  561 +
497 //TODO: Add key information to be able to find the same tag in the original struct (MarkH) 562 //TODO: Add key information to be able to find the same tag in the original struct (MarkH)
498 static public function findTag($tagName=NULL,$xml=array(),$tagArray=NULL,$deep=false){ 563 static public function findTag($tagName=NULL,$xml=array(),$tagArray=NULL,$deep=false){
499 $tagArray=is_array($tagArray)?$tagArray:array(); 564 $tagArray=is_array($tagArray)?$tagArray:array();
webservice/classes/atompub/KT_atom_service.inc.php
@@ -147,7 +147,7 @@ class KT_atom_service{ @@ -147,7 +147,7 @@ class KT_atom_service{
147 header("HTTP/1.1 ".$status); 147 header("HTTP/1.1 ".$status);
148 } 148 }
149 149
150 - protected function setEtag($etagValue=NULL){ 150 + public function setEtag($etagValue=NULL){
151 if($etagValue)header('ETag: '.$etagValue); 151 if($etagValue)header('ETag: '.$etagValue);
152 } 152 }
153 153
webservice/classes/atompub/cmis/KT_cmis_atom_service.inc.php
@@ -8,7 +8,12 @@ class KT_cmis_atom_service extends KT_atom_service { @@ -8,7 +8,12 @@ class KT_cmis_atom_service extends KT_atom_service {
8 8
9 protected $serviceType = null; 9 protected $serviceType = null;
10 protected $contentDownload = false; 10 protected $contentDownload = false;
11 - 11 +
  12 + public function setContentDownload($contentDownload)
  13 + {
  14 + $this->contentDownload = $contentDownload;
  15 + }
  16 +
12 public public function isContentDownload() 17 public public function isContentDownload()
13 { 18 {
14 return $this->contentDownload; 19 return $this->contentDownload;
@@ -19,6 +24,11 @@ class KT_cmis_atom_service extends KT_atom_service { @@ -19,6 +24,11 @@ class KT_cmis_atom_service extends KT_atom_service {
19 return $this->status == self::STATUS_NOT_MODIFIED; 24 return $this->status == self::STATUS_NOT_MODIFIED;
20 } 25 }
21 26
  27 + public function setoutput($output)
  28 + {
  29 + $this->output = $output;
  30 + }
  31 +
22 public function getOutput() 32 public function getOutput()
23 { 33 {
24 return $this->output; 34 return $this->output;
@@ -29,7 +39,7 @@ class KT_cmis_atom_service extends KT_atom_service { @@ -29,7 +39,7 @@ class KT_cmis_atom_service extends KT_atom_service {
29 return $this->serviceType; 39 return $this->serviceType;
30 } 40 }
31 41
32 - protected function setHeader($header = null, $value = null) 42 + public function setHeader($header = null, $value = null)
33 { 43 {
34 if ($header) header($header . ': ' . $value); 44 if ($header) header($header . ': ' . $value);
35 } 45 }
webservice/classes/atompub/cmis/NavigationService.inc.php
1 <?php 1 <?php
2 2
3 -require_once KT_LIB_DIR . '/api/ktcmis/ktcmis.inc.php'; 3 +require_once KT_LIB_DIR . '/api/ktcmis/ktNavigationService.inc.php';
4 4
5 /** 5 /**
6 * CMIS Service class which hooks into the KnowledgeTree interface 6 * CMIS Service class which hooks into the KnowledgeTree interface
webservice/classes/atompub/cmis/ObjectService.inc.php
1 <?php 1 <?php
2 2
3 -require_once KT_LIB_DIR . '/api/ktcmis/ktcmis.inc.php'; 3 +require_once KT_LIB_DIR . '/api/ktcmis/ktObjectService.inc.php';
4 4
5 /** 5 /**
6 * CMIS Service class which hooks into the KnowledgeTree interface 6 * CMIS Service class which hooks into the KnowledgeTree interface
webservice/classes/atompub/cmis/RepositoryService.inc.php
@@ -5,7 +5,7 @@ @@ -5,7 +5,7 @@
5 * for processing of CMIS queries and responses via atompub/webservices 5 * for processing of CMIS queries and responses via atompub/webservices
6 */ 6 */
7 7
8 -require_once KT_LIB_DIR . '/api/ktcmis/ktcmis.inc.php'; 8 +require_once KT_LIB_DIR . '/api/ktcmis/ktRepositoryService.inc.php';
9 9
10 class RepositoryService extends KTRepositoryService { 10 class RepositoryService extends KTRepositoryService {
11 11
webservice/classes/atompub/cmis/VersioningService.inc.php
1 <?php 1 <?php
2 2
3 -require_once KT_LIB_DIR . '/api/ktcmis/ktcmis.inc.php'; 3 +require_once KT_LIB_DIR . '/api/ktcmis/ktVersioningService.inc.php';
4 4
5 /** 5 /**
6 * CMIS Service class which hooks into the KnowledgeTree interface 6 * CMIS Service class which hooks into the KnowledgeTree interface
@@ -85,9 +85,9 @@ class VersioningService extends KTVersioningService { @@ -85,9 +85,9 @@ class VersioningService extends KTVersioningService {
85 * @param string $checkinComment [optional] 85 * @param string $checkinComment [optional]
86 * @return string $documentId 86 * @return string $documentId
87 */ 87 */
88 - public function checkIn($repositoryId, $documentId, $major, $changeToken = '', $properties = array(), $contentStream = null, $checkinComment = '') 88 + public function checkIn($repositoryId, $documentId, $major, $contentStream = null, $changeToken = '', $properties = array(), $checkinComment = '')
89 { 89 {
90 - $result = parent::checkIn($repositoryId, $documentId, $major, $changeToken, $properties, $contentStream, $checkinComment); 90 + $result = parent::checkIn($repositoryId, $documentId, $major, $contentStream, $changeToken, $properties, $checkinComment);
91 91
92 if ($result['status_code'] == 0) { 92 if ($result['status_code'] == 0) {
93 return $result['results']; 93 return $result['results'];