diff --git a/plugins/ktcore/admin/documentFields.php b/plugins/ktcore/admin/documentFields.php
index 2a74dbe..9621c30 100755
--- a/plugins/ktcore/admin/documentFields.php
+++ b/plugins/ktcore/admin/documentFields.php
@@ -537,6 +537,206 @@ class KTDocumentFieldDispatcher extends KTStandardDispatcher {
$this->successRedirectToMain(_('Fieldset deleted'));
}
// }}}
+
+
+// {{{ TREE
+ // 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 = "
";
+ foreach ($treeToRender->contents[$subnode] as $subnode_id => $subnode_val)
+ {
+ if ($subnode_id !== "leaves") {
+ $treeStr .= '- ' . $treeToRender->mapnodes[$subnode_val]->getName() . '';
+ $treeStr .= $this->_evilActionHelper($treeToRender->field_id, false, $subnode_val);
+ $treeStr .= $this->_evilTreeRecursion($subnode_val, $treeToRender);
+ $treeStr .= '
';
+ }
+ else
+ {
+ foreach ($subnode_val as $leaf)
+ {
+ $treeStr .= '- ' . $treeToRender->lookups[$leaf]->getName();
+ $treeStr .= $this->_evilActionHelper($treeToRender->field_id, true, $leaf);
+ $treeStr .= '
'; }
+ }
+ }
+ $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 .= '- Root';
+ $treeStr .= ' (edit)';
+ $treeStr .= '
';
+ //$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 .= '- ' . $treeToRender->mapnodes[$subtree_nodes]->getName() . '';
+ $treeStr .= $this->_evilActionHelper($treeToRender->field_id, false, $subtree_nodes);
+ $treeStr .= $this->_evilTreeRecursion($subtree_nodes, $treeToRender);
+ $treeStr .= '
';
+ }
+ else
+ {
+ foreach ($subtree_nodes as $leaf)
+ {
+ $treeStr .= '- ' . $treeToRender->lookups[$leaf]->getName();
+ $treeStr .= $this->_evilActionHelper($treeToRender->field_id, true, $leaf);
+ $treeStr .= '
';
+ }
+ }
+ }
+ $treeStr .= '
';
+ $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;
+ }
+// }}}
}
?>
diff --git a/plugins/ktcore/admin/manageLookupTrees.php b/plugins/ktcore/admin/manageLookupTrees.php
deleted file mode 100755
index 9317c66..0000000
--- a/plugins/ktcore/admin/manageLookupTrees.php
+++ /dev/null
@@ -1,246 +0,0 @@
-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 = "";
- foreach ($treeToRender->contents[$subnode] as $subnode_id => $subnode_val)
- {
- if ($subnode_id !== "leaves") {
- $treeStr .= '- ' . $treeToRender->mapnodes[$subnode_val]->getName() . '';
- $treeStr .= $this->_evilActionHelper($treeToRender->field_id, false, $subnode_val);
- $treeStr .= $this->_evilTreeRecursion($subnode_val, $treeToRender);
- $treeStr .= '
';
- }
- else
- {
- foreach ($subnode_val as $leaf)
- {
- $treeStr .= '- ' . $treeToRender->lookups[$leaf]->getName();
- $treeStr .= $this->_evilActionHelper($treeToRender->field_id, true, $leaf);
- $treeStr .= '
'; }
- }
- }
- $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 .= '- Root';
- $treeStr .= ' (edit)';
- $treeStr .= '
';
- //$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 .= '- ' . $treeToRender->mapnodes[$subtree_nodes]->getName() . '';
- $treeStr .= $this->_evilActionHelper($treeToRender->field_id, false, $subtree_nodes);
- $treeStr .= $this->_evilTreeRecursion($subtree_nodes, $treeToRender);
- $treeStr .= '
';
- }
- else
- {
- foreach ($subtree_nodes as $leaf)
- {
- $treeStr .= '- ' . $treeToRender->lookups[$leaf]->getName();
- $treeStr .= $this->_evilActionHelper($treeToRender->field_id, true, $leaf);
- $treeStr .= '
';
- }
- }
- }
- $treeStr .= '
';
- $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();
-
-?>
diff --git a/templates/ktcore/metadata/editField.smarty b/templates/ktcore/metadata/editField.smarty
index 97e618c..9b047be 100644
--- a/templates/ktcore/metadata/editField.smarty
+++ b/templates/ktcore/metadata/editField.smarty
@@ -52,7 +52,7 @@
{if $oField->getHasLookup() and $oField->getHasLookupTree()}
{assign var=iFieldId value=$oField->getId()}
{i18n}Manage
+href="?action=editTree&field_id={$iFieldId}">{i18n}Manage
lookup tree{/i18n}
{/if}