From 33d3d131b7fb7f5d4ab643a5ae71f075edf14c4d Mon Sep 17 00:00:00 2001 From: Bryn Divey Date: Fri, 11 Aug 2006 10:47:14 +0000 Subject: [PATCH] Moved criteria into namespace oriented registry --- lib/browse/Criteria.inc | 352 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------------------------------------------------------------------------------------------------------------------- lib/browse/PartialQuery.inc.php | 12 ++++++------ lib/browse/criteriaregistry.php | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ lib/documentmanagement/DocumentField.inc | 38 ++++++++++++++++++++++++-------------- lib/plugins/plugin.inc.php | 12 ++++++++++++ lib/search/searchutil.inc.php | 3 ++- lib/upgrades/UpgradeFunctions.inc.php | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ plugins/ktcore/KTCorePlugin.php | 19 +++++++++++++++++-- plugins/ktcore/admin/conditions.php | 11 +++++++---- plugins/ktcore/admin/savedSearch.php | 13 ++++++++----- resources/js/constructed_search.js | 1 + search/ajaxBooleanSearch.php | 5 ++++- search/booleanSearch.php | 16 +++++++++------- templates/ktcore/boolean_search.smarty | 9 ++------- templates/ktcore/boolean_search_change.smarty | 4 ++-- templates/ktcore/boolean_search_edit.smarty | 4 ++-- 16 files changed, 463 insertions(+), 188 deletions(-) create mode 100644 lib/browse/criteriaregistry.php diff --git a/lib/browse/Criteria.inc b/lib/browse/Criteria.inc index 9cdb02d..e84b68f 100644 --- a/lib/browse/Criteria.inc +++ b/lib/browse/Criteria.inc @@ -1,15 +1,4 @@ sDisplay =& $sDisplay; - $this->sDocumentField =& $sDocumentField; - $this->sSortField =& $sSortField; - $this->iID = $iID; + var $sDocumentField = null; + var $sSortField = null; + var $sNamespace = null; + + function BrowseCriterion() { + $this->sDisplay = ''; } + function headerDisplay () { return $this->sDisplay; } - // dummy function + + // for final display function documentDisplay ($oDocument) { return $this->sDisplay; } @@ -157,6 +163,10 @@ class BrowseCriterion { function getID() { return $this->iID; } + + function getNameSpace() { + return $this->sNamespace; + } function setOptions($aOptions) { $this->aOptions = $aOptions; @@ -171,7 +181,10 @@ class BrowseCriterion { // !#@&)*( (*&!@# *(&@NOT (*&!@# $k = array_keys($aPreValue); $k = $this->getWidgetBase(); - $preval = $aPreValue[$k]; + + if(array_key_exists($k, $aPreValue)) { + $preval = $aPreValue[$k]; + } return $this->getNotWidget($aPreValue) . "getWidgetBase() . "\" value=\"" . $preval . "\"/>"; } else { return $this->getNotWidget($aPreValue) . "getWidgetBase() . "\" />"; @@ -188,8 +201,10 @@ class BrowseCriterion { if (is_null($aPreValue)) { $is_positive = true; } else { - $preval = KTUtil::arrayGet($aPreValue, $form_name, "0"); // by default, use "is" not "is not" - $is_positive = ($preval == "0"); // 0 or empty or similar. + if(array_key_exists($form_name, $aPreValue)) { + $preval = KTUtil::arrayGet($aPreValue, $form_name, "0"); // by default, use "is" not "is not" + } + $is_positive = ($preval == "0"); // 0 or empty or similar. } if ($is_positive) { $pos_select = ' selected="true"'; @@ -208,7 +223,7 @@ class BrowseCriterion { } function getWidgetBase () { - return "bmd" . strtr($this->getID(), '-', '_'); + return strtr($this->getNamespace(), '-', '_'); } function getSearchTable() { @@ -242,12 +257,21 @@ class BrowseCriterion { } } + class NameCriterion extends BrowseCriterion { var $bFolderCriterion = true; var $bString = true; var $sSearchTable = "DC"; var $bContains = true; + var $sDocumentField = 'filename'; + var $sSortField = 'filename'; + var $sNamespace = 'ktcore.criteria.name'; + + function NameCriterion() { + $this->sDisplay = _kt('Name'); + } + function documentDisplay ($oDocument) { $aOptions = $this->aOptions; if (array_key_exists('displayFullPath', $aOptions)) { @@ -279,6 +303,13 @@ class NameCriterion extends BrowseCriterion { class IDCriterion extends BrowseCriterion { var $bFolderCriterion = true; + var $sDocumentField = 'id'; + var $sSortField = 'id'; + var $sNamespace = 'ktcore.criteria.id'; + + function IDCriterion() { + $this->sDisplay = _kt('Document ID'); + } function documentDisplay ($oDocument) { return $oDocument->getID(); } @@ -292,6 +323,13 @@ class TitleCriterion extends BrowseCriterion { var $bString = true; var $sSearchTable = "DM"; var $bContains = true; + var $sDocumentField = 'name'; + var $sSortField = 'name'; + var $sNamespace = 'ktcore.criteria.title'; + + function TitleCriterion() { + $this->sDisplay = _kt('Title'); + } function documentDisplay ($oDocument) { return $oDocument->getName(); @@ -312,6 +350,13 @@ class CreatorCriterion extends BrowseCriterion { "table" => "users", "field" => "name", ); + var $sDocumentField = 'creator_id'; + var $sSortField = 'creator_id'; + var $sNamespace = 'ktcore.criteria.creator'; + + function CreatorCriterion() { + $this->sDisplay = _kt('Creator'); + } function documentDisplay ($oDocument) { $oCreator = User::get($oDocument->getCreatorID()); @@ -346,6 +391,14 @@ class CreatorCriterion extends BrowseCriterion { class DateCreatedCriterion extends BrowseCriterion { var $sSearchTable = "D"; + var $sDocumentField = 'created'; + var $sSortField = 'created'; + var $sNamespace = 'ktcore.criteria.datecreated'; + + function DateCreatedCriterion() { + $this->sDisplay = _kt('Date Created'); + } + function documentDisplay ($oDocument) { return $oDocument->getCreatedDateTime(); } @@ -419,6 +472,13 @@ class DocumentTypeCriterion extends BrowseCriterion { "table" => "document_types_lookup", "field" => "name" ); + var $sDocumentField = 'document_type_id'; + var $sSortField = 'document_type_id'; + var $sNamespace = 'ktcore.criteria.documenttype'; + + function DocumentTypeCriterion() { + $this->sDisplay = _kt('Document Type'); + } function documentDisplay ($oDocument) { $oDocumentType = DocumentType::get($oDocument->getDocumentTypeID()); @@ -456,15 +516,25 @@ class GenericMetadataCriterion extends BrowseCriterion { "joinColumn" => "document_id", ); var $bString = true; + var $sDocumentField = null; + var $sSortField = null; + var $sNamespace = 'ktcore.criteria.generic'; + + function initialize($sDisplay, $sDocumentField, $sSortField, $iID, $sNamespace) { + $this->sDisplay = $sDisplay; + $this->sDocumentField = $sDocumentField; + $this->sSortField = $sSortField; - function GenericMetadataCriterion ($sDisplay, $sDocumentField, $sSortField, $iID) { $this->iID = $iID; - $this->BrowseCriterion($sDisplay, $sDocumentField, $sSortField, $iID); $this->aLookup['whereClause'] = 'document_field_id = ' . $iID; - $this->oField =& DocumentField::get($iID); + $this->oField = DocumentField::get($iID); + $this->sNamespace = $sNamespace; $this->sSearchTable = "DFL" . $iID; } + function getID() { + return $this->iID; + } function documentDisplay ($oDocument) { global $default; $sQuery = "SELECT DFL.value as value " . @@ -499,6 +569,7 @@ class GenericMetadataCriterion extends BrowseCriterion { $k = $this->getWidgetBase(); $preval = $aPreValue[$k]; } + // If there's no lookup, just use the standard text input if ($this->oField->getHasLookup() == false) { $this->bContains = true; // contains @@ -542,24 +613,38 @@ class GenericMetadataCriterion extends BrowseCriterion { } class DateModifiedCriterion extends DateCreatedCriterion { - function documentDisplay ($oDocument) { - return $oDocument->getLastModifiedDate(); + var $sDocumentField = 'modified'; + var $sSortField = 'modified'; + var $sNamespace = 'ktcore.criteria.datemodified'; + + function DateModifiedCriterion() { + $this->sDisplay = _kt('Date Modified'); } + function getName() { - return "datemodified"; + return 'datemodified'; + } + + function documentDisplay ($oDocument) { + return $oDocument->getLastModifiedDate(); } } class SizeCriterion extends BrowseCriterion { var $sSearchTable = "DC"; var $bVisible = false; + var $sDocumentField = 'size'; + var $sSortField = 'size'; + var $sNamespace = 'ktcore.criteria.size'; + + function SizeCriterion() { + $this->sDisplay = _kt('File Size'); + } function documentDisplay ($oDocument) { return $oDocument->getFileSize(); } - function getName() { - return "size"; - } + function searchDisplay($aRequest) { return ""; } @@ -570,7 +655,13 @@ class ContentCriterion extends BrowseCriterion { var $bHandleNot = false; var $bString = true; var $sSearchTable = "DT"; - var $sDocumentField = "document_text"; + var $sDocumentField = 'document_text'; + var $sSortField = 'content'; + var $sNamespace = 'ktcore.criteria.content'; + + function ContentCriterion() { + $this->sDisplay = _kt('Document Text'); + } function documentDisplay ($oDocument) { return "Document Text"; @@ -635,6 +726,14 @@ class ContentCriterion extends BrowseCriterion { class WorkflowStateCriterion extends BrowseCriterion { var $sSearchTable = "DM"; + var $sDocumentField = 'state'; + var $sSortField = 'state'; + var $sNamespace = 'ktcore.criteria.workflowstate'; + + function WorkflowStateCriterion() { + $this->sDisplay = _kt('Workflow State'); + } + function documentDisplay ($oDocument) { $oState =& KTWorkflowState::getByDocument($oDocument); if ($oState) { @@ -689,6 +788,14 @@ class WorkflowStateCriterion extends BrowseCriterion { class DiscussionTextCriterion extends BrowseCriterion { var $bContains = true; var $bHandleNot = false; + var $sDocumentField = 'discussiontext'; + var $sSortField = 'discussiontext'; + var $sNamespace = 'ktcore.criteria.discussiontext'; + + function DiscussionTextCriterion() { + $this->sDisplay = _kt('Discussion Threads'); + } + function documentDisplay ($oDocument) { return "Discussion Threads"; @@ -750,6 +857,12 @@ class SearchableTextCriterion extends BrowseCriterion { var $bString = true; var $sSearchTable = "DST"; var $sDocumentField = "document_text"; + var $sSortField = 'searchable_text'; + var $sNamespace = 'ktcore.criteria.searchabletext'; + + function SearchableTextCriterion() { + $this->sDisplay = _kt('Simple Search Text'); + } function documentDisplay ($oDocument) { return "Simple search text"; @@ -817,6 +930,13 @@ class SearchableTextCriterion extends BrowseCriterion { class TransactionTextCriterion extends BrowseCriterion { var $bContains = true; var $bHandleNot = false; + var $sDocumentField = 'transactiontext'; + var $sSortField = 'transactiontext'; + var $sNamespace = 'ktcore.criteria.transactiontext'; + + function TransactionTextCriterion() { + $this->sDisplay = _kt('Transaction Text'); + } function documentDisplay ($oDocument) { return "Transaction text"; @@ -871,121 +991,79 @@ class TransactionTextCriterion extends BrowseCriterion { } } -class Criteria { + + +class DateCreatedDeltaCriterion extends DateCreatedCriterion { + var $sDocumentField = 'created'; + var $sSortField = 'created'; + var $aTypes = array('MINUTE'=>'Minutes', + 'HOUR'=>'Hours', + 'DAY'=>'Days', + 'MONTH'=>'Months', + 'YEAR'=>'Years'); + var $sNamespace = 'ktcore.criteria.datecreateddelta'; + + function DateCreatedDeltaCriterion() { + $this->sDisplay = _kt('Date Created Delta'); + } - function &_getBaseCriterionByNumber($iID) { - global $default; - switch ($iID) { - case -1: - $oCriterion =& new NameCriterion(_kt("Name"), 'filename', 'filename', -1); - break; - case -2: - $oCriterion =& new TitleCriterion(_kt("Title"), 'name', 'name', -2); - break; - case -3: - $oCriterion =& new CreatorCriterion(_kt("Creator"), 'creator_id', 'creator_id', -3); - break; - case -4: - $oCriterion =& new DateCreatedCriterion(_kt("Date Created"), 'created', 'created', -4); - break; - case -5: - $oCriterion =& new DocumentTypeCriterion(_kt("Document Type"), 'document_type_id', 'document_type_id', -5); - break; - case -6: - $oCriterion =& new IDCriterion(_kt("Document ID"), 'id', 'id', -6); - break; - case -7: - $oCriterion =& new DateModifiedCriterion(_kt("Date Modified"), 'modified', 'modified', -7); - break; - case -8: - $oCriterion =& new SizeCriterion(_kt("File Size"), 'size', 'size', -8); - break; - case -9: - $oCriterion =& new ContentCriterion(_kt("Document Text"), 'content', 'content', -9); - break; - case -10: - $oCriterion =& new WorkflowStateCriterion(_kt("Workflow state"), 'state', 'state', -10); - break; - case -11: - $oCriterion =& new TransactionTextCriterion(_kt("Transaction Text"), 'transactiontext', 'transactiontext', -11); - break; - case -12: - $oCriterion =& new SearchableTextCriterion(_kt("Simple Search Text"), 'searchabletext', 'searchabletext', -12); - break; - case -13: - $oCriterion =& new DiscussionTextCriterion(_kt("Discussion Threads"), 'discussiontext', 'discussiontext', -13); - break; - } - return $oCriterion; - } - - function initCriteria () { - global $aBaseCriteria; - if (isset($aBaseCriteria)) { - return; - } - $aBaseCriteria = array(); - $aIDs = range(-1, -13); - foreach ($aIDs as $iID) { - $oCriterion =& Criteria::_getBaseCriterionByNumber($iID); - $aBaseCriteria[$iID] =& $oCriterion; - } - } - - function &getBaseCriteria () { - global $aBaseCriteria; - Criteria::initCriteria(); - return $aBaseCriteria; - } - - function &getGenericCriteria () { - global $aGenericCriteria; - global $default; - $aQuery = array("SELECT id FROM $default->document_fields_table", array()); /*ok*/ - $aIDs = DBUtil::getResultArrayKey($aQuery, 'id'); - foreach ($aIDs as $iID) { - $oCriterion =& Criteria::getCriterionByNumber($iID); - $aGenericCriteria[$iID] =& $oCriterion; - } - return $aGenericCriteria; + function searchWidget ($aRequest, $aPreValue = null) { + $sNumWidget = $this->getWidgetBase() . '_num'; + $sTypeWidget = $this->getWidgetBase() . '_type'; + + // build type selection widget + $sSelect = ''; + + $sToRender = $this->getNotWidget($aPreValue); + + $sToRender .= ''.$sSelect.' ago'; + return $sToRender; } - function &getAllCriteria () { - global $aAllCriteria; - global $aBaseCriteria; - global $default; - Criteria::initCriteria(); - if (isset($aAllCriteria)) { - return $aAllCriteria; - } - $aQuery = array("SELECT id FROM $default->document_fields_table", array()); /*ok*/ - $aIDs = DBUtil::getResultArrayKey($aQuery, 'id'); - $aAllCriteriaIDs = array_merge(array_keys($aBaseCriteria), $aIDs); - foreach ($aAllCriteriaIDs as $iID) { - $oCriterion =& Criteria::getCriterionByNumber($iID); - $aAllCriteria[$iID] =& $oCriterion; + function searchSQL ($aRequest) { + $sNum = KTUtil::arrayGet($aRequest, $this->getWidgetBase() . '_num'); + $sType = KTUtil::arrayGet($aRequest, $this->getWidgetBase() . '_type'); + + $val = array($this->getSearchTable() . "." . $this->getSearchField() . " > SUBDATE(NOW(), INTERVAL ? {$sType})", array($sNum)); + + $want_invert = KTUtil::arrayGet($aRequest, $this->getWidgetBase() . '_not'); + if (is_null($want_invert) || ($want_invert == "0")) { + return $val; + } else { + $val[0] = '(NOT (' . $val[0] . '))'; } - return $aAllCriteria; + return $val; } +} - function &getCriterionByNumber($iID) { - global $aBaseCriteria; - global $default; - Criteria::initCriteria(); - // array_key_exists 4.3.2 (at least, tested on RHEL3) returns - // false if '-1' (the string) is the key given, and the real key - // is -1 (the integer). - $iID = (int)$iID; +class DateModifiedDeltaCriterion extends DateCreatedDeltaCriterion { + var $sDocumentField = 'modified'; + var $sSortField = 'modified'; + var $sNamespace = 'ktcore.criteria.datemodifieddelta'; - if (array_key_exists($iID, $aBaseCriteria)) { - return $aBaseCriteria[$iID]; - } else { - $aQuery = array("SELECT name FROM $default->document_fields_table WHERE id = ?", array($iID)); /*ok*/ - $sName = DBUtil::getOneResultKey($aQuery, 'name'); - return new GenericMetadataCriterion($sName, 'id', 'id', $iID); - } + function DateModifiedDeltaCriterion() { + $this->sDisplay = _kt('Date Modified Delta'); + } + + function documentDisplay ($oDocument) { + return $oDocument->getLastModifiedDate(); + } + function getName() { + return "datemodified"; } } + + + + + ?> diff --git a/lib/browse/PartialQuery.inc.php b/lib/browse/PartialQuery.inc.php index a0bd860..0cfa244 100644 --- a/lib/browse/PartialQuery.inc.php +++ b/lib/browse/PartialQuery.inc.php @@ -326,7 +326,7 @@ class SimpleSearchQuery extends PartialQuery { function getQuery($aOptions = null) { $aSubgroup = array( 'values' => array( - array('type' => '-12', 'data' => array('bmd_12' => $this->searchable_text)), + array('type' => 'ktcore.criteria.searchabletext', 'data' => array('ktcore.criteria.searchabletext' => $this->searchable_text)), array('sql' => array('D.status_id = 1')), ), 'join' => 'AND', @@ -388,7 +388,7 @@ class TypeBrowseQuery extends SimpleSearchQuery { function getQuery($aOptions = null) { $aSubgroup = array( 'values' => array( - array('type' => '-5', 'data' => array('bmd_5' => $this->iDocType)), + array('type' => 'ktcore.criteria.documenttype', 'data' => array('ktcore.criteria.documenttype' => $this->iDocType)), array('sql' => array('D.status_id = 1')), ), 'join' => 'AND', @@ -407,18 +407,18 @@ class TypeBrowseQuery extends SimpleSearchQuery { } class ValueBrowseQuery extends SimpleSearchQuery { - var $iFieldId; + var $sFieldNamespace; var $sValueName; - function ValueBrowseQuery($oField, $oValue) { - $this->iFieldId = $oField->getId(); + function ValueBrowseQuery($oField, $oValue) { + $this->sFieldNamespace = $oField->getNamespace(); $this->sValueName = $oValue->getName(); } function getQuery($aOptions = null) { $aSubgroup = array( 'values' => array( - array('type' => $this->iFieldId, 'data' => array('bmd' . $this->iFieldId => $this->sValueName)), + array('type' => $this->sFieldNamespace, 'data' => array($this->sFieldNamespace => $this->sValueName)), array('sql' => array('D.status_id = 1')), ), 'join' => 'AND', diff --git a/lib/browse/criteriaregistry.php b/lib/browse/criteriaregistry.php new file mode 100644 index 0000000..0a074e7 --- /dev/null +++ b/lib/browse/criteriaregistry.php @@ -0,0 +1,99 @@ +_buildGenericCriteria(); + } + return $GLOBALS['_KT_CRITERIA']['oKTCriteriaRegistry']; + } + + function _buildGenericCriteria() { + $aFields =& DocumentField::getList(); + foreach($aFields as $oField) { + $sNamespace = $oField->getNamespace(); + $aInitialize = array($oField->getName(), 'id', 'id', $oField->getId(), $sNamespace); + $this->registerCriterion('GenericMetadataCriterion', $sNamespace, null, $aInitialize); + } + $this->_bGenericRegistered = true; + } + + function registerCriterion($sClassName, $sNamespace = null, $sFilename = null, $aInitialize = null) { + $this->_aCriteriaDetails[$sNamespace] = array($sClassName, $sNamespace, $sFilename, $aInitialize); + } + + function &getCriterion($sNamespace) { + if(!$this->_bGenericRegistered) { + $this->_buildGenericCriteria(); + } + + if (array_key_exists($sNamespace, $this->_aCriteria)) { + return $this->_aCriteria[$sNamespace]; + } + + $aDetails = KTUtil::arrayGet($this->_aCriteriaDetails, $sNamespace); + if (empty($aDetails)) { + return null; + } + $sFilename = $aDetails[2]; + if (!empty($sFilename)) { + require_once($sFilename); + } + $sClassName = $aDetails[0]; + $oCriterion =& new $sClassName(); + + + if(is_array($aDetails[3])) { + call_user_func_array(array(&$oCriterion, 'initialize'), $aDetails[3]); + } + + + $this->_aCriteria[$sNamespace] =& $oCriterion; + return $oCriterion; + } + + function &getCriteria() { + if(!$this->_bGenericRegistered) { + $this->_buildGenericCriteria(); + } + $aRet = array(); + + foreach (array_keys($this->_aCriteriaDetails) as $sCriteriaName) { + $aRet[$sCriteriaName] =& $this->getCriterion($sCriteriaName); + } + return $aRet; + } + +} + diff --git a/lib/documentmanagement/DocumentField.inc b/lib/documentmanagement/DocumentField.inc index b910f8a..d5df156 100644 --- a/lib/documentmanagement/DocumentField.inc +++ b/lib/documentmanagement/DocumentField.inc @@ -35,21 +35,21 @@ require_once(KT_LIB_DIR . '/documentmanagement/DocumentType.inc'); class DocumentField extends KTEntity { - /** primary key value */ - var $iId = -1; - var $sName; - var $sDataType; - var $sDescription; - var $bIsGeneric; - var $bHasLookup; + /** primary key value */ + var $iId = -1; + var $sName; + var $sDataType; + var $sDescription; + var $bIsGeneric; + var $bHasLookup; var $iParentFieldset; - var $bHasLookupTree; - var $bIsMandatory; + var $bHasLookupTree; + var $bIsMandatory; var $_aFieldToSelect = array( 'iId' => 'id', 'sName' => 'name', - 'sDescription' => 'description', + 'sDescription' => 'description', 'sDataType' => 'data_type', 'bIsGeneric' => 'is_generic', 'bHasLookup' => 'has_lookup', @@ -93,7 +93,7 @@ class DocumentField extends KTEntity { function _fieldValues () { return array( 'name' => $this->sName, - 'description' => $this->sDescription, + 'description' => $this->sDescription, 'data_type' => $this->sDataType, 'is_generic' => KTUtil::anyToBool($this->bIsGeneric), 'has_lookup' => KTUtil::anyToBool($this->bHasLookup), @@ -108,9 +108,9 @@ class DocumentField extends KTEntity { return $default->document_fields_table; } - function &getList($sWhereClause = null) { - return KTEntityUtil::getList2('DocumentField', $sWhereClause); - } + function &getList($sWhereClause = null) { + return KTEntityUtil::getList2('DocumentField', $sWhereClause); + } function &createFromArray($aOptions) { return KTEntityUtil::createFromArray('DocumentField', $aOptions); @@ -206,6 +206,16 @@ class DocumentField extends KTEntity { return implode(', ', $aDescriptors); } + + function getNamespace() { + $oFieldset = KTFieldset::get($this->getParentFieldsetId()); + if(PEAR::isError($oFieldset)) { + $sFS = 'nofieldset'; + } else { + $sFS = $oFieldset->getNamespace(); + } + return $sFS . '.' . $this->getName(); + } } /** diff --git a/lib/plugins/plugin.inc.php b/lib/plugins/plugin.inc.php index 4b40305..576ef9d 100644 --- a/lib/plugins/plugin.inc.php +++ b/lib/plugins/plugin.inc.php @@ -54,6 +54,7 @@ class KTPlugin { var $_aViews = array(); var $_aNotificationHandlers = array(); var $_aTemplateLocations = array(); + var $_aCriteria = array(); function KTPlugin($sFilename = null) { $this->sFilename = $sFilename; @@ -162,6 +163,11 @@ class KTPlugin { $this->_aTemplateLocations[$sName] = array($sName, $sPath); } + function registerCriterion($sClassName, $sNamespace, $sFilename = null, $aInitialize = null) { + $this->_fixFilename($sFilename); + $this->_aCriteria[$sNamespace] = array($sClassName, $sNamespace, $sFilename, $aInitialize); + } + function _fixFilename($sFilename) { if (empty($sFilename)) { $sFilename = $this->sFilename; @@ -220,6 +226,7 @@ class KTPlugin { require_once(KT_LIB_DIR . "/help/help.inc.php"); require_once(KT_LIB_DIR . "/workflow/workflowutil.inc.php"); require_once(KT_LIB_DIR . "/browse/columnregistry.inc.php"); + require_once(KT_LIB_DIR . "/browse/criteriaregistry.php"); $oPRegistry =& KTPortletRegistry::getSingleton(); $oTRegistry =& KTTriggerRegistry::getSingleton(); @@ -234,6 +241,7 @@ class KTPlugin { $oColumnRegistry =& KTColumnRegistry::getSingleton(); $oNotificationHandlerRegistry =& KTNotificationRegistry::getSingleton(); $oTemplating =& KTTemplating::getSingleton(); + $oCriteriaRegistry =& KTCriteriaRegistry::getSingleton(); foreach ($this->_aPortlets as $k => $v) { call_user_func_array(array(&$oPRegistry, 'registerPortlet'), $v); @@ -302,6 +310,10 @@ class KTPlugin { foreach ($this->_aTemplateLocations as $k => $v) { call_user_func_array(array(&$oTemplating, 'addLocation'), $v); } + + foreach ($this->_aCriteria as $k => $v) { + call_user_func_array(array(&$oCriteriaRegistry, 'registerCriterion'), $v); + } } function setup() { diff --git a/lib/search/searchutil.inc.php b/lib/search/searchutil.inc.php index 890e662..5b12850 100644 --- a/lib/search/searchutil.inc.php +++ b/lib/search/searchutil.inc.php @@ -51,7 +51,8 @@ class KTSearchUtil { $type = KTUtil::arrayGet($dataset, "type"); $sql = KTUtil::arrayGet($dataset, "sql"); if (!empty($type)) { - $oCriterion = Criteria::getCriterionByNumber($dataset["type"]); + $oCriteriaRegistry =& KTCriteriaRegistry::getSingleton(); + $oCriterion = $oCriteriaRegistry->getCriterion($dataset['type']); if (PEAR::isError($oCriterion)) { return PEAR::raiseError('Invalid criteria specified.'); } diff --git a/lib/upgrades/UpgradeFunctions.inc.php b/lib/upgrades/UpgradeFunctions.inc.php index eecad28..551be36 100644 --- a/lib/upgrades/UpgradeFunctions.inc.php +++ b/lib/upgrades/UpgradeFunctions.inc.php @@ -39,6 +39,7 @@ class UpgradeFunctions { "3.0.3.2" => array("createFolderDetailsPermission"), "3.0.3.3" => array("generateWorkflowTriggers"), "3.0.3.7" => array("rebuildAllPermissions"), + "3.1.5" => array("upgradeSavedSearches"), ); var $descriptions = array( @@ -56,6 +57,7 @@ class UpgradeFunctions { 'createFolderDetailsPermission' => 'Create the Core: Folder Details permission', 'generateWorkflowTriggers' => 'Migrate old in-transition guards to triggers', 'rebuildAllPermissions' => 'Rebuild all permissions to ensure correct functioning of permission-definitions.' + 'upgradeSavedSearches' => 'Upgrade saved searches to use namespaces instead of integer ids', ); var $phases = array( "setPermissionFolder" => 1, @@ -765,6 +767,57 @@ class UpgradeFunctions { KTPermissionUtil::updatePermissionLookupRecursive($oRootFolder); } + + function _upgradeSavedSearch($aSearch) { + $aMapping = array('-1' => 'ktcore.criteria.name', + '-6' => 'ktcore.criteria.id', + '-2' => 'ktcore.criteria.title', + '-3' => 'ktcore.criteria.creator', + '-4' => 'ktcore.criteria.datecreated', + '-5' => 'ktcore.criteria.documenttype', + '-7' => 'ktcore.criteria.datemodified', + '-8' => 'ktcore.criteria.size', + '-9' => 'ktcore.criteria.content', + '-10' => 'ktcore.criteria.workflowstate', + '-13' => 'ktcore.criteria.discussiontext', + '-12' => 'ktcore.criteria.searchabletext', + '-11' => 'ktcore.criteria.transactiontext'); + + $aFieldsets =& KTFieldset::getList(); + foreach($aFieldsets as $oFieldset) { + $aFields =& DocumentField::getByFieldset($oFieldset); + foreach($aFields as $oField) { + $sNamespace = $oFieldset->getNamespace() . '.' . $oField->getName(); + $sId = (string) $oField->getId(); + $aMapping[$sId] = $sNamespace; + } + } + + foreach(array_keys($aSearch['subgroup']) as $sgkey) { + $sg =& $aSearch['subgroup'][$sgkey]; + foreach(array_keys($sg['values']) as $vkey) { + $item =& $sg['values'][$vkey]; + $type = $item['type']; + $toreplace = 'bmd' . ((int)$type < 0 ? '_' : '') . abs((int)$type); + $item['type'] = $aMapping[$type]; + $nData = array(); + foreach($item['data'] as $k=>$v) { + $k = str_replace($toreplace, $aMapping[$type], $k); + $nData[$k] = $v; + } + $item['data'] = $nData; + } + } + return $aSearch; + } + + function upgradeSavedSearches() { + foreach(KTSavedSearch::getSearches() as $oS) { + $aSearch = $this->_upgradeSavedSearch($oS->getSearch()); + $oS->setSearch($aSearch); + $oS->update(); + } + } } ?> diff --git a/plugins/ktcore/KTCorePlugin.php b/plugins/ktcore/KTCorePlugin.php index 01c316f..d67762f 100644 --- a/plugins/ktcore/KTCorePlugin.php +++ b/plugins/ktcore/KTCorePlugin.php @@ -27,7 +27,6 @@ require_once(KT_LIB_DIR . '/plugins/pluginregistry.inc.php'); require_once(KT_LIB_DIR . '/plugins/plugin.inc.php'); - class KTCorePlugin extends KTPlugin { var $bAlwaysInclude = true; var $sNamespace = "ktcore.plugin"; @@ -119,7 +118,23 @@ class KTCorePlugin extends KTPlugin { $this->registerWorkflowTrigger('ktcore.workflowtriggers.conditionguard', 'ConditionGuardTrigger', 'KTWorkflowTriggers.inc.php'); $this->registerWorkflowTrigger('ktcore.workflowtriggers.copyaction', 'CopyActionTrigger', 'KTWorkflowTriggers.inc.php'); - + + // criterion + $this->registerCriterion('NameCriterion', 'ktcore.criteria.name', KT_LIB_DIR . '/browse/Criteria.inc'); + $this->registerCriterion('IDCriterion', 'ktcore.criteria.id', KT_LIB_DIR . '/browse/Criteria.inc'); + $this->registerCriterion('TitleCriterion', 'ktcore.criteria.title', KT_LIB_DIR . '/browse/Criteria.inc'); + $this->registerCriterion('CreatorCriterion', 'ktcore.criteria.creator', KT_LIB_DIR . '/browse/Criteria.inc'); + $this->registerCriterion('DateCreatedCriterion', 'ktcore.criteria.datecreated', KT_LIB_DIR . '/browse/Criteria.inc'); + $this->registerCriterion('DocumentTypeCriterion', 'ktcore.criteria.documenttype', KT_LIB_DIR . '/browse/Criteria.inc'); + $this->registerCriterion('DateModifiedCriterion', 'ktcore.criteria.datemodified', KT_LIB_DIR . '/browse/Criteria.inc'); + $this->registerCriterion('SizeCriterion', 'ktcore.criteria.size', KT_LIB_DIR . '/browse/Criteria.inc'); + $this->registerCriterion('ContentCriterion', 'ktcore.criteria.content', KT_LIB_DIR . '/browse/Criteria.inc'); + $this->registerCriterion('WorkflowStateCriterion', 'ktcore.criteria.workflowstate', KT_LIB_DIR . '/browse/Criteria.inc'); + $this->registerCriterion('DiscussionTextCriterion', 'ktcore.criteria.discussiontext', KT_LIB_DIR . '/browse/Criteria.inc'); + $this->registerCriterion('SearchableTextCriterion', 'ktcore.criteria.searchabletext', KT_LIB_DIR . '/browse/Criteria.inc'); + $this->registerCriterion('TransactionTextCriterion', 'ktcore.criteria.transactiontext', KT_LIB_DIR . '/browse/Criteria.inc'); + $this->registerCriterion('DateCreatedDeltaCriterion', 'ktcore.criteria.datecreateddelta', KT_LIB_DIR . '/browse/Criteria.inc'); + $this->registerCriterion('DateModifiedDeltaCriterion', 'ktcore.criteria.datemodifieddelta', KT_LIB_DIR . '/browse/Criteria.inc'); $this->setupAdmin(); } diff --git a/plugins/ktcore/admin/conditions.php b/plugins/ktcore/admin/conditions.php index ba17922..fd8aae1 100755 --- a/plugins/ktcore/admin/conditions.php +++ b/plugins/ktcore/admin/conditions.php @@ -78,7 +78,8 @@ class KTConditionDispatcher extends KTAdminDispatcher { $oTemplating =& KTTemplating::getSingleton(); $oTemplate = $oTemplating->loadTemplate("ktcore/boolean_search"); - $aCriteria = Criteria::getAllCriteria(); + $oCriteriaRegistry =& KTCriteriaRegistry::getSingleton(); + $aCriteria =& $oCriteriaRegistry->getCriteria(); $aTemplateData = array( "title" => _kt("Create a new condition"), @@ -108,7 +109,8 @@ class KTConditionDispatcher extends KTAdminDispatcher { $oTemplating =& KTTemplating::getSingleton(); $oTemplate = $oTemplating->loadTemplate("ktcore/boolean_search_edit"); - $aCriteria = Criteria::getAllCriteria(); + $oCriteriaRegistry =& KTCriteriaRegistry::getSingleton(); + $aCriteria =& $oCriteriaRegistry->getCriteria(); // we need to help out here, since it gets unpleasant inside the template. foreach ($aSearch['subgroup'] as $isg => $as) { @@ -117,8 +119,9 @@ class KTConditionDispatcher extends KTAdminDispatcher { if(count($aSubgroup['values'])) { foreach ($aSubgroup['values'] as $iv => $t) { $datavars =& $aSubgroup['values'][$iv]; - $datavars['typename'] = $aCriteria[$datavars['type']]->sDisplay; - $datavars['widgetval'] = $aCriteria[$datavars['type']]->searchWidget(null, $datavars['data']); + $oCriterion = $oCriteriaRegistry->getCriterion($datavars['type']); + $datavars['typename'] = $oCriterion->sDisplay; + $datavars['widgetval'] = $oCriterion->searchWidget(null, $datavars['data']); } } } diff --git a/plugins/ktcore/admin/savedSearch.php b/plugins/ktcore/admin/savedSearch.php index 4a0a1dc..2083680 100755 --- a/plugins/ktcore/admin/savedSearch.php +++ b/plugins/ktcore/admin/savedSearch.php @@ -55,7 +55,8 @@ class KTSavedSearchDispatcher extends KTAdminDispatcher { $oTemplating =& KTTemplating::getSingleton(); $oTemplate = $oTemplating->loadTemplate("ktcore/boolean_search"); - $aCriteria = Criteria::getAllCriteria(); + $oCriteriaRegistry =& KTCriteriaRegistry::getSingleton(); + $aCriteria =& $oCriteriaRegistry->getCriteria(); $aTemplateData = array( "title" => _kt("Create a new saved search"), @@ -105,7 +106,8 @@ class KTSavedSearchDispatcher extends KTAdminDispatcher { $oTemplating =& KTTemplating::getSingleton(); $oTemplate = $oTemplating->loadTemplate("ktcore/boolean_search_edit"); - $aCriteria = Criteria::getAllCriteria(); + $oCriteriaRegistry =& KTCriteriaRegistry::getSingleton(); + $aCriteria =& $oCriteriaRegistry->getCriteria(); // we need to help out here, since it gets unpleasant inside the template. @@ -114,8 +116,9 @@ class KTSavedSearchDispatcher extends KTAdminDispatcher { if (is_array($aSubgroup['values'])) { foreach ($aSubgroup['values'] as $iv => $t) { $datavars =& $aSubgroup['values'][$iv]; - $datavars['typename'] = $aCriteria[$datavars['type']]->sDisplay; - $datavars['widgetval'] = $aCriteria[$datavars['type']]->searchWidget(null, $datavars['data']); + $oCriterion = $oCriteriaRegistry->getCriterion($datavars['type']); + $datavars['typename'] = $oCriterion->sDisplay; + $datavars['widgetval'] = $oCriterion->searchWidget(null, $datavars['data']); } } } @@ -124,7 +127,7 @@ class KTSavedSearchDispatcher extends KTAdminDispatcher { //$s .= print_r($aSearch, true); //$s .= ''; //print $s; - + $aTemplateData = array( "title" => _kt("Edit an existing condition"), "aCriteria" => $aCriteria, diff --git a/resources/js/constructed_search.js b/resources/js/constructed_search.js index fc2c288..64acdc5 100644 --- a/resources/js/constructed_search.js +++ b/resources/js/constructed_search.js @@ -95,6 +95,7 @@ function addNewCriteria(add_button) { var dest_cell = notify_message.parentNode; var baseUrl = getElement('kt-core-baseurl').value; var targeturl = baseUrl + '/search/ajaxBooleanSearch.php?action=getNewCriteria&type='+select.value+'&critId='+critId; + simpleLog('DEBUG','addNewCriteria initiating request to: '+targeturl); var deferred = doSimpleXMLHttpRequest(targeturl); diff --git a/search/ajaxBooleanSearch.php b/search/ajaxBooleanSearch.php index cab7c23..d98d969 100755 --- a/search/ajaxBooleanSearch.php +++ b/search/ajaxBooleanSearch.php @@ -31,6 +31,7 @@ require_once(KT_LIB_DIR . "/database/dbutil.inc"); require_once(KT_LIB_DIR . "/util/ktutil.inc"); require_once(KT_LIB_DIR . "/dispatcher.inc.php"); require_once(KT_LIB_DIR . "/browse/Criteria.inc"); +require_once(KT_LIB_DIR . "/browse/criteriaregistry.php"); /* * example code - tests the frontend behaviour. remember to check ajaxConditional.php @@ -49,7 +50,9 @@ class AjaxBooleanSearchDispatcher extends KTDispatcher { if (empty($criteriaType)) { return 'AJAX Error: no criteria type specified.'; } - $critObj = Criteria::getCriterionByNumber($criteriaType); + + $oCriteriaRegistry =& KTCriteriaRegistry::getSingleton(); + $critObj = $oCriteriaRegistry->getCriterion($criteriaType); if (PEAR::isError($critObj)) { return 'AJAX Error: failed to initialise critiria of type "'.$type.'".'; } diff --git a/search/booleanSearch.php b/search/booleanSearch.php index 784579f..c0fb95d 100755 --- a/search/booleanSearch.php +++ b/search/booleanSearch.php @@ -56,7 +56,8 @@ class BooleanSearchDispatcher extends KTStandardDispatcher { $oTemplating =& KTTemplating::getSingleton(); $oTemplate = $oTemplating->loadTemplate("ktcore/boolean_search"); - $aCriteria = Criteria::getAllCriteria(); + $oCriteriaRegistry =& KTCriteriaRegistry::getSingleton(); + $aCriteria = $oCriteriaRegistry->getCriteria(); $aTemplateData = array( "context" => &$this, @@ -193,8 +194,9 @@ class BooleanSearchDispatcher extends KTStandardDispatcher { $oTemplating =& KTTemplating::getSingleton(); $oTemplate = $oTemplating->loadTemplate("ktcore/boolean_search_change"); - - $aCriteria = Criteria::getAllCriteria(); + + $oCriteriaRegistry =& KTCriteriaRegistry::getSingleton(); + $aCriteria = $oCriteriaRegistry->getCriteria(); // we need to help out here, since it gets unpleasant inside the template. @@ -203,8 +205,10 @@ class BooleanSearchDispatcher extends KTStandardDispatcher { if (is_array($aSubgroup['values'])) { foreach ($aSubgroup['values'] as $iv => $t) { $datavars =& $aSubgroup['values'][$iv]; - $datavars['typename'] = $aCriteria[$datavars['type']]->sDisplay; - $datavars['widgetval'] = $aCriteria[$datavars['type']]->searchWidget(null, $datavars['data']); + + $oCriterion = $oCriteriaRegistry->getCriterion($datavars['type']); + $datavars['typename'] = $oCriterion->sDisplay; + $datavars['widgetval'] = $oCriterion->searchWidget(null, $datavars['data']); } } } @@ -224,7 +228,6 @@ class BooleanSearchDispatcher extends KTStandardDispatcher { function handleCriteriaSet($aCriteriaSet, $iStartIndex, $sTitle=null) { - if ($sTitle == null) { $this->aBreadcrumbs[] = array('url' => $_SERVER['PHP_SELF'], 'name' => _kt('Advanced Search')); $sTitle = _kt('Search Results'); @@ -260,7 +263,6 @@ class BooleanSearchDispatcher extends KTStandardDispatcher { $collection->setOptions($aOptions); $collection->setQueryObject(new BooleanSearchQuery($aCriteriaSet)); - //$a = new BooleanSearchQuery($aCriteriaSet); //var_dump($a->getDocumentCount()); exit(0); diff --git a/templates/ktcore/boolean_search.smarty b/templates/ktcore/boolean_search.smarty index d8ed069..26a4fc7 100644 --- a/templates/ktcore/boolean_search.smarty +++ b/templates/ktcore/boolean_search.smarty @@ -1,8 +1,3 @@ -{$context->oPage->requireJSResource("thirdpartyjs/MochiKit/Base.js")} -{$context->oPage->requireJSResource("thirdpartyjs/MochiKit/DateTime.js")} -{$context->oPage->requireJSResource("thirdpartyjs/MochiKit/Iter.js")} -{$context->oPage->requireJSResource("thirdpartyjs/MochiKit/DOM.js")} -{$context->oPage->requireJSResource("thirdpartyjs/MochiKit/Async.js")} {$context->oPage->requireJSResource("resources/js/taillog.js")} {$context->oPage->requireJSResource("resources/js/constructed_search.js")} @@ -45,7 +40,7 @@ legend { border: 1px dotted #999;}