diff --git a/edit.php b/edit.php index 4443d78..183aa57 100644 --- a/edit.php +++ b/edit.php @@ -326,9 +326,13 @@ class KTEditDocumentDispatcher extends KTStandardDispatcher { // to get all fields, we merge repeatedly from KTFieldset::get $field_values = array(); + + // i hate conditionality + $condy_fs = array(); foreach ($fieldsets as $oFieldSet) { $fields =& $oFieldSet->getFields(); - + $isRealConditional = ($oFieldSet->getIsConditional() && KTMetadataUtil::validateCompleteness($oFieldSet)); + $condy_fs[$oFieldSet->getId()] = $isRealConditional; // FIXME this doesn't handle multi-fieldset fields - are they possible/meaningful? foreach ($fields as $oField) { $field_values[$oField->getID()] = array($oField, null); @@ -337,7 +341,11 @@ class KTEditDocumentDispatcher extends KTStandardDispatcher { foreach ($current_md as $oFieldLink) { + // we mustn't copy "old" values for conditional fieldsets. it breaks unset-set fields. + if (!$condy_fs[$field_values[$oFieldLink->getDocumentFieldID()][0]->getParentFieldsetId()]) { $field_values[$oFieldLink->getDocumentFieldID()][1] = $oFieldLink->getValue(); + } + } diff --git a/lib/documentmanagement/documentutil.inc.php b/lib/documentmanagement/documentutil.inc.php index 15d44f0..faf620a 100644 --- a/lib/documentmanagement/documentutil.inc.php +++ b/lib/documentmanagement/documentutil.inc.php @@ -248,9 +248,10 @@ class KTDocumentUtil { foreach ($aFieldsets as $oFieldset) { $aFields =& $oFieldset->getFields(); $aFieldValues = array(); + $isRealConditional = ($oFieldset->getIsConditional() && KTMetadataUtil::validateCompleteness($oFieldset)); foreach ($aFields as $oField) { $v = KTUtil::arrayGet($aSimpleMetadata, $oField->getId()); - if ($oField->getIsMandatory()) { + if ($oField->getIsMandatory() && !$isRealConditional) { if (empty($v)) { // XXX: What I'd do for a setdefault... $aFailed["field"][$oField->getId()] = 1; @@ -260,12 +261,13 @@ class KTDocumentUtil { $aFieldValues[$oField->getId()] = $v; } } - if ($oFieldset->getIsConditional() && KTMetadataUtil::validateCompleteness($oFieldset)) { + + if ($isRealConditional) { $res = KTMetadataUtil::getNext($oFieldset, $aFieldValues); if ($res) { $aFailed["fieldset"][$oFieldset->getId()] = 1; - } - } + } + } } if (!empty($aFailed)) { return new KTMetadataValidationError($aFailed); diff --git a/lib/metadata/metadatautil.inc.php b/lib/metadata/metadatautil.inc.php index c79557b..0f5523f 100644 --- a/lib/metadata/metadatautil.inc.php +++ b/lib/metadata/metadatautil.inc.php @@ -88,6 +88,10 @@ class KTMetadataUtil { } else { $oL = $aCurrentSelections[$iThisFieldId]; } $oInstance = KTValueInstance::getByLookupAndParentBehaviour($oL, $oBehaviour); + if (is_null($oInstance)) { + // somehow an invalid value hit us here. + continue; + } $GLOBALS['default']->log->debug('KTMetadataUtil::_getNextForBehaviour, instance is ' . print_r($oInstance, true)); $nextBehaviour = $oInstance->getBehaviourId(); // may be NULL @@ -169,7 +173,8 @@ class KTMetadataUtil { $field = $oMasterField->getId(); $val = $aCurrentSelections[$field]; $lookup = MetaData::getByValueAndDocumentField($val, $field); - + + //var_dump($lookup); exit(0); $oValueInstance = KTValueInstance::getByLookupSingle($lookup); if (PEAR::isError($oValueInstance) || is_null($oValueInstance) || ($oValueInstance === false)) { return true; } // throw an error $aValues = KTMetadataUtil::_getNextForBehaviour($oValueInstance->getBehaviourId(), $aCurrentSelections); @@ -528,10 +533,22 @@ class KTMetadataUtil { $GLOBALS['default']->log->debug("Number of value instances for master field: $iCount"); if ($iCount == 0) { $GLOBALS['default']->log->debug("Number of value instances for master field is zero, failing"); - return PEAR::raiseError("Master field has no selectable values"); + return PEAR::raiseError(_kt("Master field has no values which are assigned to behaviours.")); } $GLOBALS['default']->log->debug("Number of value instances for master field is positive, continuing"); + // fix for KTS-1023 + // check that each master-field value has a valueinstance assigned. + $sTable = KTUtil::getTableName('metadata_lookup'); + $aQuery = array( + "SELECT COUNT(id) AS cnt FROM $sTable WHERE document_field_id = ?", + array($iMasterFieldId), + ); + $iValCount = DBUtil::getOneResultKey($aQuery, 'cnt'); + if ($iValCount != $iCount) { + return PEAR::raiseError(sprintf(_kt('%d values for the Master Field are not assigned to behaviours.'), ($iValCount - $iCount))); + } + /* * Plan: For each behaviour that is assigned on the system, * ensure that it allows at least one value instance in each of @@ -567,14 +584,16 @@ class KTMetadataUtil { ); $aFields = DBUtil::getResultArrayKey($aQuery, 'field_id'); $GLOBALS['default']->log->debug(" actual fields are " . print_r($aNextFields, true)); + /* foreach ($aNextFields as $iFieldId) { - /*if (!in_array($iFieldId, $aFields)) { + if (!in_array($iFieldId, $aFields)) { $GLOBALS['default']->log->debug(" field $iFieldId is not included, failing"); $oChildField =& DocumentField::get($iFieldId); $sChildFieldName = $oChildField->getName(); return PEAR::raiseError("Child field $sChildFieldName of parent field $sParentFieldName has no selectable values in behaviour $sBehaviourHumanName ($sBehaviourName)"); - }*/ + } + */ } $GLOBALS['default']->log->debug("Got through: passed!"); return true; diff --git a/lib/metadata/valueinstance.inc.php b/lib/metadata/valueinstance.inc.php index 95882b7..1cd3ce3 100644 --- a/lib/metadata/valueinstance.inc.php +++ b/lib/metadata/valueinstance.inc.php @@ -108,6 +108,9 @@ class KTValueInstance extends KTEntity { $GLOBALS['default']->log->error('KTValueInstance::getByLookupAndParentBehaviour: error from db is: ' . print_r($iId, true)); return $iId; } + if (is_null($iId)) { + return null; + } $GLOBALS['default']->log->debug('KTValueInstance::getByLookupAndParentBehaviour: id of instance is ' . $iId); if (KTUtil::arrayGet($aOptions, 'ids')) { return $iId; diff --git a/plugins/ktcore/admin/documentFields.php b/plugins/ktcore/admin/documentFields.php index 28ec9db..dbd8f52 100755 --- a/plugins/ktcore/admin/documentFields.php +++ b/plugins/ktcore/admin/documentFields.php @@ -497,7 +497,8 @@ class KTDocumentFieldDispatcher extends KTAdminDispatcher { $res = DBUtil::runQuery($aQuery); //$this->addInfoMessage('behaviours: ' . print_r($res, true)); } - + KTEntityUtil::clearAllCaches('KTFieldBehaviour'); + KTEntityUtil::clearAllCaches('KTValueInstance'); $res = $oFieldset->update(); if (PEAR::isError($res) || ($res === false)) { $this->errorRedirectTo('edit', _kt('Could not stop being conditional'), 'fFieldsetId=' . $oFieldset->getId()); @@ -657,6 +658,7 @@ class KTDocumentFieldDispatcher extends KTAdminDispatcher { // {{{ do_changeToSimple function do_changeToSimple() { + $this->startTransaction(); $oFieldset =& $this->oValidator->validateFieldset($_REQUEST['fFieldsetId']); $oFieldset->setIsComplex(false); $res = $oFieldset->update(); @@ -664,6 +666,36 @@ class KTDocumentFieldDispatcher extends KTAdminDispatcher { 'redirect_to' => array('manageConditional', 'fFieldsetId=' . $oFieldset->getId()), 'message' => _kt('Error changing to simple'), )); + + $aFields = DocumentField::getByFieldset($oFieldset); + if (!empty($aFields)) { + $aFieldIds = array(); + foreach ($aFields as $oField) { $aFieldIds[] = $oField->getId(); } + + // value instances + $sTable = KTUtil::getTableName('field_value_instances'); + $aQuery = array( + "DELETE FROM $sTable WHERE field_id IN (" . DBUtil::paramArray($aFieldIds) . ")", + $aFieldIds, + ); + $res = DBUtil::runQuery($aQuery); + //$this->addInfoMessage('value instances: ' . print_r($res, true)); + + // behaviours + $sTable = KTUtil::getTableName('field_behaviours'); + $aQuery = array( + "DELETE FROM $sTable WHERE field_id IN (" . DBUtil::paramArray($aFieldIds) . ")", + $aFieldIds, + ); + $res = DBUtil::runQuery($aQuery); + //$this->addInfoMessage('behaviours: ' . print_r($res, true)); + } + $this->oValidator->notError($res, array( + 'redirect_to' => array('manageConditional', 'fFieldsetId=' . $oFieldset->getId()), + 'message' => _kt('Error changing to simple'), + )); + KTEntityUtil::clearAllCaches('KTFieldBehaviour'); + KTEntityUtil::clearAllCaches('KTValueInstance'); $this->successRedirectTo('manageConditional', _kt('Changed to simple'), 'fFieldsetId=' . $oFieldset->getId()); } // }}} diff --git a/templates/ktcore/metadata/conditional/manageConditional.smarty b/templates/ktcore/metadata/conditional/manageConditional.smarty index b295638..fba016e 100644 --- a/templates/ktcore/metadata/conditional/manageConditional.smarty +++ b/templates/ktcore/metadata/conditional/manageConditional.smarty @@ -18,9 +18,9 @@ how the user was allowed to select the specific street (given another field).{/i {if $sIncomplete}

{i18n}This conditional fieldset is marked such that it -cannot be used. This happens when the fieldset has been edited and has -not been set to complete. Setting the fieldset to complete will do a -check to see if the fieldset is usable by the user.{/i18n}

+cannot be used. The system automatically checks whether the fieldset is useable, +and if not it will prevent it being used in a "conditional" fashion. Please correct +the issues identified below.{/i18n}

{/if}