protected $_rowsFound = NULL;
protected $_selectAliases = array();
protected $_rollup = NULL;
+
+ /**
+ * SQL Limit clause
+ * @var string
+ */
protected $_limit = NULL;
+
+ /**
+ * This can be set to specify a limit to the number of rows
+ * Since it is currently envisaged as part of the api usage it is only being applied
+ * when $_output mode is not 'html' or 'group' so as not to have to interpret / mess with that part
+ * of the code (see limit() fn
+ * @var integer
+ */
+ protected $_limitValue = NULL;
+
+ /**
+ * This can be set to specify row offset
+ * See notes on _limitValue
+ * @var integer
+ */
+ protected $_offsetValue = NULL;
protected $_sections = NULL;
protected $_autoIncludeIndexedFieldsAsOrderBys = 0;
protected $_absoluteUrl = FALSE;
*/
protected $_selectedTables;
+ /**
+ * outputmode e.g 'print', 'csv', 'pdf'
+ * @var string
+ */
+ protected $_outputMode;
+
public $_having = NULL;
public $_select = NULL;
public $_selectClauses = array();
public $_whereClauses = array();
public $_havingClauses = array();
+ /**
+ * Is this being called without a form controller (ie. the report is being render outside the normal form
+ * - e.g the api is retrieving the rows
+ * @var boolean
+ */
+ public $noController = FALSE;
+
/**
* Variable to hold the currency alias
*/
CRM_Core_Region::instance('page-header')->add(array(
'markup' => sprintf('<!-- Report class: [%s] -->', htmlentities(get_class($this))),
));
+ if(!$this->noController) {
+ $this->setID($this->get('instanceId'));
- $this->_id = $this->get('instanceId');
- if (!$this->_id) {
- $this->_id = CRM_Report_Utils_Report::getInstanceID();
if (!$this->_id) {
- $this->_id = CRM_Report_Utils_Report::getInstanceIDForPath();
+ $this->setID(CRM_Report_Utils_Report::getInstanceID());
+ if (!$this->_id) {
+ $this->setID( CRM_Report_Utils_Report::getInstanceIDForPath());
+ }
}
- }
- // set qfkey so that pager picks it up and use it in the "Next > Last >>" links.
- // FIXME: Note setting it in $_GET doesn't work, since pager generates link based on QUERY_STRING
- $_SERVER['QUERY_STRING'] .= "&qfKey={$this->controller->_key}";
+ // set qfkey so that pager picks it up and use it in the "Next > Last >>" links.
+ // FIXME: Note setting it in $_GET doesn't work, since pager generates link based on QUERY_STRING
+ $_SERVER['QUERY_STRING'] .= "&qfKey={$this->controller->_key}";
+ }
if ($this->_id) {
$this->assign('instanceId', $this->_id);
if (empty($this->_instanceValues)) {
CRM_Core_Error::fatal("Report could not be loaded.");
}
-
+ $this->_title = $this->_instanceValues['title'];
if (!empty($this->_instanceValues['permission']) &&
(!(CRM_Core_Permission::check($this->_instanceValues['permission']) ||
CRM_Core_Permission::check('administer Reports')
}
// lets always do a force if reset is found in the url.
- if (CRM_Utils_Array::value('reset', $_REQUEST)) {
+ if (!empty($_REQUEST['reset'])) {
$this->_force = 1;
}
// set the mode
$this->assign('mode', 'instance');
}
- else {
+ elseif (!$this->noController) {
list($optionValueID, $optionValue) = CRM_Report_Utils_Report::getValueIDFromUrl();
$instanceCount = CRM_Report_Utils_Report::getInstanceCount($optionValue);
if (($instanceCount > 0) && $optionValueID) {
$fieldGroups = array('fields', 'filters', 'group_bys', 'order_bys');
foreach ($fieldGroups as $fieldGrp) {
- if (CRM_Utils_Array::value($fieldGrp, $table) && is_array($table[$fieldGrp])) {
+ if (!empty($table[$fieldGrp]) && is_array($table[$fieldGrp])) {
foreach ($table[$fieldGrp] as $fieldName => $field) {
// $name is the field name used to reference the BAO/DAO export fields array
$name = isset($field['name']) ? $field['name'] : $fieldName;
}
// fill other vars
- if (CRM_Utils_Array::value('no_repeat', $field)) {
+ if (!empty($field['no_repeat'])) {
$this->_noRepeats[] = "{$tableName}_{$fieldName}";
}
- if (CRM_Utils_Array::value('no_display', $field)) {
+ if (!empty($field['no_display'])) {
$this->_noDisplay[] = "{$tableName}_{$fieldName}";
}
break;
default:
if ($daoOrBaoName &&
- (array_key_exists('pseudoconstant', $this->_columns[$tableName][$fieldGrp][$fieldName])
- || array_key_exists('enumValues', $this->_columns[$tableName][$fieldGrp][$fieldName]))
- ) {
+ array_key_exists('pseudoconstant', $this->_columns[$tableName][$fieldGrp][$fieldName])) {
// with multiple options operator-type is generally multi-select
$this->_columns[$tableName][$fieldGrp][$fieldName]['operatorType'] = CRM_Report_Form::OP_MULTISELECT;
if (!array_key_exists('options', $this->_columns[$tableName][$fieldGrp][$fieldName])) {
foreach ($this->_columns as $tableName => $table) {
if (array_key_exists('fields', $table)) {
foreach ($table['fields'] as $fieldName => $field) {
- if (!CRM_Utils_Array::value('no_display', $field)) {
+ if (empty($field['no_display'])) {
if (isset($field['required'])) {
// set default
$this->_defaults['fields'][$fieldName] = 1;
if (array_key_exists('group_bys', $table)) {
foreach ($table['group_bys'] as $fieldName => $field) {
if (isset($field['default'])) {
- if (CRM_Utils_Array::value('frequency', $field)) {
+ if (!empty($field['frequency'])) {
$this->_defaults['group_bys_freq'][$fieldName] = 'MONTH';
}
$this->_defaults['group_bys'][$fieldName] = $field['default'];
}
//assign default value as "in" for multiselect
//operator, To freeze the select element
- if (CRM_Utils_Array::value('operatorType', $field) == CRM_Report_FORM::OP_MULTISELECT) {
+ if (CRM_Utils_Array::value('operatorType', $field) == CRM_Report_Form::OP_MULTISELECT) {
$this->_defaults["{$fieldName}_op"] = 'in';
}
- elseif (CRM_Utils_Array::value('operatorType', $field) == CRM_Report_FORM::OP_MULTISELECT_SEPARATOR) {
+ elseif (CRM_Utils_Array::value('operatorType', $field) == CRM_Report_Form::OP_MULTISELECT_SEPARATOR) {
$this->_defaults["{$fieldName}_op"] = 'mhas';
}
elseif ($op = CRM_Utils_Array::value('default_op', $field)) {
$this->_defaults['order_bys'] = array();
}
foreach ($table['order_bys'] as $fieldName => $field) {
- if (
- CRM_Utils_Array::value('default', $field) ||
- CRM_Utils_Array::value('default_order', $field) ||
- CRM_Utils_Array::value('default_is_section', $field) ||
- CRM_Utils_Array::value('default_weight', $field)
- ) {
+ if (!empty($field['default']) || !empty($field['default_order']) ||
+ CRM_Utils_Array::value('default_is_section', $field) || !empty($field['default_weight'])) {
$order_by = array(
'column' => $fieldName,
'order' => CRM_Utils_Array::value('default_order', $field, 'ASC'),
'section' => CRM_Utils_Array::value('default_is_section', $field, 0),
);
- if (CRM_Utils_Array::value('default_weight', $field)) {
+ if (!empty($field['default_weight'])) {
$this->_defaults['order_bys'][(int) $field['default_weight']] = $order_by;
}
else {
return FALSE;
}
+ /**
+ * Setter for $_params
+ * @param array $params
+ */
+ function setParams($params) {
+ $this->_params = $params;
+ }
+
+ /**
+ * Setter for $_id
+ * @param integer $id
+ */
+ function setID($instanceid) {
+ $this->_id = $instanceid;
+ }
+
+ /**
+ * Setter for $_force
+ * @param boolean $force
+ */
+ function setForce($isForce) {
+ $this->_force = $isForce;
+ }
+
+ /**
+ * Setter for $_limitValue
+ * @param number $_limitValue
+ */
+ function setLimitValue($_limitValue) {
+ $this->_limitValue = $_limitValue;
+ }
+
+ /**
+ * Setter for $_offsetValue
+ * @param number $_offsetValue
+ */
+ function setOffsetValue($_offsetValue) {
+ $this->_offsetValue = $_offsetValue;
+ }
+
+ /**
+ * Getter for $_defaultValues
+ * @return array $_defaultValues
+ */
+ function getDefaultValues() {
+ return $this->_defaults;
+ }
+
function addColumns() {
$options = array();
$colGroups = NULL;
if (array_key_exists('fields', $table)) {
foreach ($table['fields'] as $fieldName => $field) {
$groupTitle = '';
- if (!CRM_Utils_Array::value('no_display', $field)) {
+ if (empty($field['no_display'])) {
foreach ( array('table', 'field') as $var) {
if (!empty(${$var}['grouping'])) {
if (!is_array(${$var}['grouping'])) {
}
$colGroups[$tableName]['fields'][$fieldName] = CRM_Utils_Array::value('title', $field);
- if ($groupTitle && !CRM_Utils_Array::value('group_title', $colGroups[$tableName])) {
+ if ($groupTitle && empty($colGroups[$tableName]['group_title'])) {
$colGroups[$tableName]['group_title'] = $groupTitle;
}
// required so that filter statistics show properly.
$this->_columns[$table]['filters'][$fieldName]['options'] = $field['options'];
}
- case CRM_Report_FORM::OP_MULTISELECT:
- case CRM_Report_FORM::OP_MULTISELECT_SEPARATOR:
+ case CRM_Report_Form::OP_MULTISELECT:
+ case CRM_Report_Form::OP_MULTISELECT_SEPARATOR:
// assume a multi-select field
if (!empty($field['options'])) {
$element = $this->addElement('select', "{$fieldName}_op", ts('Operator:'), $operations);
}
break;
- case CRM_Report_FORM::OP_SELECT:
+ case CRM_Report_Form::OP_SELECT:
// assume a select field
$this->addElement('select', "{$fieldName}_op", ts('Operator:'), $operations);
if (!empty($field['options']))
$this->addElement('select', "{$fieldName}_value", NULL, $field['options']);
break;
- case CRM_Report_FORM::OP_DATE:
+ case CRM_Report_Form::OP_DATE:
// build datetime fields
CRM_Core_Form_Date::buildDateRange($this, $fieldName, $count, '_from','_to', 'From:', FALSE, $operations);
$count++;
break;
- case CRM_Report_FORM::OP_DATETIME:
+ case CRM_Report_Form::OP_DATETIME:
// build datetime fields
CRM_Core_Form_Date::buildDateRange($this, $fieldName, $count, '_from', '_to', 'From:', FALSE, $operations, 'searchDate', true);
$count++;
break;
- case CRM_Report_FORM::OP_INT:
- case CRM_Report_FORM::OP_FLOAT:
+ case CRM_Report_Form::OP_INT:
+ case CRM_Report_Form::OP_FLOAT:
// and a min value input box
$this->add('text', "{$fieldName}_min", ts('Min'));
// and a max value input box
foreach ($table['group_bys'] as $fieldName => $field) {
if (!empty($field)) {
$options[$field['title']] = $fieldName;
- if (CRM_Utils_Array::value('frequency', $field)) {
+ if (!empty($field['frequency'])) {
$freqElements[$field['title']] = $fieldName;
}
}
if ($this->_autoIncludeIndexedFieldsAsOrderBys && array_key_exists('extends', $table) && !empty($table['extends'])) {
foreach ($table['fields'] as $fieldName => $field) {
- if (!CRM_Utils_Array::value('no_display', $field)) {
+ if (empty($field['no_display'])) {
$options[$fieldName] = $field['title'];
}
}
// FIXME: At some point we should move these key-val pairs
// to option_group and option_value table.
switch ($type) {
- case CRM_Report_FORM::OP_INT:
- case CRM_Report_FORM::OP_FLOAT:
+ case CRM_Report_Form::OP_INT:
+ case CRM_Report_Form::OP_FLOAT:
return array(
'lte' => ts('Is less than or equal to'),
'gte' => ts('Is greater than or equal to'),
);
break;
- case CRM_Report_FORM::OP_SELECT:
+ case CRM_Report_Form::OP_SELECT:
return array(
'eq' => ts('Is equal to'),
);
- case CRM_Report_FORM::OP_MONTH:
- case CRM_Report_FORM::OP_MULTISELECT:
+ case CRM_Report_Form::OP_MONTH:
+ case CRM_Report_Form::OP_MULTISELECT:
return array(
'in' => ts('Is one of'),
'notin' => ts('Is not one of'),
);
break;
- case CRM_Report_FORM::OP_DATE:
+ case CRM_Report_Form::OP_DATE:
return array(
'nll' => ts('Is empty (Null)'),
'nnll' => ts('Is not empty (Null)'),
);
break;
- case CRM_Report_FORM::OP_MULTISELECT_SEPARATOR:
+ case CRM_Report_Form::OP_MULTISELECT_SEPARATOR:
// use this operator for the values, concatenated with separator. For e.g if
// multiple options for a column is stored as ^A{val1}^A{val2}^A
return array(
'mhas' => ts('Is one of'),
+ 'mnot' => ts('Is not one of'),
);
default:
$clause = "{$field['dbAlias']} REGEXP '[[:<:]]" . implode('|', $value) . "[[:>:]]'";
}
break;
+
+ case 'mnot':
+ // mnot == multiple is not one of
+ if ($value !== NULL && count($value) > 0) {
+ $sqlOP = $this->getSQLOperator($op);
+ $clause = "( {$field['dbAlias']} NOT REGEXP '[[:<:]]" . implode('|', $value) . "[[:>:]]' OR {$field['dbAlias']} IS NULL )";
+ }
+ break;
case 'sw':
case 'ew':
break;
}
- if (CRM_Utils_Array::value('group', $field) && $clause) {
+ if (!empty($field['group']) && $clause) {
$clause = $this->whereGroupClause($field, $value, $op);
}
- elseif (CRM_Utils_Array::value('tag', $field) && $clause) {
+ elseif (!empty($field['tag']) && $clause) {
// not using left join in query because if any contact
// belongs to more than one tag, results duplicate
// entries.
$relative, $from, $to, $type = NULL, $fromTime = NULL, $toTime = NULL
) {
$clauses = array();
- if (in_array($relative, array_keys($this->getOperationPair(CRM_Report_FORM::OP_DATE)))) {
+ if (in_array($relative, array_keys($this->getOperationPair(CRM_Report_Form::OP_DATE)))) {
$sqlOP = $this->getSQLOperator($relative);
return "( {$fieldName} {$sqlOP} )";
}
// unset columns not to be displayed.
foreach ($this->_columnHeaders as $key => $value) {
- if (CRM_Utils_Array::value('no_display', $value)) {
+ if (!empty($value['no_display'])) {
unset($this->_columnHeaders[$key]);
}
}
$this->_phoneField = TRUE;
}
- if (CRM_Utils_Array::value('required', $field) ||
- CRM_Utils_Array::value($fieldName, $this->_params['fields'])
- ) {
+ if (!empty($field['required']) || !empty($this->_params['fields'][$fieldName])) {
// 1. In many cases we want select clause to be built in slightly different way
// for a particular field of a particular type.
}
// include statistics columns only if set
- if (CRM_Utils_Array::value('statistics', $field)) {
+ if (!empty($field['statistics'])) {
foreach ($field['statistics'] as $stat => $label) {
$alias = "{$tableName}_{$fieldName}_{$stat}";
switch (strtolower($stat)) {
continue;
}
- if (!empty($this->_params['group_bys']) && CRM_Utils_Array::value($fieldName, $this->_params['group_bys'])
- && !empty($this->_params['group_bys_freq'])) {
+ if (!empty($this->_params['group_bys']) && !empty($this->_params['group_bys'][$fieldName]) && !empty($this->_params['group_bys_freq'])) {
switch (CRM_Utils_Array::value($fieldName, $this->_params['group_bys_freq'])) {
case 'YEARWEEK':
$select[] = "DATE_SUB({$field['dbAlias']}, INTERVAL WEEKDAY({$field['dbAlias']}) DAY) AS {$tableName}_{$fieldName}_start";
break;
}
// for graphs and charts -
- if (CRM_Utils_Array::value($fieldName, $this->_params['group_bys_freq'])) {
+ if (!empty($this->_params['group_bys_freq'][$fieldName])) {
$this->_interval = $field['title'];
$this->_columnHeaders["{$tableName}_{$fieldName}_start"]['title'] = $field['title'] . ' Beginning';
$this->_columnHeaders["{$tableName}_{$fieldName}_start"]['type'] = $field['type'];
}
if (!empty($clause)) {
- if (CRM_Utils_Array::value('having', $field)) {
+ if (!empty($field['having'])) {
$this->_havingClauses[] = $clause;
}
else {
}
function beginPostProcess() {
- $this->_params = $this->controller->exportValues($this->_name);
+ $this->setParams($this->controller->exportValues($this->_name));
if (empty($this->_params) &&
$this->_force
) {
- $this->_params = $this->_formValues;
+ $this->setParams($this->_formValues);
}
// hack to fix params when submitted from dashboard, CRM-8532
// fields array is missing because form building etc is skipped
// in dashboard mode for report
- if (!CRM_Utils_Array::value('fields', $this->_params) && !$this->_noFields) {
- $this->_params = $this->_formValues;
+ //@todo - this could be done in the dashboard no we have a setter
+ if (empty($this->_params['fields']) && !$this->_noFields) {
+ $this->setParams($this->_formValues);
}
$this->_formValues = $this->_params;
$this->assign('updateReportButton', TRUE);
}
$this->processReportMode();
+ $this->beginPostProcessCommon();
+ }
+
+ /**
+ * beginPostProcess function run in both report mode and non-report mode (api)
+ */
+ function beginPostProcessCommon() {
+
}
function buildQuery($applyLimit = TRUE) {
$this->_select .= ", {$section['dbAlias']} as {$alias}";
}
- if ($applyLimit && !CRM_Utils_Array::value('charts', $this->_params)) {
+ if ($applyLimit && empty($this->_params['charts'])) {
$this->limit();
}
CRM_Utils_Hook::alterReportVar('sql', $this, $this);
function groupBy() {
$groupBys = array();
- if (CRM_Utils_Array::value('group_bys', $this->_params) &&
+ if (!empty($this->_params['group_bys']) &&
is_array($this->_params['group_bys']) &&
!empty($this->_params['group_bys'])
) {
foreach ($this->_columns as $tableName => $table) {
if (array_key_exists('group_bys', $table)) {
foreach ($table['group_bys'] as $fieldName => $field) {
- if (CRM_Utils_Array::value($fieldName, $this->_params['group_bys'])) {
+ if (!empty($this->_params['group_bys'][$fieldName])) {
$groupBys[] = $field['dbAlias'];
}
}
function storeOrderByArray() {
$orderBys = array();
- if (CRM_Utils_Array::value('order_bys', $this->_params) &&
+ if (!empty($this->_params['order_bys']) &&
is_array($this->_params['order_bys']) &&
!empty($this->_params['order_bys'])
) {
}
elseif (array_key_exists('extends', $table)) {
// For custom fields referenced in $this->_customGroupExtends
- $fields = $table['fields'];
+ $fields = CRM_Utils_Array::value('fields', $table, array());
}
if (!empty($fields) && is_array($fields)) {
foreach ($fields as $fieldName => $field) {
$orderBys[] = "{$orderByField['dbAlias']} {$orderBy['order']}";
// Record any section headers for assignment to the template
- if (CRM_Utils_Array::value('section', $orderBy)) {
+ if (!empty($orderBy['section'])) {
$orderByField['pageBreak'] = CRM_Utils_Array::value('pageBreak', $orderBy);
$this->_sections[$orderByField['tplField']] = $orderByField;
}
foreach ($this->_columns as $tableName => $table) {
if (array_key_exists('fields', $table)) {
foreach ($table['fields'] as $fieldName => $field) {
- if (CRM_Utils_Array::value('required', $field) ||
- CRM_Utils_Array::value($fieldName, $this->_params['fields'])
- ) {
+ if (!empty($field['required']) || !empty($this->_params['fields'][$fieldName])) {
$selectColumns["{$tableName}_{$fieldName}"] = 1;
}
}
function groupByStat(&$statistics) {
- if (CRM_Utils_Array::value('group_bys', $this->_params) &&
+ if (!empty($this->_params['group_bys']) &&
is_array($this->_params['group_bys']) &&
!empty($this->_params['group_bys'])
) {
foreach ($this->_columns as $tableName => $table) {
if (array_key_exists('group_bys', $table)) {
foreach ($table['group_bys'] as $fieldName => $field) {
- if (CRM_Utils_Array::value($fieldName, $this->_params['group_bys'])) {
+ if (!empty($this->_params['group_bys'][$fieldName])) {
$combinations[] = $field['title'];
}
}
CRM_Utils_Array::value("{$fieldName}_from_time", $this->_params),
CRM_Utils_Array::value("{$fieldName}_to_time", $this->_params)
);
- $from_time_format = CRM_Utils_Array::value("{$fieldName}_from_time", $this->_params) ? 'h' : 'd';
+ $from_time_format = !empty($this->_params["{$fieldName}_from_time"]) ? 'h' : 'd';
$from = CRM_Utils_Date::customFormat($from, null, array($from_time_format));
- $to_time_format = CRM_Utils_Array::value("{$fieldName}_to_time", $this->_params) ? 'h' : 'd';
+ $to_time_format = !empty($this->_params["{$fieldName}_to_time"]) ? 'h' : 'd';
$to = CRM_Utils_Date::customFormat($to, null, array($to_time_format));
if ($from || $to) {
);
}
elseif (in_array($rel = CRM_Utils_Array::value("{$fieldName}_relative", $this->_params),
- array_keys($this->getOperationPair(CRM_Report_FORM::OP_DATE))
+ array_keys($this->getOperationPair(CRM_Report_Form::OP_DATE))
)) {
- $pair = $this->getOperationPair(CRM_Report_FORM::OP_DATE);
+ $pair = $this->getOperationPair(CRM_Report_Form::OP_DATE);
$statistics['filters'][] = array(
'title' => $field['title'],
'value' => $pair[$rel],
$val[$key] = $options[$valIds];
}
}
- $pair[$op] = (count($val) == 1) ? (($op == 'notin') ? ts('Is Not') : ts('Is')) : CRM_Utils_Array::value($op, $pair);
+ $pair[$op] = (count($val) == 1) ? (($op == 'notin' || $op == 'mnot') ? ts('Is Not') : ts('Is')) : CRM_Utils_Array::value($op, $pair);
$val = implode(', ', $val);
$value = "{$pair[$op]} " . $val;
}
$this->_limit = " LIMIT $offset, $rowCount";
return array($offset, $rowCount);
}
+ if($this->_limitValue) {
+ if($this->_offsetValue) {
+ $this->_limit = " LIMIT {$this->_offsetValue}, {$this->_limitValue} ";
+ }
+ else {
+ $this->_limit = " LIMIT " . $this->_limitValue;
+ }
+ }
}
function setPager($rowCount = self::ROW_COUNT_LIMIT) {
$pager = new CRM_Utils_Pager($params);
$this->assign_by_ref('pager', $pager);
+ $this->ajaxResponse['totalRows'] = $this->_rowsFound;
}
}
}
//might be survey response field.
- if (CRM_Utils_Array::value('survey_response', $this->_params['fields']) &&
- CRM_Utils_Array::value('isSurveyResponseField', $prop['fields'][$fieldAlias])
- ) {
+ if (!empty($this->_params['fields']['survey_response']) && !empty($prop['fields'][$fieldAlias]['isSurveyResponseField'])) {
return TRUE;
}
}
return TRUE;
}
}
- if (CRM_Utils_Array::value($fieldAlias . '_op', $this->_params) &&
+ if (!empty($this->_params[$fieldAlias . '_op']) &&
in_array($this->_params[$fieldAlias . '_op'], array('nll', 'nnll'))
) {
return TRUE;
foreach ($this->_columns as $tableName => $table) {
if (array_key_exists('fields', $table)) {
foreach ($table['fields'] as $fieldName => $field) {
- if (CRM_Utils_Array::value('required', $field) ||
- CRM_Utils_Array::value($fieldName, $this->_params['fields'])
- ) {
+ if (!empty($field['required']) || !empty($this->_params['fields'][$fieldName])) {
$this->_selectedTables[] = $tableName;
break;
}
}
if (array_key_exists('filters', $table)) {
foreach ($table['filters'] as $filterName => $filter) {
- if (CRM_Utils_Array::value("{$filterName}_value", $this->_params) ||
+ if (!empty($this->_params["{$filterName}_value"]) ||
CRM_Utils_Array::value("{$filterName}_op", $this->_params) == 'nll' ||
CRM_Utils_Array::value("{$filterName}_op", $this->_params) == 'nnll'
) {