* @var null
*/
protected $_customGroupExtends = NULL;
+ protected $_customGroupExtendsJoin = array();
protected $_customGroupFilters = TRUE;
protected $_customGroupGroupBy = FALSE;
protected $_customGroupJoin = 'LEFT JOIN';
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 $_columnHeaders = array();
public $_orderBy = NULL;
public $_orderByFields = 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);
// 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) {
}
// a few auto fills for filters
- if ($fieldGrp == 'filters') {
+ if ($fieldGrp == 'filters') {
// fill operator types
if (!array_key_exists('operatorType', $this->_columns[$tableName][$fieldGrp][$fieldName])) {
switch (CRM_Utils_Array::value('type', $this->_columns[$tableName][$fieldGrp][$fieldName])) {
$this->_columns[$tableName][$fieldGrp][$fieldName]['operatorType'] = CRM_Report_Form::OP_INT;
break;
case CRM_Utils_Type::T_DATE:
- $this->_columns[$tableName][$fieldGrp][$fieldName]['operatorType'] = CRM_Report_Form::OP_DATE;
+ $this->_columns[$tableName][$fieldGrp][$fieldName]['operatorType'] = CRM_Report_Form::OP_DATE;
break;
case CRM_Utils_Type::T_BOOLEAN:
$this->_columns[$tableName][$fieldGrp][$fieldName]['operatorType'] = CRM_Report_Form::OP_SELECT;
if (!array_key_exists('options', $this->_columns[$tableName][$fieldGrp][$fieldName])) {
- $this->_columns[$tableName][$fieldGrp][$fieldName]['options'] =
+ $this->_columns[$tableName][$fieldGrp][$fieldName]['options'] =
array('' => ts('Any'), '0' => ts('No'), '1' => ts('Yes'));
}
break;
default:
- if ($daoOrBaoName &&
- (array_key_exists('pseudoconstant', $this->_columns[$tableName][$fieldGrp][$fieldName])
+ if ($daoOrBaoName &&
+ (array_key_exists('pseudoconstant', $this->_columns[$tableName][$fieldGrp][$fieldName])
|| array_key_exists('enumValues', $this->_columns[$tableName][$fieldGrp][$fieldName]))
) {
// with multiple options operator-type is generally multi-select
foreach ($this->_columns as $tableName => $table) {
if (array_key_exists('fields', $table)) {
foreach ($table['fields'] as $fieldName => $field) {
- if (!array_key_exists('no_display', $field)) {
+ if (!CRM_Utils_Array::value('no_display', $field)) {
if (isset($field['required'])) {
// set default
$this->_defaults['fields'][$fieldName] = 1;
}
//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)) {
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 (!array_key_exists('no_display', $field)) {
+ if (!CRM_Utils_Array::value('no_display', $field)) {
foreach ( array('table', 'field') as $var) {
if (!empty(${$var}['grouping'])) {
if (!is_array(${$var}['grouping'])) {
// 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
if ($this->_autoIncludeIndexedFieldsAsOrderBys && array_key_exists('extends', $table) && !empty($table['extends'])) {
foreach ($table['fields'] as $fieldName => $field) {
- if (!array_key_exists('no_display', $field)) {
+ if (!CRM_Utils_Array::value('no_display', $field)) {
$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(
$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 (is_array($value) && isset($value['no_display'])) {
+ if (CRM_Utils_Array::value('no_display', $value)) {
unset($this->_columnHeaders[$key]);
}
}
// still be having their own select() method. We should fix them as and when encountered and move
// towards generalizing the select() method below.
function select() {
- $select = array();
+ $select = $this->_selectAliases = array();
foreach ($this->_columns as $tableName => $table) {
if (array_key_exists('fields', $table)) {
}
}
+ $this->_selectClauses = $select;
$this->_select = "SELECT " . implode(', ', $select) . " ";
}
}
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
+ //@todo - this could be done in the dashboard no we have a setter
if (!CRM_Utils_Array::value('fields', $this->_params) && !$this->_noFields) {
- $this->_params = $this->_formValues;
+ $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) {
}
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) {
);
}
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],
$this->set(CRM_Utils_Pager::PAGE_ID, $pageId);
$offset = ($pageId - 1) * $rowCount;
- $this->_limit = " LIMIT $offset, " . $rowCount;
+ $offset = CRM_Utils_Type::escape($offset, 'Int');
+ $rowCount = CRM_Utils_Type::escape($rowCount, 'Int');
+
+ $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) {
if (!$this->isFieldSelected($prop)) {
continue;
}
+ $baseJoin = CRM_Utils_Array::value($prop['extends'], $this->_customGroupExtendsJoin, "{$this->_aliases[$extendsTable]}.id");
$customJoin = is_array($this->_customGroupJoin) ? $this->_customGroupJoin[$table] : $this->_customGroupJoin;
$this->_from .= "
-{$customJoin} {$table} {$this->_aliases[$table]} ON {$this->_aliases[$table]}.entity_id = {$this->_aliases[$extendsTable]}.id";
+{$customJoin} {$table} {$this->_aliases[$table]} ON {$this->_aliases[$table]}.entity_id = {$baseJoin}";
// handle for ContactReference
if (array_key_exists('fields', $prop)) {
foreach ($prop['fields'] as $fieldName => $field) {
array('title' => ts('Postal Code'),
'default' => CRM_Utils_Array::value('postal_code', $defaults, FALSE),
),
+ 'postal_code_suffix' =>
+ array('title' => ts('Postal Code Suffix'),
+ 'default' => CRM_Utils_Array::value('postal_code_suffix', $defaults, FALSE),
+ ),
'county_id' =>
array('title' => ts('County'),
'default' => CRM_Utils_Array::value('county_id', $defaults, FALSE),