42 import(
'lib.pkp.classes.filter.Filter');
66 function configureObject($filterClassName, $filterGroupSymbolic, $settings = array(), $asTemplate =
false, $contextId = 0, $subFilters = array(), $persist =
true) {
69 $filterGroup = $filterGroupDao->getObjectBySymbolic($filterGroupSymbolic);
70 if (!is_a($filterGroup,
'FilterGroup'))
return false;
73 $filter =
instantiate($filterClassName,
'PersistableFilter',
null,
'execute', $filterGroup);
74 if (!is_object($filter))
return false;
77 $filter->setIsTemplate((
boolean)$asTemplate);
80 if (!empty($subFilters)) {
81 assert(is_a($filter,
'CompositeFilter'));
82 assert(is_array($subFilters));
83 foreach($subFilters as $subFilter) {
84 $filter->addFilter($subFilter);
90 assert(is_array($settings));
91 foreach($settings as $key => $value) {
92 $filter->setData($key, $value);
98 if (!is_integer($filterId) || $filterId == 0)
return false;
111 function insertObject($filter, $contextId = CONTEXT_ID_NONE) {
112 $filterGroup = $filter->getFilterGroup();
113 assert($filterGroup->getSymbolic() != FILTER_GROUP_TEMPORARY_ONLY);
116 sprintf(
'INSERT INTO filters
117 (filter_group_id, context_id, display_name, class_name, is_template, parent_filter_id, seq)
118 VALUES (?, ?, ?, ?, ?, ?, ?)'),
120 (
int) $filterGroup->getId(),
122 $filter->getDisplayName(),
123 $filter->getClassName(),
124 $filter->getIsTemplate()?1:0,
125 (
int) $filter->getParentFilterId(),
126 (
int) $filter->getSequence()
131 'filter_settings', $filter,
132 array(
'filter_id' => $filter->getId())
138 return $filter->getId();
158 'SELECT * FROM filters
159 WHERE '.($allowSubfilter ?
'' :
'parent_filter_id = 0 AND ').
'
165 if ($result->RecordCount() != 0) {
166 $filter = $this->
_fromRow($result->GetRowAssoc(
false));
183 function getObjectsByClass($className, $contextId = CONTEXT_ID_NONE, $getTemplates =
false, $allowSubfilters =
false) {
185 'SELECT * FROM filters
186 WHERE context_id = ? AND
188 ' . ($allowSubfilters ?
'' :
' parent_filter_id = 0 AND ') .
'
189 ' . ($getTemplates ?
' is_template = 1' :
' is_template = 0'),
190 array((
int) $contextId, $className)
193 $daoResultFactory =
new DAOResultFactory($result, $this,
'_fromRow', array(
'filter_id'));
194 return $daoResultFactory;
209 function getObjectsByGroupAndClass($groupSymbolic, $className, $contextId = CONTEXT_ID_NONE, $getTemplates =
false, $allowSubfilters =
false) {
211 'SELECT f.* FROM filters f'.
212 ' INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id'.
213 ' WHERE fg.symbolic = ? AND f.context_id = ? AND f.class_name = ?'.
214 ' '.($allowSubfilters ?
'' :
'AND f.parent_filter_id = 0').
215 ' AND '.($getTemplates ?
'f.is_template = 1' :
'f.is_template = 0'),
216 array($groupSymbolic, (
int) $contextId, $className)
219 return new DAOResultFactory($result, $this,
'_fromRow', array(
'filter_id'));
235 static $filterCache = array();
236 static $objectFilterCache = array();
239 assert(!is_array($data));
242 $filterCacheKey = md5($inputTypeDescription.
'=>'.$outputTypeDescription);
243 if (!isset($filterCache[$filterCacheKey])) {
248 ' INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id'.
249 ' WHERE fg.input_type like ?'.
250 ' AND fg.output_type like ?'.
251 ' AND f.parent_filter_id = 0 AND f.is_template = 0',
252 array($inputTypeDescription, $outputTypeDescription)
256 $filterFactory =
new DAOResultFactory($result, $this,
'_fromRow', array(
'filter_id'));
257 $filterCache[$filterCacheKey] = $filterFactory->toAssociativeArray();
261 if (is_null($data))
return $filterCache[$filterCacheKey];
264 $objectFilterCacheKey = md5($filterCacheKey.(is_object($data)?get_class($data):
"'$data'").($dataIsInput?
'in':
'out'));
265 if (!isset($objectFilterCache[$objectFilterCacheKey])) {
266 $objectFilterCache[$objectFilterCacheKey] = array();
267 foreach($filterCache[$filterCacheKey] as $filterCandidateId => $filterCandidate) {
271 $filterDataType = $filterCandidate->getInputType();
273 $filterDataType = $filterCandidate->getOutputType();
275 if ($filterDataType->checkType($data)) $objectFilterCache[$objectFilterCacheKey][$filterCandidateId] = $filterCandidate;
276 unset($filterCandidate);
280 return $objectFilterCache[$objectFilterCacheKey];
299 function getObjectsByGroup($groupSymbolic, $contextId = CONTEXT_ID_NONE, $getTemplates =
false, $checkRuntimeEnvironment =
true) {
302 'SELECT f.* FROM filters f'.
303 ' INNER JOIN filter_groups fg ON f.filter_group_id = fg.filter_group_id'.
304 ' WHERE fg.symbolic = ? AND '.($getTemplates ?
'f.is_template = 1' :
'f.is_template = 0').
305 ' '.(is_null($contextId) ?
'' :
'AND f.context_id in (0, '.(
int)$contextId.
')').
306 ' AND f.parent_filter_id = 0',
314 $matchingFilters = array();
315 foreach($result->GetRows() as $filterRow) {
316 $filterInstance = $this->
_fromRow($filterRow);
317 if (!$checkRuntimeEnvironment || $filterInstance->isCompatibleWithRuntimeEnvironment()) {
318 $matchingFilters[$filterInstance->getId()] = $filterInstance;
320 unset($filterInstance);
323 return $matchingFilters;
331 $filterGroup = $filter->getFilterGroup();
332 assert($filterGroup->getSymbolic() != FILTER_GROUP_TEMPORARY_ONLY);
336 SET filter_group_id = ?,
340 parent_filter_id = ?,
342 WHERE filter_id = ?',
344 (
int) $filterGroup->getId(),
345 $filter->getDisplayName(),
346 $filter->getClassName(),
347 $filter->getIsTemplate()?1:0,
348 (
int) $filter->getParentFilterId(),
349 (
int) $filter->getSequence(),
350 (
int) $filter->getId()
354 'filter_settings', $filter,
355 array(
'filter_id' => $filter->getId())
359 if (is_a($filter,
'CompositeFilter')) {
383 $filterId = (int)$filterId;
384 $this->
update(
'DELETE FROM filters WHERE filter_id = ?', (
int) $filterId);
385 $this->
update(
'DELETE FROM filter_settings WHERE filter_id = ?', (
int) $filterId);
399 $this->additionalFieldNames = $dataObject->getSettingNames();
400 $this->localeFieldNames = $dataObject->getLocalizedSettingNames();
403 foreach($dataObject->supportedRuntimeEnvironmentSettings() as $runtimeSetting => $defaultValue) {
404 if ($dataObject->hasData($runtimeSetting)) $this->additionalFieldNames[] = $runtimeSetting;
408 parent::updateDataObjectSettings($tableName, $dataObject, $idArray);
411 unset($this->additionalFieldNames, $this->localeFieldNames);
422 assert(is_array($this->additionalFieldNames));
430 assert(is_array($this->localeFieldNames));
443 return parent::_getInsertId(
'filters',
'filter_id');
459 $filterGroup = $filterGroupDao->getObjectById($filterGroupId);
460 assert(is_a($filterGroup,
'FilterGroup'));
463 $filter =
instantiate($filterClassName,
'PersistableFilter',
null,
'execute', $filterGroup);
464 if (!is_object($filter))
fatalError(
'Error while instantiating class "'.$filterClassName.
'" as filter!');
477 static $lockedFilters = array();
478 $filterId = $row[
'filter_id'];
484 if (isset($lockedFilters[$filterId]))
fatalError(
'Detected a loop in the definition of the filter with id '.$filterId.
'!');
487 $lockedFilters[$filterId] =
true;
490 $filter = $this->
_newDataObject($row[
'class_name'], (integer)$row[
'filter_group_id']);
493 $filter->setId((
int)$row[
'filter_id']);
494 $filter->setDisplayName($row[
'display_name']);
495 $filter->setIsTemplate((
boolean)$row[
'is_template']);
496 $filter->setParentFilterId((
int)$row[
'parent_filter_id']);
497 $filter->setSequence((
int)$row[
'seq']);
504 unset($lockedFilters[$filterId]);
515 if (!is_a($parentFilter,
'CompositeFilter')) {
522 $parentFilterId = $parentFilter->getId();
524 'SELECT * FROM filters WHERE parent_filter_id = ? ORDER BY seq',
525 (
int) $parentFilterId
527 $daoResultFactory =
new DAOResultFactory($result, $this,
'_fromRow', array(
'filter_id'));
530 while (!$daoResultFactory->eof()) {
534 $subFilter = $daoResultFactory->next();
538 $parentFilter->addFilter($subFilter);
548 if (!is_a($parentFilter,
'CompositeFilter')) {
555 foreach($parentFilter->getFilters() as $subFilter) {
556 $subFilter->setParentFilterId($parentFilter->getId());
558 assert(is_numeric($subfilterId));
568 $parentFilterId = (int)$parentFilterId;
572 'SELECT * FROM filters WHERE parent_filter_id = ?',
573 (
int) $parentFilterId
576 $allSubFilterRows = $result->GetArray();
577 foreach($allSubFilterRows as $subFilterRow) {
581 $subFilterId = $subFilterRow[
'filter_id'];