From 876fb9a60956f44e5c53cc0b1bb376517fb47c24 Mon Sep 17 00:00:00 2001 From: nbm Date: Tue, 4 Oct 2005 12:17:08 +0000 Subject: [PATCH] PHP code for conditional metadata simple case --- presentation/lookAndFeel/knowledgeTree/administration/docfieldmanagement/conditional/ajaxConditionals.php | 119 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ presentation/lookAndFeel/knowledgeTree/administration/docfieldmanagement/conditional/manageConditionals.php | 342 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 461 insertions(+), 0 deletions(-) create mode 100644 presentation/lookAndFeel/knowledgeTree/administration/docfieldmanagement/conditional/ajaxConditionals.php create mode 100644 presentation/lookAndFeel/knowledgeTree/administration/docfieldmanagement/conditional/manageConditionals.php diff --git a/presentation/lookAndFeel/knowledgeTree/administration/docfieldmanagement/conditional/ajaxConditionals.php b/presentation/lookAndFeel/knowledgeTree/administration/docfieldmanagement/conditional/ajaxConditionals.php new file mode 100644 index 0000000..ce28a72 --- /dev/null +++ b/presentation/lookAndFeel/knowledgeTree/administration/docfieldmanagement/conditional/ajaxConditionals.php @@ -0,0 +1,119 @@ +getId(); + + $aFreeLookups = MetaData::getByDocumentField($oField); + + $oTemplating = new KTTemplating; + $oTemplate = $oTemplating->loadTemplate("ktcore/metadata/conditional/conditional_ajax_masterfield"); + $aTemplateData = array( + "master_field_id" => $master_field_id, + "free_lookups" => $aFreeLookups, + ); + + return $oTemplate->render($aTemplateData); + + } + + + function do_getFieldFromSet() { + global $default; + + $fieldset_id = KTUtil::arrayGet($_REQUEST, 'fieldset_id'); + $field_id = KTUtil::arrayGet($_REQUEST, 'field_id'); + + if (empty($fieldset_id)) { + return "Ajax error: No fieldset specified."; + } + + if (empty($field_id)) { + return "Ajax error: No field specified."; + } + + + $oFieldset = KTFieldset::get($fieldset_id); + if (PEAR::isError($oFieldset)) { + return "Ajax error: No such fieldset (".$fieldset_id.")"; + } + + $oField = DocumentField::get($field_id); + if (PEAR::isError($oField)) { + return "Ajax error: No such field (".$field_id.")"; + } + + $master_field_id = $oFieldset->getMasterField(); + + + + $sQuery = "SELECT md_look.id AS lookup_id, md_look.name AS lookup_val FROM $default->metadata_table AS md_look + WHERE md_look.document_field_id = ?"; + $aParams = array($field_id); + $res = DBUtil::getResultArray(array($sQuery, $aParams)); + if (PEAR::isError($res)) { + return "Ajax Error (subselect for lookups)."; + } + + $sQuery = "SELECT md_cond.id AS rule_id, md_cond.name AS rule_name FROM $default->md_condition_table AS md_cond + WHERE md_cond.document_field_id = ? AND md_cond.name IS NOT NULL"; + $aParams = array($field_id); + $rulesets = DBUtil::getResultArray(array($sQuery, $aParams)); + if (PEAR::isError($rulesets)) { + return "Ajax Error (subselect for rulesets)."; + } + + + $oTemplating = new KTTemplating; + $oTemplate = $oTemplating->loadTemplate("ktcore/conditional_ajax_subfield"); + $aTemplateData = array( + "field_id" => $field_id, + "fieldset_id" => $fieldset_id, + "lookups" => $res, + "rulesets" => $rulesets, + ); + return $oTemplate->render($aTemplateData); + + } + +} + +$oDispatcher = new AjaxConditionalAdminDispatcher(); +$oDispatcher->dispatch(); + +?> diff --git a/presentation/lookAndFeel/knowledgeTree/administration/docfieldmanagement/conditional/manageConditionals.php b/presentation/lookAndFeel/knowledgeTree/administration/docfieldmanagement/conditional/manageConditionals.php new file mode 100644 index 0000000..657d484 --- /dev/null +++ b/presentation/lookAndFeel/knowledgeTree/administration/docfieldmanagement/conditional/manageConditionals.php @@ -0,0 +1,342 @@ +loadTemplate("ktcore/metadata/conditional/select_fieldset"); + $aTemplateData = array( + "available_fieldsets" => $aFieldsets, + ); + return $oTemplate->render($aTemplateData); + } + + // FIXME refactor this into do_editSimple(fieldset_id); + function do_editFieldset() { + $fieldset_id = KTUtil::arrayGet($_REQUEST, "fieldset_id"); + $oTemplating = new KTTemplating; + $oTemplate = $oTemplating->loadTemplate("ktcore/metadata/conditional/editsimple"); + /* alright: to "do" this we need at least: + * 1. the list of all the columns (id, name) and their available values. + * 2. the fieldset_id. + * we can then render in/out. Everything "intelligent" happens + * in AJAX (doing it with submits sucks arse. + * + * FIXME we fake it here with nested arrays... + */ + $oFieldset =& KTFieldset::get($fieldset_id); + $aFields =& $oFieldset->getFields(); + $aTemplateData = array( + "fieldset_id" => $fieldset_id, + "aFields" => $aFields, + "iMasterFieldId" => $aFields[0]->getId(), + ); + return $oTemplate->render($aTemplateData); + } + + + + /** DELETE FROM HERE. */ + + + function do_newMasterConditionSet() { + $fieldset_id = KTUtil::arrayGet($_REQUEST, 'fieldset_id'); + + if (empty($fieldset_id)) { + return $this->errorRedirectToMain("No fieldset specified."); + } + $oFieldset = KTFieldset::get($fieldset_id); + if (PEAR::isError($oFieldset)) { + return $this->errorRedirectToMain("Unable to open the specified fieldset."); + } + + + // now we need to get other fields in this set. + $aOtherFields = DocumentField::getList('parent_fieldset = '.$oFieldset->getId().' AND id != '.$oFieldset->getMasterField()); + if (PEAR::isError($aOtherFields)) { + $this->errorRedirectToMain("Failed to get field list for table."); + } + $oTemplating = new KTTemplating; + + $oTemplate = $oTemplating->loadTemplate("ktcore/metadata/conditional/new_masterset"); + $aTemplateData = array( + "fieldset_id" => $fieldset_id, + "other_fields" => $aOtherFields, + ); + return $oTemplate->render($aTemplateData); + } + + function do_newSubConditionSet() { + global $default; + $default->log->debug('SUBCONDITION CREATION: starting.'); + $fieldset_id = KTUtil::arrayGet($_REQUEST, 'fieldset_id'); + $starting_id = KTUtil::arrayGet($_REQUEST, 'starting_field'); // populated elsewhere. + + if (empty($fieldset_id)) { + return $this->errorRedirectToMain("No fieldset specified."); + } + if (empty($starting_id)) { + return $this->errorRedirectToMain("No field specified to start from."); + } + $default->log->debug('SUBCONDITION CREATION: extracted.'); + $oFieldset = KTFieldset::get($fieldset_id); + if (PEAR::isError($oFieldset)) { + return $this->errorRedirectToMain("Unable to open the specified fieldset."); + } + $default->log->debug('SUBCONDITION CREATION: validated.'); + + // now we need to get other fields in this set. + $aOtherFields = DocumentField::getList('parent_fieldset = '.$oFieldset->getId().' AND id != '.$oFieldset->getMasterField().' AND id != '.$starting_id); + if (PEAR::isError($aOtherFields)) { + $this->errorRedirectToMain("Failed to get field list for table."); + } + // FIXME we tableMappings. + $starting_lookup = DBUtil::getResultArray(array('SELECT id, name FROM metadata_lookup WHERE document_field_id = ? ', array($starting_id))); + if (PEAR::isError($starting_lookup)) { + return $this->errorRedirectToMain('invalid starting field.'); + } + $default->log->debug('SUBCONDITION CREATION: rendering.'); + $oTemplating = new KTTemplating; + + $oTemplate = $oTemplating->loadTemplate("ktcore/metadata/conditional/new_subchain"); + $aTemplateData = array( + "fieldset_id" => $fieldset_id, + "starting_field" => $starting_id, + "starting_lookup" => $starting_lookup, + "other_fields" => $aOtherFields, + ); + return $oTemplate->render($aTemplateData); + } + + + function handleOutput($data) { + global $main; + $main->bFormDisabled = true; + $main->setCentralPayload($data); + $main->render(); + } + + /* create a "master" (or root) condition for a fieldset. + * this _must_ be for a "masterfield". + */ + + function do_createMasterChain() { + global $default; + $default->log->debug("CREATE MASTER CHAIN: starting."); + + + // FIXME: delete EVERYTHING that chains FROM this item. + $fieldset_id = KTUtil::arrayGet($_REQUEST, 'fieldset_id'); + $rule_name = KTUtil::arrayGet($_REQUEST, 'rule_name'); + $base_lookup_id = KTUtil::arrayGet($_REQUEST, 'lookup_id'); // we ARE on the master field, this represents that. + + $default->log->debug("CREATE MASTER CHAIN: lookup_id " .print_r($lookup_id, true)); + + $fields_to_attach = KTUtil::arrayGet($_REQUEST, 'fields_to_attach'); // listed as fields_to_attach[], a list. + if (empty($fields_to_attach)) { + return $this->errorRedirectToMain("No fields specified."); + } else { + // get the list of fields, and their "chained" values. + // we key this by field. + $chained_direct_values = array(); + foreach ($fields_to_attach as $field_id) { + $chained_direct_values[$field_id] = array(); + // we now grab the appropriate values from the form. + // these will have been input as "direct_values_{$field_id} + $direct_values = KTUtil::arrayGet($_REQUEST, "direct_values_".$field_id); + if (empty($direct_values)) { + return $this->errorRedirectToMain("Missing input for field ".$field_id); + } else { + foreach ($direct_values as $lookup_id) { + // FIXME use MetaData::get() on these to verify their existence. + $chained_direct_values[$field_id][] = $lookup_id; + } + } + } + } + + $default->log->debug("CREATE MASTER CHAIN: lookup_id (2) " .print_r($lookup_id, true)); + $rulesets_to_attach = KTUtil::arrayGet($_REQUEST, 'rulesets_to_attach'); + + $oFieldset = KTFieldset::get($fieldset_id); + if (PEAR::isError($oFieldset)) { + return $this->errorRedirectToMain("Invalid Fieldset."); + } + + $resObj = MDConditionNode::createFromArray(array( + "iFieldId" => $oFieldset->getMasterField(), + "iLookupId" => $base_lookup_id, + "sName" => $rule_name, + )); + + $default->log->debug("CREATE MASTER CHAIN: created master chain node " .print_r($resObj, true)); + + $resObj2 = MDConditionChain::createFromArray(array( + "iParentCondition" => null, // this is a MASTER chain. + "iChildCondition" => $resObj->getId(), + )); + + // the id of this "master rule". + $master_rule_id = $resObj->getId(); + + // walk the connections to make, and ... + // NBM: please make this transactional... + foreach ($chained_direct_values as $field_id => $lookup_ids) { + foreach ($lookup_ids as $lookup_id) { + $lookupCreation = MDConditionNode::createFromArray(array( + "iFieldId" => $field_id, + "iLookupId" => $lookup_id, + )); + if (PEAR::isError($lookupCreation)) { + return $this->errorRedirectToMain("Error creating link to ".$field_id." => ".$lookup_id); + } + $lookupChain = MDConditionChain::createFromArray(array( + "iParentCondition" => $master_rule_id, + "iChildCondition" => $lookupCreation->getId(), + )); + if (PEAR::isError($lookupChain)) { + return $this->errorRedirectToMain("Error creating link to ".$field_id." => ".$lookup_id); + } + } + } + if (!empty($rulesets_to_attach)) { + foreach ($rulesets_to_attach as $child_ruleset) { + $lookupChain = MDConditionChain::createFromArray(array( + "iParentCondition" => $master_rule_id, + "iChildCondition" => $child_ruleset, + )); + if (PEAR::isError($lookupChain)) { + return $this->errorRedirectToMain("Error creating link to ruleset ".$child_ruleset); + } + } + } + $default->log->debug("CREATE MASTER CHAIN: done."); + return $this->errorRedirectToMain("Created ruleset."); + } + + function do_createSubChain() { + global $default; + $default->log->debug("CREATE SB CHAIN: starting."); + + + // FIXME: delete EVERYTHING that chains FROM this item. + $fieldset_id = KTUtil::arrayGet($_REQUEST, 'fieldset_id'); + $starting_id = KTUtil::arrayGet($_REQUEST, 'starting_field'); + $rule_name = KTUtil::arrayGet($_REQUEST, 'rule_name'); + + if (empty($fieldset_id)) { + return $this->errorRedirectToMain('No fieldset specified.'); + } + if (empty($rule_name)) { + return $this->errorRedirectToMain('Sub-rules MUST have a name specified.'); + } + if (empty($starting_id)) { + return $this->errorRedirectToMain('Must indicate which fieldset to start with.'); + } + + $base_lookup_id = KTUtil::arrayGet($_REQUEST, 'lookup_id'); // we NEED TO KNOW which is the "base" element. + + $default->log->debug("CREATE SB CHAIN: lookup_id " .print_r($base_lookup_id, true)); + + // these are the next layers of rules to attach. + $fields_to_attach = KTUtil::arrayGet($_REQUEST, 'fields_to_attach'); // listed as fields_to_attach[], a list. + $default->log->debug("CREATE SB CHAIN: fields_to_attach " .print_r($fields_to_attach, true)); + if (empty($fields_to_attach)) { + return $this->errorRedirectToMain("No fields specified."); + } else { + // get the list of fields, and their "chained" values. + // we key this by field. + $chained_direct_values = array(); + foreach ($fields_to_attach as $field_id) { + $chained_direct_values[$field_id] = array(); + // we now grab the appropriate values from the form. + // these will have been input as "direct_values_{$field_id} + $direct_values = KTUtil::arrayGet($_REQUEST, "direct_values_".$field_id); + if (empty($direct_values)) { + return $this->errorRedirectToMain("Missing input for field ".$field_id); + } else { + foreach ($direct_values as $lookup_id) { + // FIXME use MetaData::get() on these to verify their existence. + $chained_direct_values[$field_id][] = $lookup_id; + } + } + } + } + + $default->log->debug("CREATE SB CHAIN: lookup_id (2) " .print_r($lookup_id, true)); + $rulesets_to_attach = KTUtil::arrayGet($_REQUEST, 'rulesets_to_attach'); + + $oFieldset = KTFieldset::get($fieldset_id); + if (PEAR::isError($oFieldset)) { + return $this->errorRedirectToMain("Invalid Fieldset."); + } + + $resObj = MDConditionNode::createFromArray(array( + "iFieldId" => $starting_id, + "iLookupId" => $base_lookup_id, + "sName" => $rule_name, + )); + + $default->log->debug("CREATE SB CHAIN: created master chain node " .print_r($resObj, true)); + + // WE DON'T CREATE A PARENT-CHAIN ... this one must be picked up by other nodes. + + // the id of this "master rule". + $master_rule_id = $resObj->getId(); + + // walk the connections to make, and ... + // NBM: please make this transactional... + foreach ($chained_direct_values as $field_id => $lookup_ids) { + foreach ($lookup_ids as $lookup_id) { + $lookupCreation = MDConditionNode::createFromArray(array( + "iFieldId" => $field_id, + "iLookupId" => $lookup_id, + )); + if (PEAR::isError($lookupCreation)) { + return $this->errorRedirectToMain("Error creating link to ".$field_id." => ".$lookup_id); + } + $lookupChain = MDConditionChain::createFromArray(array( + "iParentCondition" => $master_rule_id, + "iChildCondition" => $lookupCreation->getId(), + )); + if (PEAR::isError($lookupChain)) { + return $this->errorRedirectToMain("Error creating link to ".$field_id." => ".$lookup_id); + } + } + } + if (!empty($rulesets_to_attach)) { + foreach ($rulesets_to_attach as $child_ruleset) { + $lookupChain = MDConditionChain::createFromArray(array( + "iParentCondition" => $master_rule_id, + "iChildCondition" => $child_ruleset, + )); + if (PEAR::isError($lookupChain)) { + return $this->errorRedirectToMain("Error creating link to ruleset ".$child_ruleset); + } + } + } + $default->log->debug("CREATE SB CHAIN: done."); + return $this->errorRedirectToMain("Created ruleset."); + } + +} + +$oDispatcher = new ManageConditionalDispatcher(); +$oDispatcher->dispatch(); + +?> -- libgit2 0.21.4