loadTemplate("ktcore/manage_lookuptrees"); $aTemplateData = array( "treefields" => $aTreeFields, "lookupfields" => $aLookupFields, ); return $oTemplate->render($aTemplateData); } function do_createTree() { // extract. $field_id = KTUtil::arrayGet($_REQUEST, 'field_id'); // validate if (empty($field_id)) { return $this->errorRedirectToMain(_("Must select a field to convert.")); } $oField =& DocumentField::get($field_id); if (PEAR::isError($oField)) { return $this->errorRedirectToMain(_("Invalid field.")); } // set as a metadata tree. $oField->setHasLookupTree(1); $oField->update(); $this->errorRedirectToMain(sprintf(_("Converted %s to a tree."), $oField->getName())); } // create and display the tree editing form. function do_editTree() { global $default; // extract. $field_id = KTUtil::arrayGet($_REQUEST, 'field_id'); $current_node = KTUtil::arrayGet($_REQUEST, 'current_node', 0); $subaction = KTUtil::arrayGet($_REQUEST, 'subaction'); // validate if (empty($field_id)) { return $this->errorRedirectToMain(_("Must select a field to edit.")); } $oField =& DocumentField::get($field_id); if (PEAR::isError($oField)) { return $this->errorRedirectToMain(_("Invalid field.")); } // 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 = 'editTree'; $msg = _('Changes saved.'); if ($subaction === "addCategory") { $new_category = KTUtil::arrayGet($_REQUEST, 'category_name'); if (empty($new_category)) { return $this->errorRedirectTo("editTree", _("Must enter a name for the new category."), array("field_id" => $field_id)); } else { $this->subact_addCategory($field_id, $current_node, $new_category, $fieldTree);} $msg = _('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 = _('Category removed.'); } if ($subaction === "linkKeywords") { $keywords = KTUtil::arrayGet($_REQUEST, 'keywordsToAdd'); $this->subact_linkKeywords($fieldTree, $current_node, $keywords); $current_node = 0; // clear out, and don't try and render the newly deleted category. $msg = _('Keywords added to category.'); } if ($subaction === "unlinkKeyword") { $keyword = KTUtil::arrayGet($_REQUEST, 'keyword_id'); $this->subact_unlinkKeyword($fieldTree, $keyword); $msg = _('Keyword moved to base of tree.'); } // now redirect $query = 'field_id=' . $field_id; return $this->successRedirectTo($target, $msg, $query); } if ($fieldTree->root === null) { return $this->errorRedirectToMain(_("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)'); // render edit template. $oTemplating = new KTTemplating; $oTemplate = $oTemplating->loadTemplate("ktcore/edit_lookuptrees"); $renderedTree = $this->_evilTreeRenderer($fieldTree); $this->oPage->setTitle(_('Edit Lookup Tree')); //$this->oPage->requireJSResource('thirdparty/js/MochiKit/Base.js'); $aTemplateData = array( "field" => $oField, "tree" => $fieldTree, "renderedTree" => $renderedTree, "currentNode" => $current_node, "freechildren" => $free_metadata, "context" => $this, ); 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); $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) { $treeStr = "'; 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 = ""; $stack = array(); $exitstack = array(); // since the root is virtual, we need to fake it here. // the inner section is generised. $treeStr .= ''; return $treeStr; } // don't hate me. function _evilActionHelper($iFieldId, $bIsKeyword, $current_node) { $actionStr = " ("; if ($bIsKeyword === true) { $actionStr .= 'unlink'; } else { $actionStr .= 'add items '; $actionStr .= '| delete'; } $actionStr .= ")"; return $actionStr; } } $oDispatcher = new ManageLookupTreeDispatcher(); $oDispatcher->dispatch(); ?>