diff --git a/lib/metadata/fieldset.inc.php b/lib/metadata/fieldset.inc.php index 05b5446..d92a43b 100644 --- a/lib/metadata/fieldset.inc.php +++ b/lib/metadata/fieldset.inc.php @@ -186,6 +186,18 @@ class KTFieldset extends KTEntity { ), $aOptions); } + function &getConditionalFieldsets($aOptions = null) { + $aOptions = KTUtil::meldOptions( + $aOptions, + array('multi' => true,) + ); + return KTEntityUtil::getByDict('KTFieldset', array( + 'is_conditional' => true, + 'disabled' => false, + ), $aOptions); + } + + function &getForDocumentType($oDocumentType, $aOptions = null) { $bIds = KTUtil::arrayGet($aOptions, 'ids'); if (is_object($oDocumentType)) { diff --git a/lib/metadata/fieldsetregistry.inc.php b/lib/metadata/fieldsetregistry.inc.php index 183362e..9ccfad1 100644 --- a/lib/metadata/fieldsetregistry.inc.php +++ b/lib/metadata/fieldsetregistry.inc.php @@ -92,7 +92,7 @@ class KTFieldsetRegistry { * */ function getHtmlFields($oFieldset, $idPre = 'metadata_') { - $fields = $oFieldset->getFields(); + $fields = $oFieldset->getFields(); $textAreaIds = array(); foreach($fields as $field) { @@ -103,7 +103,6 @@ class KTFieldsetRegistry { return $textAreaIds; } - /* * Returns an array of fieldIds which belong to a generic fieldset @@ -156,6 +155,11 @@ class KTFieldsetRegistry { } foreach ($newfields as $oField) { + // If a conditional field hasn't been set up properly this will throw errors. + // TODO: display a message indicating that admin must complete the setup. + if (PEAR::isError($oField)) { + continue; + } $fname = 'metadata_' . $oField->getId(); $value = null; diff --git a/plugins/ktcore/KTWidgets.php b/plugins/ktcore/KTWidgets.php index 5ba2dd4..039df70 100644 --- a/plugins/ktcore/KTWidgets.php +++ b/plugins/ktcore/KTWidgets.php @@ -973,7 +973,8 @@ class KTCoreTextAreaWidget extends KTWidget { $oTemplate = $oTemplating->loadTemplate('ktcore/forms/widgets/base'); $this->aJavascript[] = 'thirdpartyjs/jquery/jquery-1.3.2.js'; - $this->aJavascript[] = 'thirdpartyjs/tinymce/jscripts/tiny_mce/tiny_mce.js'; + $this->aJavascript[] = 'thirdpartyjs/jquery/jquery_noconflict.js'; + $this->aJavascript[] = 'thirdpartyjs/tinymce/jscripts/tiny_mce/tiny_mce.js'; $this->aJavascript[] = 'resources/js/kt_tinymce_init.js'; if (!empty($this->aJavascript)) { diff --git a/plugins/multiselect/BulkUpload.php b/plugins/multiselect/BulkUpload.php index d215a85..1df050b 100644 --- a/plugins/multiselect/BulkUpload.php +++ b/plugins/multiselect/BulkUpload.php @@ -141,7 +141,8 @@ class InetBulkUploadFolderAction extends KTFolderAction { $aJavascript[] = 'thirdpartyjs/tinymce/jscripts/tiny_mce/tiny_mce.js'; $aJavascript[] = 'resources/js/kt_tinymce_init.js'; $aJavascript[] = 'thirdpartyjs/tinymce/jscripts/tiny_mce/jquery.tinymce.js'; - + $aJavascript[] = 'resources/js/conditional_selection.js'; + $this->oPage->requireJSResources($aJavascript); //FIXME: Might really not need to load these styles, will check l8r diff --git a/presentation/lookAndFeel/knowledgeTree/ajaxConditional.php b/presentation/lookAndFeel/knowledgeTree/ajaxConditional.php index 2918bac..6ba0cf4 100644 --- a/presentation/lookAndFeel/knowledgeTree/ajaxConditional.php +++ b/presentation/lookAndFeel/knowledgeTree/ajaxConditional.php @@ -45,6 +45,11 @@ require_once(KT_LIB_DIR . "/util/ktutil.inc"); require_once(KT_LIB_DIR . "/dispatcher.inc.php"); require_once(KT_LIB_DIR . '/widgets/fieldsetDisplay.inc.php'); +require_once(KT_LIB_DIR . "/metadata/fieldsetregistry.inc.php"); +require_once(KT_LIB_DIR . "/widgets/widgetfactory.inc.php"); +require_once(KT_LIB_DIR . "/validation/validatorfactory.inc.php"); + + /* * example code - tests the frontend behaviour. remember to check ajaxConditional.php * @@ -102,6 +107,82 @@ class AjaxConditionalDispatcher extends KTStandardDispatcher { return $sWidgets; } + + + + + function _getFieldIdForMetadataId($iMetadata) { + $sTable = 'metadata_lookup'; + $sQuery = "SELECT document_field_id FROM " . $sTable . " WHERE id = ?"; + $aParams = array($iMetadata); + + $res = DBUtil::getOneResultKey(array($sQuery, $aParams), 'document_field_id'); + if (PEAR::isError($res)) { + return false; + } + return $res; + } + + //http://localhost/knowledgetree/presentation/lookAndFeel/knowledgeTree/ajaxConditional.php?action=getConditionalData&masterid=6&type=connections + //http://localhost/knowledgetree/presentation/lookAndFeel/knowledgeTree/ajaxConditional.php?action=getConditionalData&masterid=6&type=lookups + //$type can be lookups or connections + function do_getConditionalData(){ + $iMetadata = $_GET['masterid']; + $type = $_GET['type']; + + $oFReg =& KTFieldsetRegistry::getSingleton(); + $oFieldSets = KTFieldset::getConditionalFieldsets(); + + foreach ($oFieldSets as $oFieldset) { + + $aLookups = array(); + $aConnections = array(); + + foreach($oFieldset->getFields() as $oField) { + $c = array(); + + foreach($oField->getEnabledValues() as $oMetadata) { + $a = array(); + // print '
';
+    
+    		    $nvals = KTMetadataUtil::getNextValuesForLookup($oMetadata->getId());
+    		    if($nvals) {
+    			foreach($nvals as $i=>$aVals) {
+    			    $a = array_merge($a, $aVals);
+    
+    			    foreach($aVals as $id) {
+    			      $field = $this->_getFieldIdForMetadataId($id);
+    			      // print 'id ' . $id . ' is in field ' . $field . "
"; + if(!in_array($field, $c)) { + $c[] = $field; + } + } + } + } + + $aLookups[$oMetadata->getId()] = $a; + } + $aConnections[$oField->getId()] = $c; + } + + //exit(0); + + $oJSON = new Services_JSON; + switch ($type) { + case 'lookups': + return $oJSON->encode($aLookups); + break; + case 'connections' : + return $oJSON->encode($aConnections); + break; + default: + return $oJSON->encode($aLookups); + } + + return false; + } + } + } $oDispatcher = new AjaxConditionalDispatcher(); diff --git a/resources/js/conditional_selection.js b/resources/js/conditional_selection.js index df27143..3de601f 100644 --- a/resources/js/conditional_selection.js +++ b/resources/js/conditional_selection.js @@ -1,4 +1,6 @@ -// 'lookups' and 'connections' are produced by the master conditional widget +// depricated: 'lookups' and 'connections' are produced by the master conditional widget +// 'lookups' and 'connections' are now dynamically callable via ajax request to get a json response + var NOSELECTION = 'No selection.'; function ConditionalSelection() { @@ -27,135 +29,159 @@ function getId(elm) { ConditionalSelection.prototype = { 'initialize' : function(masterId) { + // make clones of the original nodes to keep the options in var fieldLookups = {}; var current = {}; + + /* var lookups = eval('lookups_' + masterId); var connections = eval('connections_' + masterId); - - // initialize - build various tables - forEach(getElementsByTagAndClassName(null, 'is_conditional_' + masterId), - function(elm) { - var fieldId = getId(elm); - for(var i=0; i