<?php
-// $Id$
-
/*
+--------------------------------------------------------------------+
- | CiviCRM version 4.3 |
+ | CiviCRM version 4.4 |
+--------------------------------------------------------------------+
| Copyright CiviCRM LLC (c) 2004-2013 |
+--------------------------------------------------------------------+
* @var null
*/
protected $_customGroupExtends = NULL;
+ protected $_customGroupExtendsJoin = array();
protected $_customGroupFilters = TRUE;
protected $_customGroupGroupBy = FALSE;
+ protected $_customGroupJoin = 'LEFT JOIN';
/**
* build tags filter
public $_drilldownReport = array();
- protected $_grandFlag = FALSE;
-
/**
* An attribute for checkbox/radio form field layout
*
protected $_csvSupported = TRUE;
protected $_add2groupSupported = TRUE;
protected $_groups = NULL;
+ protected $_grandFlag = FALSE;
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;
+ /**
+ * Flag to indicate if result-set is to be stored in a class variable which could be retrieved using getResultSet() method.
+ *
+ * @var boolean
+ */
+ protected $_storeResultSet = FALSE;
+
+ /**
+ * When _storeResultSet Flag is set use this var to store result set in form of array
+ *
+ * @var boolean
+ */
+ protected $_resultSet = array();
+
/**
* To what frequency group-by a date column
*
*/
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 $_orderByArray = array();
public $_groupBy = NULL;
+ 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
}
// Get all custom groups
- $allGroups = CRM_Core_PseudoConstant::customGroup();
-
- // Get the custom groupIds for which the user have VIEW permission
- require_once 'CRM/ACL/API.php';
- $permCustomGroupIds = CRM_ACL_API::group(CRM_Core_Permission::VIEW, NULL, 'civicrm_custom_group', $allGroups, NULL);
+ $allGroups = CRM_Core_PseudoConstant::get('CRM_Core_DAO_CustomField', 'custom_group_id');
- // do not allow custom data for reports if user don't have
- // permission to access custom data.
- if (!empty($this->_customGroupExtends) && !CRM_Core_Permission::check('access all custom data') && empty($permCustomGroupIds)) {
- $this->_customGroupExtends = array();
+ // Get the custom groupIds for which the user has VIEW permission
+ // If the user has 'access all custom data' permission, we'll leave $permCustomGroupIds empty
+ // and addCustomDataToColumns() will allow access to all custom groups.
+ $permCustomGroupIds = array();
+ if (!CRM_Core_Permission::check('access all custom data')) {
+ $permCustomGroupIds = CRM_ACL_API::group(CRM_Core_Permission::VIEW, NULL, 'civicrm_custom_group', $allGroups, NULL);
+ // do not allow custom data for reports if user doesn't have
+ // permission to access custom data.
+ if (!empty($this->_customGroupExtends) && empty($permCustomGroupIds)) {
+ $this->_customGroupExtends = array();
+ }
}
// merge custom data columns to _columns list, if any
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);
$params = array('id' => $this->_id);
$this->_instanceValues = array();
- CRM_Core_DAO::commonRetrieve('CRM_Report_DAO_Instance',
+ CRM_Core_DAO::commonRetrieve('CRM_Report_DAO_ReportInstance',
$params,
$this->_instanceValues
);
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')
// 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) {
$this->_chartButtonName = $this->getButtonName('submit', 'chart');
}
- static function addBreadCrumb() {
+ function addBreadCrumb() {
$breadCrumbs =
array(
array(
$this->preProcessCommon();
if (!$this->_id) {
- self::addBreadCrumb();
+ $this->addBreadCrumb();
}
foreach ($this->_columns as $tableName => $table) {
$this->_aliases[$tableName] = $this->_columns[$tableName]['alias'];
+ $daoOrBaoName = NULL;
// higher preference to bao object
if (array_key_exists('bao', $table)) {
- require_once str_replace('_', DIRECTORY_SEPARATOR, $table['bao'] . '.php');
- eval("\$expFields = {$table['bao']}::exportableFields( );");
+ $daoOrBaoName = $table['bao'];
+ $expFields = $daoOrBaoName::exportableFields( );
}
- else {
- require_once str_replace('_', DIRECTORY_SEPARATOR, $table['dao'] . '.php');
- eval("\$expFields = {$table['dao']}::export( );");
+ elseif (array_key_exists('dao', $table)){
+ $daoOrBaoName = $table['dao'];
+ $expFields = $daoOrBaoName::export( );
+ }
+ else{
+ $expFields = array();
}
$doNotCopy = array('required');
$this->_columns[$tableName][$fieldGrp][$fieldName]['dbAlias'] = $alias . '.' . $this->_columns[$tableName][$fieldGrp][$fieldName]['name'];
}
- if (CRM_Utils_Array::value('type', $this->_columns[$tableName][$fieldGrp][$fieldName]) &&
- !isset($this->_columns[$tableName][$fieldGrp][$fieldName]['operatorType'])
- ) {
- if (in_array($this->_columns[$tableName][$fieldGrp][$fieldName]['type'],
- array(CRM_Utils_Type::T_MONEY, CRM_Utils_Type::T_FLOAT)
- )) {
- $this->_columns[$tableName][$fieldGrp][$fieldName]['operatorType'] = CRM_Report_Form::OP_FLOAT;
- }
- elseif (in_array($this->_columns[$tableName][$fieldGrp][$fieldName]['type'],
- array(CRM_Utils_Type::T_INT)
- )) {
- $this->_columns[$tableName][$fieldGrp][$fieldName]['operatorType'] = CRM_Report_Form::OP_INT;
+ // a few auto fills for 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])) {
+ case CRM_Utils_Type::T_MONEY:
+ case CRM_Utils_Type::T_FLOAT:
+ $this->_columns[$tableName][$fieldGrp][$fieldName]['operatorType'] = CRM_Report_Form::OP_FLOAT;
+ break;
+ case CRM_Utils_Type::T_INT:
+ $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;
+ 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'] =
+ array('' => ts('Any'), '0' => ts('No'), '1' => ts('Yes'));
+ }
+ break;
+ default:
+ 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
+ $this->_columns[$tableName][$fieldGrp][$fieldName]['operatorType'] = CRM_Report_Form::OP_MULTISELECT;
+ if (!array_key_exists('options', $this->_columns[$tableName][$fieldGrp][$fieldName])) {
+ // fill options
+ $this->_columns[$tableName][$fieldGrp][$fieldName]['options'] = CRM_Core_PseudoConstant::get($daoOrBaoName, $fieldName);
+ }
+ }
+ break;
+ }
}
}
}
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;
foreach ($table['filters'] as $fieldName => $field) {
if (isset($field['default'])) {
if (CRM_Utils_Array::value('type', $field) & CRM_Utils_Type::T_DATE) {
- $this->_defaults["{$fieldName}_relative"] = $field['default'];
+ if(is_array($field['default'])){
+ $this->_defaults["{$fieldName}_from"] = CRM_Utils_Array::value('from', $field['default']);
+ $this->_defaults["{$fieldName}_to"] = CRM_Utils_Array::value('to', $field['default']);
+ $this->_defaults["{$fieldName}_relative"] = 0;
+ }
+ else{
+ $this->_defaults["{$fieldName}_relative"] = $field['default'];
+ }
}
else {
$this->_defaults["{$fieldName}_value"] = $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)) {
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;
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 (isset($field['grouping'])) {
- $tableName = $field['grouping'];
+ $groupTitle = '';
+ if (!CRM_Utils_Array::value('no_display', $field)) {
+ foreach ( array('table', 'field') as $var) {
+ if (!empty(${$var}['grouping'])) {
+ if (!is_array(${$var}['grouping'])) {
+ $tableName = ${$var}['grouping'];
+ } else {
+ $tableName = array_keys(${$var}['grouping']);
+ $tableName = $tableName[0];
+ $groupTitle = array_values(${$var}['grouping']);
+ $groupTitle = $groupTitle[0];
+ }
+ }
}
- elseif (isset($table['grouping'])) {
- $tableName = $table['grouping'];
+
+ if (!$groupTitle && isset($table['group_title'])) {
+ $groupTitle = $table['group_title'];
}
- $colGroups[$tableName]['fields'][$fieldName] = CRM_Utils_Array::value('title', $field);
- if (isset($table['group_title'])) {
- $colGroups[$tableName]['group_title'] = $table['group_title'];
+ $colGroups[$tableName]['fields'][$fieldName] = CRM_Utils_Array::value('title', $field);
+ if ($groupTitle && !CRM_Utils_Array::value('group_title', $colGroups[$tableName])) {
+ $colGroups[$tableName]['group_title'] = $groupTitle;
}
$options[$fieldName] = CRM_Utils_Array::value('title', $field);
foreach ($this->_filters as $table => $attributes) {
foreach ($attributes as $fieldName => $field) {
// get ready with option value pair
- $operations = self::getOperationPair(
+ // @ todo being able to specific options for a field (e.g a date field) in the field spec as an array rather than an override
+ // would be useful
+ $operations = $this->getOperationPair(
CRM_Utils_Array::value('operatorType', $field),
- $fieldName
- );
+ $fieldName);
$filters[$table][$fieldName] = $field;
// 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);
- $this->addElement('select', "{$fieldName}_value", NULL, $field['options']);
+ 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);
+ 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, TRUE, 'searchDate', true);
+ 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 ($field['type'] == 'select') {
$this->addElement('select', "{$fieldName}", $field['title'], $field['options']);
}
- else {
+ else if ($field['type'] == 'checkbox') {
$options[$field['title']] = $fieldName;
+ $this->addCheckBox($fieldName, NULL,
+ $options, NULL,
+ NULL, NULL, NULL, $this->_fourColumnAttribute
+ );
}
}
-
- $this->addCheckBox("options", $field['title'],
- $options, NULL,
- NULL, NULL, NULL, $this->_fourColumnAttribute
- );
}
+ $this->assign('otherOptions', $this->_options);
}
function addChartOptions() {
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'];
}
}
// Note: $fieldName param allows inheriting class to build operationPairs
// specific to a field.
- static function getOperationPair($type = "string", $fieldName = NULL) {
+ function getOperationPair($type = "string", $fieldName = NULL) {
// 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:
- return array('lte' => ts('Is less than or equal to'),
+ 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'),
'bw' => ts('Is between'),
'eq' => ts('Is equal to'),
);
break;
- case CRM_Report_FORM::OP_SELECT:
- return array('eq' => ts('Is equal to'));
+ 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:
- return array('in' => ts('Is one of'),
+ 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:
- return array('nll' => ts('Is empty (Null)'),
+ 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'));
+ return array(
+ 'mhas' => ts('Is one of'),
+ );
default:
// type is string
- return array('has' => ts('Contains'),
+ return array(
+ 'has' => ts('Contains'),
'sw' => ts('Starts with'),
'ew' => ts('Ends with'),
'nhas' => ts('Does not contain'),
}
}
- static function getSQLOperator($operator = "like") {
+ function getSQLOperator($operator = "like") {
switch ($operator) {
case 'eq':
return '=';
else {
$value = "'{$value}'";
}
- $sqlOP = self::getSQLOperator($op);
+ $sqlOP = $this->getSQLOperator($op);
$clause = "( {$field['dbAlias']} $sqlOP $value )";
}
break;
case 'in':
case 'notin':
if ($value !== NULL && is_array($value) && count($value) > 0) {
- $sqlOP = self::getSQLOperator($op);
+ $sqlOP = $this->getSQLOperator($op);
if (CRM_Utils_Array::value('type', $field) == CRM_Utils_Type::T_STRING) {
//cycle through selections and esacape values
foreach ($value as $key => $selection) {
case 'mhas':
// mhas == multiple has
if ($value !== NULL && count($value) > 0) {
- $sqlOP = self::getSQLOperator($op);
+ $sqlOP = $this->getSQLOperator($op);
$clause = "{$field['dbAlias']} REGEXP '[[:<:]]" . implode('|', $value) . "[[:>:]]'";
}
break;
else {
$value = "'{$value}'";
}
- $sqlOP = self::getSQLOperator($op);
+ $sqlOP = $this->getSQLOperator($op);
$clause = "( {$field['dbAlias']} $sqlOP $value )";
}
break;
case 'nll':
case 'nnll':
- $sqlOP = self::getSQLOperator($op);
+ $sqlOP = $this->getSQLOperator($op);
$clause = "( {$field['dbAlias']} $sqlOP )";
break;
if (isset($field['clause'])) {
// FIXME: we not doing escape here. Better solution is to use two
// different types - data-type and filter-type
- eval("\$clause = \"{$field['clause']}\";");
+ $clause = $field['clause'];
}
else {
$value = CRM_Utils_Type::escape($value, $type);
- $sqlOP = self::getSQLOperator($op);
+ $sqlOP = $this->getSQLOperator($op);
if ($field['type'] == CRM_Utils_Type::T_STRING) {
$value = "'{$value}'";
}
$relative, $from, $to, $type = NULL, $fromTime = NULL, $toTime = NULL
) {
$clauses = array();
- if (in_array($relative, array_keys(self::getOperationPair(CRM_Report_FORM::OP_DATE)))) {
- $sqlOP = self::getSQLOperator($relative);
+ if (in_array($relative, array_keys($this->getOperationPair(CRM_Report_Form::OP_DATE)))) {
+ $sqlOP = $this->getSQLOperator($relative);
return "( {$fieldName} {$sqlOP} )";
}
- list($from, $to) = self::getFromTo($relative, $from, $to, $fromTime, $toTime);
+ list($from, $to) = $this->getFromTo($relative, $from, $to, $fromTime, $toTime);
if ($from) {
$from = ($type == CRM_Utils_Type::T_DATE) ? substr($from, 0, 8) : $from;
return NULL;
}
-
- static function dateDisplay($relative, $from, $to) {
- list($from, $to) = self::getFromTo($relative, $from, $to);
+ /**
+ * @todo - could not find any instances where this is called
+ * @param unknown_type $relative
+ * @param String $from
+ * @param String_type $to
+ * @return string|NULL
+ */
+ function dateDisplay($relative, $from, $to) {
+ list($from, $to) = $this->getFromTo($relative, $from, $to);
if ($from) {
$clauses[] = CRM_Utils_Date::customFormat($from, NULL, array('m', 'M'));
return NULL;
}
- static function getFromTo($relative, $from, $to, $fromtime = NULL, $totime = NULL) {
+ function getFromTo($relative, $from, $to, $fromtime = NULL, $totime = NULL) {
if (empty($totime)) {
$totime = '235959';
}
// 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)) {
$select[] = "$stat({$field['dbAlias']}) as $alias";
$this->_columnHeaders["{$tableName}_{$fieldName}_{$stat}"]['title'] = $label;
$this->_columnHeaders["{$tableName}_{$fieldName}_{$stat}"]['type'] = $field['type'];
- $this->_statFields[] = $alias;
+ $this->_statFields[$label] = $alias;
$this->_selectAliases[] = $alias;
break;
$select[] = "COUNT({$field['dbAlias']}) as $alias";
$this->_columnHeaders["{$tableName}_{$fieldName}_{$stat}"]['title'] = $label;
$this->_columnHeaders["{$tableName}_{$fieldName}_{$stat}"]['type'] = CRM_Utils_Type::T_INT;
- $this->_statFields[] = $alias;
+ $this->_statFields[$label] = $alias;
+ $this->_selectAliases[] = $alias;
+ break;
+
+ case 'count_distinct':
+ $select[] = "COUNT(DISTINCT {$field['dbAlias']}) as $alias";
+ $this->_columnHeaders["{$tableName}_{$fieldName}_{$stat}"]['title'] = $label;
+ $this->_columnHeaders["{$tableName}_{$fieldName}_{$stat}"]['type'] = CRM_Utils_Type::T_INT;
+ $this->_statFields[$label] = $alias;
$this->_selectAliases[] = $alias;
break;
$select[] = "ROUND(AVG({$field['dbAlias']}),2) as $alias";
$this->_columnHeaders["{$tableName}_{$fieldName}_{$stat}"]['title'] = $label;
$this->_columnHeaders["{$tableName}_{$fieldName}_{$stat}"]['type'] = $field['type'];
- $this->_statFields[] = $alias;
+ $this->_statFields[$label] = $alias;
$this->_selectAliases[] = $alias;
break;
}
}
}
+ $this->_selectClauses = $select;
$this->_select = "SELECT " . implode(', ', $select) . " ";
}
}
function where() {
- $whereClauses = $havingClauses = array();
+ $this->storeWhereHavingClauseArray();
+
+ if (empty($this->_whereClauses)) {
+ $this->_where = "WHERE ( 1 ) ";
+ $this->_having = "";
+ }
+ else {
+ $this->_where = "WHERE " . implode(' AND ', $this->_whereClauses);
+ }
+
+ if ($this->_aclWhere) {
+ $this->_where .= " AND {$this->_aclWhere} ";
+ }
+
+ if (!empty($this->_havingClauses)) {
+ // use this clause to construct group by clause.
+ $this->_having = "HAVING " . implode(' AND ', $this->_havingClauses);
+ }
+ }
+
+ /**
+ * Store Where clauses into an array - breaking out this step makes
+ * over-riding more flexible as the clauses can be used in constructing a
+ * temp table that may not be part of the final where clause or added
+ * in other functions
+ */
+ function storeWhereHavingClauseArray(){
foreach ($this->_columns as $tableName => $table) {
if (array_key_exists('filters', $table)) {
foreach ($table['filters'] as $fieldName => $field) {
+ // respect pseudofield to filter spec so fields can be marked as
+ // not to be handled here
+ if(!empty($field['pseudofield'])){
+ continue;
+ }
$clause = NULL;
if (CRM_Utils_Array::value('type', $field) & CRM_Utils_Type::T_DATE) {
if (CRM_Utils_Array::value('operatorType', $field) == CRM_Report_Form::OP_MONTH) {
$op = CRM_Utils_Array::value("{$fieldName}_op", $this->_params);
if ($op) {
$clause = $this->whereClause($field,
- $op,
- CRM_Utils_Array::value("{$fieldName}_value", $this->_params),
- CRM_Utils_Array::value("{$fieldName}_min", $this->_params),
- CRM_Utils_Array::value("{$fieldName}_max", $this->_params)
+ $op,
+ CRM_Utils_Array::value("{$fieldName}_value", $this->_params),
+ CRM_Utils_Array::value("{$fieldName}_min", $this->_params),
+ CRM_Utils_Array::value("{$fieldName}_max", $this->_params)
);
}
}
if (!empty($clause)) {
if (CRM_Utils_Array::value('having', $field)) {
- $havingClauses[] = $clause;
+ $this->_havingClauses[] = $clause;
}
else {
- $whereClauses[] = $clause;
+ $this->_whereClauses[] = $clause;
}
}
}
}
}
- if (empty($whereClauses)) {
- $this->_where = "WHERE ( 1 ) ";
- $this->_having = "";
- }
- else {
- $this->_where = "WHERE " . implode(' AND ', $whereClauses);
- }
-
- if ($this->_aclWhere) {
- $this->_where .= " AND {$this->_aclWhere} ";
- }
-
- if (!empty($havingClauses)) {
- // use this clause to construct group by clause.
- $this->_having = "HAVING " . implode(' AND ', $havingClauses);
- }
}
-
function processReportMode() {
$buttonName = $this->controller->getButtonName();
}
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) {
}
$this->assign('sections', $this->_sections);
}
+
/*
* In some cases other functions want to know which fields are selected for ordering by
* Separating this into a separate function allows it to be called separately from constructing
}
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) {
if ($fieldName == $orderBy['column']) {
- $orderByField = $field;
+ $orderByField = array_merge($field, $orderBy);
$orderByField['tplField'] = "{$tableName}_{$fieldName}";
break 2;
}
}
if (!empty($orderByField)) {
+ $this->_orderByFields[] = $orderByField;
$orderBys[] = "{$orderByField['dbAlias']} {$orderBy['order']}";
// Record any section headers for assignment to the template
}
}
}
+
if (is_array($this->_sections)) {
return array_diff_key($this->_sections, $selectColumns);
}
);
}
elseif (in_array($rel = CRM_Utils_Array::value("{$fieldName}_relative", $this->_params),
- array_keys(self::getOperationPair(CRM_Report_FORM::OP_DATE))
+ array_keys($this->getOperationPair(CRM_Report_Form::OP_DATE))
)) {
- $pair = self::getOperationPair(CRM_Report_FORM::OP_DATE);
+ $pair = $this->getOperationPair(CRM_Report_Form::OP_DATE);
$statistics['filters'][] = array(
'title' => $field['title'],
'value' => $pair[$rel],
$op = CRM_Utils_Array::value("{$fieldName}_op", $this->_params);
$value = NULL;
if ($op) {
- $pair = self::getOperationPair(
+ $pair = $this->getOperationPair(
CRM_Utils_Array::value('operatorType', $field),
$fieldName
);
$value = $pair[$op];
}
elseif (is_array($val) && (!empty($val))) {
- $options = $field['options'];
+ $options = CRM_Utils_Array::value('options', $field, array());
foreach ($val as $key => $valIds) {
if (isset($options[$valIds])) {
$val[$key] = $options[$valIds];
}
}
- $pair[$op] = (count($val) == 1) ? (($op == 'notin') ? ts('Is Not') : ts('Is')) : $pair[$op];
+ $pair[$op] = (count($val) == 1) ? (($op == 'notin') ? ts('Is Not') : ts('Is')) : CRM_Utils_Array::value($op, $pair);
$val = implode(', ', $val);
$value = "{$pair[$op]} " . $val;
}
}
function endPostProcess(&$rows = NULL) {
+ if ( $this->_storeResultSet ) {
+ $this->_resultSet = $rows;
+ }
+
if ($this->_outputMode == 'print' ||
$this->_outputMode == 'pdf' ||
$this->_sendmail
}
}
+ function storeResultSet() {
+ $this->_storeResultSet = TRUE;
+ }
+
+ function getResultSet() {
+ return $this->_resultSet;
+ }
+
/*
* Get Template file name - use default form template if a specific one has not been set up for this report
*
* Although this function is super-short it is useful to keep separate so it can be over-ridden by report classes.
*/
function compileContent(){
- $templateFile = $this->getTemplateFileName();
+ $templateFile = $this->getHookedTemplateFileName();
return $this->_formValues['report_header'] . CRM_Core_Form::$_template->fetch($templateFile) . $this->_formValues['report_footer'];
}
$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) {
WHERE smartgroup_contact.group_id IN ({$smartGroups}) ";
}
- $sqlOp = self::getSQLOperator($op);
+ $sqlOp = $this->getSQLOperator($op);
if (!is_array($value)) {
$value = array($value);
}
// not using left join in query because if any contact
// belongs to more than one tag, results duplicate
// entries.
- $sqlOp = self::getSQLOperator($op);
+ $sqlOp = $this->getSQLOperator($op);
if (!is_array($value)) {
$value = array($value);
}
}
if (!array_key_exists('type', $curFields[$fieldName])) {
- $curFields[$fieldName]['type'] = $curFilters[$fieldName]['type'];
+ $curFields[$fieldName]['type'] = CRM_Utils_Array::value('type', $curFilters[$fieldName], array());
}
if ($addFields) {
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 .= "
-LEFT JOIN $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) {
*/
function preProcessOrderBy(&$formValues) {
// Object to show/hide form elements
- $_showHide = &new CRM_Core_ShowHideBlocks('', '');
+ $_showHide = new CRM_Core_ShowHideBlocks('', '');
$_showHide->addShow('optionField_1');
function selectedTables() {
if (!$this->_selectedTables) {
$orderByColumns = array();
- if (is_array($this->_params['order_bys'])) {
+ if (array_key_exists('order_bys', $this->_params) && is_array($this->_params['order_bys'])) {
foreach ($this->_params['order_bys'] as $orderBy) {
$orderByColumns[] = $orderBy['column'];
}
return $this->_selectedTables;
}
- /*
+ /**
+ * @deprecated - use getAddressColumns which is a more accurate description
+ * and also accepts an array of options rather than a long list
+ *
* function for adding address fields to construct function in reports
* @param bool $groupBy Add GroupBy? Not appropriate for detail report
* @param bool $orderBy Add GroupBy? Not appropriate for detail report
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),
}
}
+ /**
+ * Add Phone into From Table if required
+ */
+ function addPhoneFromClause() {
+ // include address field if address column is to be included
+ if ($this->isTableSelected('civicrm_phone')
+ ) {
+ $this->_from .= "
+ LEFT JOIN civicrm_phone {$this->_aliases['civicrm_phone']}
+ ON ({$this->_aliases['civicrm_contact']}.id =
+ {$this->_aliases['civicrm_phone']}.contact_id) AND
+ {$this->_aliases['civicrm_phone']}.is_primary = 1\n";
+ }
+ }
+
+ /**
+ * Get phone columns to add to array
+ * @param array $options
+ * - prefix Prefix to add to table (in case of more than one instance of the table)
+ * - prefix_label Label to give columns from this phone table instance
+ * @return array phone columns definition
+ */
+ function getPhoneColumns($options = array()){
+ $defaultOptions = array(
+ 'prefix' => '',
+ 'prefix_label' => '',
+ );
+
+ $options = array_merge($defaultOptions,$options);
+
+ $fields = array(
+ $options['prefix'] . 'civicrm_phone' => array(
+ 'dao' => 'CRM_Core_DAO_Phone',
+ 'fields' => array(
+ $options['prefix'] . 'phone' => array(
+ 'title' => ts($options['prefix_label'] . 'Phone'),
+ 'name' => 'phone'
+ ),
+ ),
+ ),
+ );
+ return $fields;
+ }
+
+ /**
+ * Get address columns to add to array
+ * @param array $options
+ * - prefix Prefix to add to table (in case of more than one instance of the table)
+ * - prefix_label Label to give columns from this address table instance
+ * @return array address columns definition
+ */
+ function getAddressColumns($options = array()){
+ $defaultOptions = array(
+ 'prefix' => '',
+ 'prefix_label' => '',
+ 'group_by' => TRUE,
+ 'order_by' => TRUE,
+ 'filters' => TRUE,
+ 'defaults' => array(
+ ),
+ );
+ $options = array_merge($defaultOptions,$options);
+ return $this->addAddressFields(
+ $options['group_by'],
+ $options['order_by'],
+ $options['filters'],
+ $options['defaults']
+ );
+
+ }
+
function add2group($groupID) {
if (is_numeric($groupID) && isset($this->_aliases['civicrm_contact'])) {
$select = "SELECT DISTINCT {$this->_aliases['civicrm_contact']}.id AS addtogroup_contact_id, ";
}
}
}
-}
+ /* function used for showing charts on print screen */
+ static function uploadChartImage() {
+ // upload strictly for '.png' images
+ $name = trim(basename(CRM_Utils_Request::retrieve('name', 'String', CRM_Core_DAO::$_nullObject, FALSE, NULL, 'GET')));
+ if (preg_match('/\.png$/', $name)) {
+ //
+ // POST data is usually string data, but we are passing a RAW .png
+ // so PHP is a bit confused and $_POST is empty. But it has saved
+ // the raw bits into $HTTP_RAW_POST_DATA
+ //
+ $httpRawPostData = $GLOBALS['HTTP_RAW_POST_DATA'];
+
+ // prepare the directory
+ $config = CRM_Core_Config::singleton();
+ $defaultPath = str_replace('/persist/contribute/' , '/persist/', $config->imageUploadDir) . '/openFlashChart/';
+ if (!file_exists($defaultPath)) {
+ mkdir($defaultPath, 0777, TRUE);
+ }
+
+ // full path to the saved image including filename
+ $destination = $defaultPath . $name;
+
+ //write and save
+ $jfh = fopen($destination, 'w') or die("can't open file");
+ fwrite($jfh, $httpRawPostData);
+ fclose($jfh);
+ CRM_Utils_System::civiExit();
+ }
+ }
+}