X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=CRM%2FReport%2FForm.php;h=055e0d9b00242b66569b456d5ed8d3130fa7cbf1;hb=688ab7abad5c2232f79d2630ed3689d929c0abf1;hp=763b10bb2f85b62e30a31aa5f3849968981013e3;hpb=799018f98c1f3c6a0438ddd25d4abf9c47eac6ba;p=civicrm-core.git diff --git a/CRM/Report/Form.php b/CRM/Report/Form.php index 763b10bb2f..055e0d9b00 100644 --- a/CRM/Report/Form.php +++ b/CRM/Report/Form.php @@ -135,6 +135,7 @@ class CRM_Report_Form extends CRM_Core_Form { * @var null */ protected $_customGroupExtends = NULL; + protected $_customGroupExtendsJoin = array(); protected $_customGroupFilters = TRUE; protected $_customGroupGroupBy = FALSE; protected $_customGroupJoin = 'LEFT JOIN'; @@ -193,7 +194,28 @@ class CRM_Report_Form extends CRM_Core_Form { 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; @@ -237,8 +259,15 @@ class CRM_Report_Form extends CRM_Core_Form { */ 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(); @@ -247,6 +276,13 @@ class CRM_Report_Form extends CRM_Core_Form { 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 */ @@ -316,18 +352,20 @@ class CRM_Report_Form extends CRM_Core_Form { CRM_Core_Region::instance('page-header')->add(array( 'markup' => sprintf('', 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); @@ -340,7 +378,7 @@ class CRM_Report_Form extends CRM_Core_Form { 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') @@ -366,7 +404,7 @@ class CRM_Report_Form extends CRM_Core_Form { // 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) { @@ -513,7 +551,7 @@ class CRM_Report_Form extends CRM_Core_Form { } // 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])) { @@ -525,18 +563,18 @@ class CRM_Report_Form extends CRM_Core_Form { $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 @@ -591,7 +629,7 @@ class CRM_Report_Form extends CRM_Core_Form { 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; @@ -641,10 +679,10 @@ class CRM_Report_Form extends CRM_Core_Form { } //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)) { @@ -727,6 +765,54 @@ class CRM_Report_Form extends CRM_Core_Form { 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; @@ -734,7 +820,7 @@ class CRM_Report_Form extends CRM_Core_Form { 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'])) { @@ -805,8 +891,8 @@ class CRM_Report_Form extends CRM_Core_Form { // 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); @@ -823,27 +909,27 @@ class CRM_Report_Form extends CRM_Core_Form { } 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 @@ -939,7 +1025,7 @@ class CRM_Report_Form extends CRM_Core_Form { 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']; } } @@ -1064,8 +1150,8 @@ class CRM_Report_Form extends CRM_Core_Form { // 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'), @@ -1080,27 +1166,27 @@ class CRM_Report_Form extends CRM_Core_Form { ); 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( @@ -1359,7 +1445,7 @@ class CRM_Report_Form extends CRM_Core_Form { $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} )"; } @@ -1690,7 +1776,7 @@ WHERE cg.extends IN ('" . implode("','", $this->_customGroupExtends) . "') AND // 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]); } } @@ -1726,7 +1812,7 @@ WHERE cg.extends IN ('" . implode("','", $this->_customGroupExtends) . "') AND // 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)) { @@ -1878,6 +1964,7 @@ WHERE cg.extends IN ('" . implode("','", $this->_customGroupExtends) . "') AND } } + $this->_selectClauses = $select; $this->_select = "SELECT " . implode(', ', $select) . " "; } @@ -2028,19 +2115,20 @@ WHERE cg.extends IN ('" . implode("','", $this->_customGroupExtends) . "') AND } 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; @@ -2053,6 +2141,14 @@ WHERE cg.extends IN ('" . implode("','", $this->_customGroupExtends) . "') AND $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) { @@ -2133,7 +2229,7 @@ WHERE cg.extends IN ('" . implode("','", $this->_customGroupExtends) . "') AND } 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) { @@ -2367,9 +2463,9 @@ WHERE cg.extends IN ('" . implode("','", $this->_customGroupExtends) . "') AND ); } 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], @@ -2610,6 +2706,14 @@ WHERE cg.extends IN ('" . implode("','", $this->_customGroupExtends) . "') AND $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) { @@ -2875,10 +2979,11 @@ ORDER BY cg.weight, cf.weight"; 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) { @@ -3120,6 +3225,10 @@ LEFT JOIN civicrm_contact {$field['alias']} ON {$field['alias']}.id = {$this->_a 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),