edit.php.tmp
来自「PHP 知识管理系统(基于树结构的知识管理系统), 英文原版的PHP源码。」· TMP 代码 · 共 400 行
TMP
400 行
<?php/** * * KnowledgeTree Community Edition * Document Management Made Simple * Copyright (C) 2008 KnowledgeTree Inc. * Portions copyright The Jam Warehouse Software (Pty) Limited * * This program is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License version 3 as published by the * Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, * California 94120-7775, or email info@knowledgetree.com. * * The interactive user interfaces in modified source and object code versions * of this program must display Appropriate Legal Notices, as required under * Section 5 of the GNU General Public License version 3. * * In accordance with Section 7(b) of the GNU General Public License version 3, * these Appropriate Legal Notices must retain the display of the "Powered by * KnowledgeTree" logo and retain the original copyright notice. If the display of the * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices * must display the words "Powered by KnowledgeTree" and retain the original * copyright notice. * Contributor( s): ______________________________________ * */require_once(KT_LIB_DIR . '/documentmanagement/Document.inc');require_once(KT_LIB_DIR . '/documentmanagement/DocumentType.inc');require_once(KT_LIB_DIR . '/foldermanagement/Folder.inc');require_once(KT_LIB_DIR . '/documentmanagement/DocumentLink.inc');require_once(KT_LIB_DIR . '/documentmanagement/documentutil.inc.php');require_once(KT_LIB_DIR . '/documentmanagement/DocumentType.inc');require_once(KT_LIB_DIR . '/metadata/fieldset.inc.php');require_once(KT_LIB_DIR . '/documentmanagement/documentutil.inc.php');require_once(KT_LIB_DIR . '/triggers/triggerregistry.inc.php');require_once(KT_LIB_DIR . '/permissions/permission.inc.php');require_once(KT_LIB_DIR . '/permissions/permissionutil.inc.php');require_once(KT_LIB_DIR . "/widgets/forms.inc.php");require_once(KT_LIB_DIR . "/metadata/fieldsetregistry.inc.php");require_once(KT_LIB_DIR . "/util/sanitize.inc");require_once(KT_LIB_DIR.'/permissions/permissiondynamiccondition.inc.php');// {{{ KTDocumentEditActionclass KTDocumentEditAction extends KTDocumentAction { var $sName = 'ktcore.actions.document.edit'; var $_sShowPermission = "ktcore.permissions.write"; var $_bMutator = true; var $sIconClass = 'edit_metadata'; function getInfo() { if ($this->oDocument->getIsCheckedOut()) { return null; } return parent::getInfo(); } function getDisplayName() { return _kt('Edit Metadata'); } function predispatch() { $this->persistParams(array('new_type')); } function form_edit() { $oForm = new KTForm; $oForm->setOptions(array( 'label' => _kt('Edit Metadata'), 'submit_label' => _kt('Update Document'), 'action' => 'update', 'fail_action' => 'main', 'cancel_url' => KTBrowseUtil::getUrlForDocument($this->oDocument), 'context' => &$this, 'extraargs' => $this->meldPersistQuery("","",true), )); $oFReg =& KTFieldsetRegistry::getSingleton(); $doctypeid = $this->oDocument->getDocumentTypeID(); if ($_REQUEST['new_type']) { $oTestType = DocumentType::get($_REQUEST['new_type']); if (!PEAR::isError($oTestType)) { $doctypeid = $oTestType->getId(); } } $widgets = array( array('ktcore.widgets.string', array( 'label' => _kt("Document Title"), 'description' => sprintf(_kt("The document title is used as the main name of a document throughout %s."), APP_NAME), 'name' => 'document_title', 'required' => true, 'value' => sanitizeForHTML($this->oDocument->getName()), )), ); $validators = array( array('ktcore.validators.string', array( 'test' => 'document_title', 'output' => 'document_title', )), ); $fieldsets = (array) KTMetadataUtil::fieldsetsForDocument($this->oDocument, $doctypeid); foreach ($fieldsets as $oFieldset) { $widgets = kt_array_merge($widgets, $oFReg->widgetsForFieldset($oFieldset, 'fieldset_' . $oFieldset->getId(), $this->oDocument)); $validators = kt_array_merge($validators, $oFReg->validatorsForFieldset($oFieldset, 'fieldset_' . $oFieldset->getId(), $this->oDocument)); } $oForm->setWidgets($widgets); $oForm->setValidators($validators); return $oForm; } function do_main() { $this->oPage->setBreadcrumbDetails(_kt("Edit Metadata")); $oTemplate = $this->oValidator->validateTemplate('ktcore/document/edit'); $doctypeid = $this->oDocument->getDocumentTypeID(); $type = DocumentType::get($doctypeid); $oForm = $this->form_edit(); $oTemplate->setData(array( 'context' => $this, 'form' => $oForm, 'document' => $this->oDocument, 'type_name' => $type->getName(), )); return $oTemplate->render(); } function do_update() { $oForm = $this->form_edit(); $res = $oForm->validate(); if (!empty($res['errors'])) { return $oForm->handleError(); } $data = $res['results']; // we need to format these in MDPack format // which is a little archaic: // // array( // array($oField, $sValue), // array($oField, $sValue), // array($oField, $sValue), // ); // // we do this the "easy" way. $doctypeid = $this->oDocument->getDocumentTypeId(); if ($_REQUEST['new_type']) { $oTestType = DocumentType::get($_REQUEST['new_type']); if (!PEAR::isError($oTestType)) { $doctypeid = $oTestType->getId(); } } $fieldsets = KTMetadataUtil::fieldsetsForDocument($this->oDocument, $doctypeid); $MDPack = array(); foreach ($fieldsets as $oFieldset) { $fields = $oFieldset->getFields(); $values = (array) KTUtil::arrayGet($data, 'fieldset_' . $oFieldset->getId()); foreach ($fields as $oField) { $val = KTUtil::arrayGet($values, 'metadata_' . $oField->getId()); // FIXME "null" has strange meanings here. if (!is_null($val)) { $MDPack[] = array( $oField, $val ); } } } $this->startTransaction(); if ($this->oDocument->getDocumentTypeId() != $doctypeid) { $this->oDocument->setDocumentTypeId($doctypeid); } $this->oDocument->setName(($data['document_title'])); $this->oDocument->startNewContentVersion($this->oUser); $this->oDocument->setMinorVersionNumber($this->oDocument->getMinorVersionNumber()+1); $this->oDocument->setLastModifiedDate(getCurrentDateTime()); $this->oDocument->setModifiedUserId($this->oUser->getId()); $res = $this->oDocument->update(); if (PEAR::isError($res)) { $oForm->handleError(sprintf(_kt("Unexpected failure to update document title: %s"), $res->getMessage())); } $core_res = KTDocumentUtil::saveMetadata($this->oDocument, $MDPack); if (PEAR::isError($core_res)) { $oForm->handleError(sprintf(_kt("Unexpected validation failure: %s."), $core_res->getMessage())); } // post-triggers. $oKTTriggerRegistry = KTTriggerRegistry::getSingleton(); $aTriggers = $oKTTriggerRegistry->getTriggers('edit', 'postValidate'); foreach ($aTriggers as $aTrigger) { $sTrigger = $aTrigger[0]; $oTrigger = new $sTrigger; $aInfo = array( "document" => $this->oDocument, "aOptions" => $MDPack, ); $oTrigger->setInfo($aInfo); $ret = $oTrigger->postValidate(); } $this->commitTransaction(); // create the document transaction record $oDocumentTransaction = & new DocumentTransaction($this->oDocument, _kt('Document metadata updated'), 'ktcore.transactions.update'); $oDocumentTransaction->create(); // Check if there are any dynamic conditions / permissions that need to be updated on the document // If there are dynamic conditions then update the permissions on the document // The dynamic condition test fails unless the changes exists in the DB therefore update permissions after committing the transaction. $iPermissionObjectId = $this->oDocument->getPermissionObjectID(); $dynamicCondition = KTPermissionDynamicCondition::getByPermissionObjectId($iPermissionObjectId); if(!PEAR::isError($dynamicCondition) && !empty($dynamicCondition)){ $res = KTPermissionUtil::updatePermissionLookup($this->oDocument); } redirect(KTBrowseUtil::getUrlForDocument($this->oDocument->getId())); exit(0); } function form_changetype() { $oForm = new KTForm; $oForm->setOptions(array( 'label' => _kt("Change Document Type"), 'description' => _kt("Changing the document type will allow different metadata to be associated with it."), 'identifier' => 'ktcore.doc.edit.typechange', 'submit_label' => _kt("Update Document"), 'context' => $this, 'cancel_action' => 'main', 'action' => 'trytype', )); $type = DocumentType::get($this->oDocument->getDocumentTypeId()); $current_type_name = $type->getName(); $oFolder = Folder::get($this->oDocument->getFolderID()); $oForm->setWidgets(array( array('ktcore.widgets.entityselection',array( 'label' => _kt("New Document Type"), 'description' => _kt("Please select the new type for this document."), 'important_description' => sprintf(_kt("The document is currently of type \"%s\"."), $current_type_name), 'value' => $type->getId(), 'label_method' => 'getName', 'vocab' => DocumentType::getListForUserAndFolder($this->oUser, $oFolder), 'simple_select' => false, 'required' => true, 'name' => 'type' )), )); $oForm->setValidators(array( array('ktcore.validators.entity', array( 'test' => 'type', 'output' => 'type', 'class' => 'DocumentType', )), )); return $oForm; } function do_selecttype() { $oForm = $this->form_changetype(); return $oForm->renderPage(_kt("Change Document Type")); } function do_trytype() { $oForm = $this->form_changetype(); $res = $oForm->validate(); $data = $res['results']; $errors = $res['errors']; if (!empty($errors)) { $oForm->handleError(); } $document_type = $data['type']; $doctypeid = $document_type->getId(); // Get the current document type, fieldsets and metadata $iOldDocTypeID = $this->oDocument->getDocumentTypeID(); $fieldsets = KTMetadataUtil::fieldsetsForDocument($this->oDocument, $iOldDocTypeID); $mdlist = DocumentFieldLink::getByDocument($this->oDocument); $field_values = array(); foreach ($mdlist as $oFieldLink) { $field_values[$oFieldLink->getDocumentFieldID()] = $oFieldLink->getValue(); } DBUtil::startTransaction(); // Update the document with the new document type id $this->oDocument->startNewMetadataVersion($this->oUser); $this->oDocument->setDocumentTypeId($doctypeid); $res = $this->oDocument->update(); if (PEAR::isError($res)) { DBUtil::rollback(); return $res; } // Ensure all values for fieldsets common to both document types are retained $fs_ids = array(); $doctype_fieldsets = KTFieldSet::getForDocumentType($doctypeid); foreach($doctype_fieldsets as $fieldset) { $fs_ids[] = $fieldset->getId(); } $MDPack = array(); foreach ($fieldsets as $oFieldset) { if ($oFieldset->getIsGeneric() || in_array($oFieldset->getId(), $fs_ids)) { $fields = $oFieldset->getFields(); foreach ($fields as $oField) { $val = isset($field_values[$oField->getId()]) ? $field_values[$oField->getId()] : ''; if (!empty($val)) { $MDPack[] = array($oField, $val); } } } } $core_res = KTDocumentUtil::saveMetadata($this->oDocument, $MDPack, array('novalidate' => true)); if (PEAR::isError($core_res)) { DBUtil::rollback(); return $core_res; } DBUtil::commit(); $oKTTriggerRegistry = KTTriggerRegistry::getSingleton(); $aTriggers = $oKTTriggerRegistry->getTriggers('edit', 'postValidate'); foreach ($aTriggers as $aTrigger) { $sTrigger = $aTrigger[0]; $oTrigger = new $sTrigger; $aInfo = array( "document" => $this->oDocument, "aOptions" => $MDPack, ); $oTrigger->setInfo($aInfo); $ret = $oTrigger->postValidate(); } // Check if there are any dynamic conditions / permissions that need to be updated on the document // If there are dynamic conditions then update the permissions on the document // The dynamic condition test fails unless the changes exists in the DB therefore update permissions after committing the transaction. $iPermissionObjectId = $this->oDocument->getPermissionObjectID(); $dynamicCondition = KTPermissionDynamicCondition::getByPermissionObjectId($iPermissionObjectId); if(!PEAR::isError($dynamicCondition) && !empty($dynamicCondition)){ $res = KTPermissionUtil::updatePermissionLookup($this->oDocument); } $this->successRedirectToMain(sprintf(_kt("You have selected a new document type: %s. "), $data['type']->getName())); }}// }}}?>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?