basic.inc.php.svn-base
来自「PHP 知识管理系统(基于树结构的知识管理系统), 英文原版的PHP源码。」· SVN-BASE 代码 · 共 869 行 · 第 1/3 页
SVN-BASE
869 行
} foreach ($_REQUEST['metadata'] as $iMetaDataId) { $oMetaData =& MetaData::get($iMetaDataId); if (PEAR::isError($oMetaData)) { $this->errorRedirectTo('managelookups', _kt('Invalid lookups selected')); } $bStuck = (boolean)$oMetaData->getIsStuck(); $oMetaData->setIsStuck(!$bStuck); $oMetaData->update(); } $this->successRedirectTo('managelookups', _kt('Lookup stickiness toggled')); exit(0); } // }}}// {{{ TREE // create and display the tree editing form. function do_managetree() { global $default; // extract. $iFieldsetId = KTUtil::getId($this->oFieldset); $iFieldId = KTUtil::getId($this->oField); $oFieldset =& $this->oFieldset; $oField =& $this->oField; $this->oPage->setBreadcrumbDetails(_kt('edit lookup tree')); $field_id = $iFieldId; $current_node = KTUtil::arrayGet($_REQUEST, 'current_node', 0); $subaction = KTUtil::arrayGet($_REQUEST, 'subaction'); // validate if (empty($field_id)) { return $this->errorRedirectToMain(_kt("Must select a field to edit.")); } $oField =& DocumentField::get($field_id); if (PEAR::isError($oField)) { return $this->errorRedirectToMain(_kt("Invalid field.")); } $aErrorOptions = array( 'redirect_to' => array('editTree', sprintf('field_id=%d', $field_id)), ); // under here we do the subaction rendering. // we do this so we don't have to do _very_ strange things with multiple actions. //$default->log->debug("Subaction: " . $subaction); $fieldTree =& new MDTree(); $fieldTree->buildForField($oField->getId()); if ($subaction !== null) { $target = 'managetree'; $msg = _kt('Changes saved.'); if ($subaction === "addCategory") { $new_category = KTUtil::arrayGet($_REQUEST, 'category_name'); if (empty($new_category)) { return $this->errorRedirectTo("managetree", _kt("Must enter a name for the new category."), array("field_id" => $field_id, "fFieldsetId" => $iFieldsetId)); } else { $this->subact_addCategory($field_id, $current_node, $new_category, $fieldTree); } $msg = _kt('Category added'). ': ' . $new_category; } if ($subaction === "deleteCategory") { $this->subact_deleteCategory($fieldTree, $current_node); $current_node = 0; // clear out, and don't try and render the newly deleted category. $msg = _kt('Category removed.'); } if ($subaction === "linkKeywords") { $keywords = KTUtil::arrayGet($_REQUEST, 'keywordsToAdd'); $aErrorOptions['message'] = _kt("No keywords selected"); $this->oValidator->notEmpty($keywords, $aErrorOptions); $this->subact_linkKeywords($fieldTree, $current_node, $keywords); $current_node = 0; // clear out, and don't try and render the newly deleted category. $msg = _kt('Keywords added to category.'); } if ($subaction === "unlinkKeyword") { $keyword = KTUtil::arrayGet($_REQUEST, 'keyword_id'); $this->subact_unlinkKeyword($fieldTree, $keyword); $msg = _kt('Keyword moved to base of tree.'); } // now redirect $query = sprintf('field_id=%d&fFieldsetId=%d', $field_id, $iFieldsetId); return $this->successRedirectTo($target, $msg, $query); } if ($fieldTree->root === null) { return $this->errorRedirectToMain(_kt("Error building tree. Is this a valid tree-lookup field?")); } // FIXME extract this from MDTree (helper method?) $free_metadata = MetaData::getList('document_field_id = '.$oField->getId().' AND (treeorg_parent = 0 OR treeorg_parent IS NULL) AND (disabled = 0)'); // render edit template. $oTemplate = $this->oValidator->validateTemplate("ktcore/metadata/admin/edit_lookuptree"); $renderedTree = $this->_evilTreeRenderer($fieldTree); $this->oPage->setTitle(_kt('Edit Lookup Tree')); if ($current_node == 0) { $category_name = 'Root'; } else { $oNode = MDTreeNode::get($current_node); $category_name = $oNode->getName(); } $aTemplateData = array( "context" => $this, "args" => $this->meldPersistQuery("","managetree", true), "field" => $oField, "oFieldset" => $oFieldset, "tree" => $fieldTree, "renderedTree" => $renderedTree, "currentNode" => $current_node, 'category_name' => $category_name, "freechildren" => $free_metadata, ); return $oTemplate->render($aTemplateData); } function subact_addCategory($field_id, $current_node, $new_category, &$constructedTree) { $newCategory = MDTreeNode::createFromArray(array ( "iFieldId" => $field_id, "sName" => $new_category, "iParentNode" => $current_node, )); if (PEAR::isError($newCategory)) { return false; } $constructedTree->addNode($newCategory); return true; } function subact_deleteCategory(&$constructedTree, $current_node) { $constructedTree->deleteNode($current_node); return true; } function subact_unlinkKeyword(&$constructedTree, $keyword) { $oKW = MetaData::get($keyword); if (PEAR::isError($oKW)) { return true; } $constructedTree->reparentKeyword($oKW->getId(), 0); return true; } function subact_linkKeywords(&$constructedTree, $current_node, $keywords) { foreach ($keywords as $md_id) { $constructedTree->reparentKeyword($md_id, $current_node); } return true; } /* ----------------------- EVIL HACK -------------------------- * * This whole thing needs to replaced, as soon as I work out how * to non-sucking Smarty recursion. */ function _evilTreeRecursion($subnode, $treeToRender) { // deliver us from evil.... $iFieldId = $treeToRender->field_id; $oField = DocumentField::get($iFieldId); $iFieldsetId = $oField->getParentFieldsetId(); $treeStr = "<ul>"; foreach ($treeToRender->contents[$subnode] as $subnode_id => $subnode_val) { if ($subnode_id !== "leaves") { $treeStr .= '<li class="treenode active"><a class="pathnode inactive" onclick="toggleElementClass(\'active\', this.parentNode); toggleElementClass(\'inactive\', this.parentNode);">' . $treeToRender->mapnodes[$subnode_val]->getName() . '</a>'; $treeStr .= $this->_evilActionHelper($iFieldsetId, $iFieldId, false, $subnode_val); $treeStr .= $this->_evilTreeRecursion($subnode_val, $treeToRender); $treeStr .= '</li>'; } else { foreach ($subnode_val as $leaf) { $treeStr .= '<li class="leafnode">' . $treeToRender->lookups[$leaf]->getName(); $treeStr .= $this->_evilActionHelper($iFieldsetId, $iFieldId, true, $leaf); $treeStr .= '</li>'; } } } $treeStr .= '</ul>'; return $treeStr; } // I can't seem to do recursion in smarty, and recursive templates seems a bad solution. // Come up with a better way to do this (? NBM) function _evilTreeRenderer($treeToRender) { //global $default; $treeStr = "<!-- this is rendered with an unholy hack. sorry. -->"; $stack = array(); $exitstack = array(); // since the root is virtual, we need to fake it here. // the inner section is generised. $treeStr .= '<ul class="kt_treenodes"><li class="treenode active"><a class="pathnode" onclick="toggleElementClass(\'active\', this.parentNode);toggleElementClass(\'inactive\', this.parentNode);">' . _kt('Root') . '</a>'; $treeStr .= ' (<a href="' . KTUtil::addQueryStringSelf($this->meldPersistQuery('current_node=0', 'managetree')) . '">' . _kt('attach keywords') . '</a>)'; $treeStr .= '<ul>'; //$default->log->debug("EVILRENDER: " . print_r($treeToRender, true)); foreach ($treeToRender->getRoot() as $node_id => $subtree_nodes) { //$default->log->debug("EVILRENDER: ".$node_id." => ".$subtree_nodes." (".($node_id === "leaves").")"); // leaves are handled differently. if ($node_id !== "leaves") { // $default->log->debug("EVILRENDER: " . print_r($subtree_nodes, true)); $treeStr .= '<li class="treenode active"><a class="pathnode" onclick="toggleElementClass(\'active\', this.parentNode);toggleElementClass(\'inactive\', this.parentNode);">' . $treeToRender->mapnodes[$subtree_nodes]->getName() . '</a>'; $treeStr .= $this->_evilActionHelper($iFieldsetId, $iFieldId, false, $subtree_nodes); $treeStr .= $this->_evilTreeRecursion($subtree_nodes, $treeToRender); $treeStr .= '</li>'; } else { foreach ($subtree_nodes as $leaf) { $treeStr .= '<li class="leafnode">' . $treeToRender->lookups[$leaf]->getName(); $treeStr .= $this->_evilActionHelper($iFieldsetId, $iFieldId, true, $leaf); $treeStr .= '</li>'; } } } $treeStr .= '</ul></li>'; $treeStr .= '</ul>'; return $treeStr; } // BS: don't hate me. // BD: sorry. I hate you. function _evilActionHelper($iFieldsetId, $iFieldId, $bIsKeyword, $current_node) { $actionStr = " ("; if ($bIsKeyword === true) { $actionStr .= '<a href="' . KTUtil::addQueryStringSelf(KTUtil::addQueryStringSelf($this->meldPersistQuery('keyword_id='.$current_node.'&subaction=unlinkKeyword', 'managetree'))) . '">' . _kt('unlink') . '</a>'; } else { $actionStr .= '<a href="' . KTUtil::addQueryStringSelf($this->meldPersistQuery('current_node=' . $current_node, 'managetree')) .'">' . _kt('attach keywords') . '</a> '; $actionStr .= '| <a href="' . KTUtil::addQueryStringSelf($this->meldPersistQuery('current_node='.$current_node.'&subaction=deleteCategory', 'managetree')) . '">' . _kt('delete') . '</a>'; } $actionStr .= ")"; return $actionStr; } function do_deletefield() { $res = $this->oField->delete(); if (PEAR::isError($res)) { $this->errorRedirectToParent(sprintf(_kt("Unable to delete field: %s"), $res->getMessage())); } $this->successRedirectToParent(_kt("Field deleted.")); } /** * Move field up in the order */ function do_orderUp() { $iId = $this->oField->getID(); $iFieldsetId = $this->oField->getParentFieldsetId(); $res = $this->oField->movePosition($iFieldsetId, $iId, 'up'); if ($res === false) { $this->errorRedirectToParent(_kt("Unable to move field up")); } $this->successRedirectToParent(_kt("Field moved up.")); } /** * Move field down in the order */ function do_orderDown() { $iId = $this->oField->getID(); $iFieldsetId = $this->oField->getParentFieldsetId(); $res = $this->oField->movePosition($iFieldsetId, $iId, 'down'); if ($res === false) { $this->errorRedirectToParent(_kt("Unable to move field down")); } $this->successRedirectToParent(_kt("Field moved down.")); }}?>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?