*/
protected $tabs = array();
+ /**
+ * Should we add paging.
+ *
+ * @var bool
+ */
+ protected $addPaging = TRUE;
+
/**
* An attribute for checkbox/radio form field layout
*
* 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
+ * of the code (see limit() fn.
+ *
* @var integer
*/
protected $_limitValue = NULL;
$this->_formValues = NULL;
}
+ $this->setOutputMode();
+
+ if ($this->_outputMode == 'copy') {
+ $this->_createNew = TRUE;
+ $this->_params = $this->_formValues;
+ $this->_params['view_mode'] = 'criteria';
+ $this->_params['title'] = ts('(copy)') . $this->getTitle();
+ // Do not pass go. Do not collect another chance to re-run the same query.
+ CRM_Report_Form_Instance::postProcess($this);
+ }
+
// lets always do a force if reset is found in the url.
// Hey why not? see CRM-17225 for more about this. The use of reset to be force is historical for reasons stated
// in the comment line above these 2.
- if (!empty($_REQUEST['reset']) && CRM_Utils_Request::retrieve('output', 'String') != 'criteria'
- && CRM_Utils_Request::retrieve('output', 'String') != 'save') {
+ if (!empty($_REQUEST['reset'])
+ && !in_array(CRM_Utils_Request::retrieve('output', 'String'), array('save', 'criteria'))) {
$this->_force = 1;
}
$this->_offsetValue = $_offsetValue;
}
+ /**
+ * Setter for $addPaging.
+ *
+ * @param bool $value
+ */
+ public function setAddPaging($value) {
+ $this->addPaging = $value;
+ }
+
/**
* Getter for $_defaultValues.
*
break;
case 'mhas':
- // mhas == multiple has
- if ($value !== NULL && count($value) > 0) {
- $sqlOP = $this->getSQLOperator($op);
- foreach ($value as $key => $val) {
- $val = str_replace('(', '[[.left-parenthesis.]]', $val);
- $val = str_replace(')', '[[.right-parenthesis.]]', $val);
- $value[$key] = $val;
- }
- $sp = CRM_Core_DAO::VALUE_SEPARATOR;
- $clause
- = "{$field['dbAlias']} REGEXP '$sp" . implode("$sp|$sp", $value) . "$sp'";
- }
- break;
-
case 'mnot':
// multiple has or multiple not
if ($value !== NULL && count($value) > 0) {
- $sqlOP = $this->getSQLOperator($op);
- foreach ($value as $key => $val) {
- $val = str_replace('(', '[[.left-parenthesis.]]', $val);
- $val = str_replace(')', '[[.right-parenthesis.]]', $val);
- $value[$key] = $val;
- }
- $sp = CRM_Core_DAO::VALUE_SEPARATOR;
- $clause
- = "( {$field['dbAlias']} NOT REGEXP '$sp" . implode("$sp|$sp", $value) .
- "$sp' OR {$field['dbAlias']} IS NULL )";
+ $value = CRM_Utils_Type::escapeAll($value, $type);
+ $operator = $op == 'mnot' ? 'NOT' : '';
+ $regexp = "[[:cntrl:]]*" . implode('[[:>:]]*|[[:<:]]*', (array) $value) . "[[:cntrl:]]*";
+ $clause = "{$field['dbAlias']} {$operator} REGEXP '{$regexp}'";
}
break;
return;
}
- $customFields = $fieldValueMap = array();
- $customFieldCols = array(
- 'column_name',
- 'data_type',
- 'html_type',
- 'option_group_id',
- 'id',
- );
-
// skip for type date and ContactReference since date format is already handled
$query = "
-SELECT cg.table_name, cf." . implode(", cf.", $customFieldCols) . ", ov.value, ov.label
+SELECT cg.table_name, cf.id
FROM civicrm_custom_field cf
INNER JOIN civicrm_custom_group cg ON cg.id = cf.custom_group_id
-LEFT JOIN civicrm_option_value ov ON cf.option_group_id = ov.option_group_id
WHERE cg.extends IN ('" . implode("','", $this->_customGroupExtends) . "') AND
cg.is_active = 1 AND
cf.is_active = 1 AND
$dao = CRM_Core_DAO::executeQuery($query);
while ($dao->fetch()) {
- foreach ($customFieldCols as $key) {
- $customFields[$dao->table_name . '_custom_' .
- $dao->id][$key] = $dao->$key;
- }
- if ($dao->option_group_id) {
- $fieldValueMap[$dao->option_group_id][$dao->value] = $dao->label;
- }
+ $customFields[$dao->table_name . '_custom_' . $dao->id] = $dao->id;
}
$dao->free();
foreach ($rows as $rowNum => $row) {
foreach ($row as $tableCol => $val) {
if (array_key_exists($tableCol, $customFields)) {
- $rows[$rowNum][$tableCol] = $this->formatCustomValues($val, $customFields[$tableCol], $fieldValueMap);
+ $rows[$rowNum][$tableCol] = CRM_Core_BAO_CustomField::displayValue($val, $customFields[$tableCol]);
$entryFound = TRUE;
}
}
}
}
- /**
- * Format custom values.
- *
- * @param mixed $value
- * @param array $customField
- * @param array $fieldValueMap
- *
- * @return float|string|void
- */
- public function formatCustomValues($value, $customField, $fieldValueMap) {
- if (CRM_Utils_System::isNull($value)) {
- return NULL;
- }
-
- $htmlType = $customField['html_type'];
-
- switch ($customField['data_type']) {
- case 'Boolean':
- if ($value == '1') {
- $retValue = ts('Yes');
- }
- else {
- $retValue = ts('No');
- }
- break;
-
- case 'Link':
- $retValue = CRM_Utils_System::formatWikiURL($value);
- break;
-
- case 'File':
- $retValue = $value;
- break;
-
- case 'Memo':
- $retValue = $value;
- break;
-
- case 'Float':
- if ($htmlType == 'Text') {
- $retValue = (float) $value;
- break;
- }
- case 'Money':
- if ($htmlType == 'Text') {
- $retValue = CRM_Utils_Money::format($value, NULL, '%a');
- break;
- }
- case 'String':
- case 'Int':
- if (in_array($htmlType, array(
- 'Text',
- 'TextArea',
- ))) {
- $retValue = $value;
- break;
- }
- case 'StateProvince':
- case 'Country':
-
- switch ($htmlType) {
- case 'Multi-Select Country':
- $value = explode(CRM_Core_DAO::VALUE_SEPARATOR, $value);
- $customData = array();
- foreach ($value as $val) {
- if ($val) {
- $customData[] = CRM_Core_PseudoConstant::country($val, FALSE);
- }
- }
- $retValue = implode(', ', $customData);
- break;
-
- case 'Select Country':
- $retValue = CRM_Core_PseudoConstant::country($value, FALSE);
- break;
-
- case 'Select State/Province':
- $retValue = CRM_Core_PseudoConstant::stateProvince($value, FALSE);
- break;
-
- case 'Multi-Select State/Province':
- $value = explode(CRM_Core_DAO::VALUE_SEPARATOR, $value);
- $customData = array();
- foreach ($value as $val) {
- if ($val) {
- $customData[] = CRM_Core_PseudoConstant::stateProvince($val, FALSE);
- }
- }
- $retValue = implode(', ', $customData);
- break;
-
- case 'Select':
- case 'Radio':
- case 'Autocomplete-Select':
- $retValue = $fieldValueMap[$customField['option_group_id']][$value];
- break;
-
- case 'CheckBox':
- case 'AdvMulti-Select':
- case 'Multi-Select':
- $value = explode(CRM_Core_DAO::VALUE_SEPARATOR, $value);
- $customData = array();
- foreach ($value as $val) {
- if ($val) {
- $customData[] = $fieldValueMap[$customField['option_group_id']][$val];
- }
- }
- $retValue = implode(', ', $customData);
- break;
-
- default:
- $retValue = $value;
- }
- break;
-
- default:
- $retValue = $value;
- }
-
- return $retValue;
- }
-
/**
* Remove duplicate rows.
*
* Set output mode.
*/
public function processReportMode() {
- $buttonName = $this->controller->getButtonName();
-
- $output = CRM_Utils_Request::retrieve(
- 'output',
- 'String',
- CRM_Core_DAO::$_nullObject
- );
+ $this->setOutputMode();
$this->_sendmail
= CRM_Utils_Request::retrieve(
$printOnly = FALSE;
$this->assign('printOnly', FALSE);
- if ($this->_printButtonName == $buttonName || $output == 'print' ||
- ($this->_sendmail && !$output)
+ if ($this->_outputMode == 'print' ||
+ ($this->_sendmail && !$this->_outputMode)
) {
$this->assign('printOnly', TRUE);
$printOnly = TRUE;
+ $this->addPaging = FALSE;
$this->assign('outputMode', 'print');
$this->_outputMode = 'print';
if ($this->_sendmail) {
$this->_absoluteUrl = TRUE;
}
}
- elseif ($this->_pdfButtonName == $buttonName || $output == 'pdf') {
- $this->assign('printOnly', TRUE);
+ elseif ($this->_outputMode == 'pdf') {
$printOnly = TRUE;
- $this->assign('outputMode', 'pdf');
- $this->_outputMode = 'pdf';
+ $this->addPaging = FALSE;
$this->_absoluteUrl = TRUE;
}
- elseif ($this->_csvButtonName == $buttonName || $output == 'csv') {
- $this->assign('printOnly', TRUE);
+ elseif ($this->_outputMode == 'csv') {
$printOnly = TRUE;
- $this->assign('outputMode', 'csv');
- $this->_outputMode = 'csv';
$this->_absoluteUrl = TRUE;
+ $this->addPaging = FALSE;
}
- elseif ($this->_groupButtonName == $buttonName || $output == 'group') {
+ elseif ($this->_outputMode == 'group') {
$this->assign('outputMode', 'group');
- $this->_outputMode = 'group';
}
- elseif ($output == 'create_report' && $this->_criteriaForm) {
+ elseif ($this->_outputMode == 'create_report' && $this->_criteriaForm) {
$this->assign('outputMode', 'create_report');
- $this->_outputMode = 'create_report';
}
- else {
- $this->assign('outputMode', 'html');
- $this->_outputMode = 'html';
+ elseif ($this->_outputMode == 'copy' && $this->_criteriaForm) {
+ $this->_createNew = TRUE;
}
+ $this->assign('outputMode', $this->_outputMode);
+ $this->assign('printOnly', $printOnly);
// Get today's date to include in printed reports
if ($printOnly) {
$reportDate = CRM_Utils_Date::customFormat(date('Y-m-d H:i'));
* Post Processing function for Form.
*
* postProcessCommon should be used to set other variables from input as the api accesses that function.
+ * This function is not accessed when the api calls the report.
*/
public function beginPostProcess() {
$this->setParams($this->controller->exportValues($this->_name));
-
if (empty($this->_params) &&
$this->_force
) {
) {
$this->assign('updateReportButton', TRUE);
}
+
$this->processReportMode();
+
+ if ($this->_outputMode == 'save' || $this->_outputMode == 'copy') {
+ $this->_createNew = ($this->_outputMode == 'copy');
+ // Do not pass go. Do not collect another chance to re-run the same query.
+ // This will be called from the button - there is an earlier response to the url
+ // perhaps they can still be consolidated more.
+ CRM_Report_Form_Instance::postProcess($this);
+ }
$this->beginPostProcessCommon();
}
foreach ($this->_columns as $tableName => $table) {
if (array_key_exists('filters', $table)) {
foreach ($table['filters'] as $fieldName => $field) {
- if (CRM_Utils_Array::value('type', $field) & CRM_Utils_Type::T_DATE &&
+ if ((CRM_Utils_Array::value('type', $field) & CRM_Utils_Type::T_DATE ||
+ CRM_Utils_Array::value('type', $field) & CRM_Utils_Type::T_TIME) &&
CRM_Utils_Array::value('operatorType', $field) !=
CRM_Report_Form::OP_MONTH
) {
$group = $this->_params['groups'];
$this->add2group($group);
}
- elseif ($this->_instanceButtonName == $this->controller->getButtonName()) {
- CRM_Report_Form_Instance::postProcess($this);
- }
- elseif ($this->_createNewButtonName == $this->controller->getButtonName() ||
- $this->_outputMode == 'create_report'
- ) {
- $this->_createNew = TRUE;
- CRM_Report_Form_Instance::postProcess($this);
- }
}
/**
if ($this->_dashBoardRowCount) {
$rowCount = $this->_dashBoardRowCount;
}
- if ($this->_outputMode == 'html' || $this->_outputMode == 'group') {
+ if ($this->addPaging) {
$this->_select = str_ireplace('SELECT ', 'SELECT SQL_CALC_FOUND_ROWS ', $this->_select);
$pageId = CRM_Utils_Request::retrieve('crmPID', 'Integer', CRM_Core_DAO::$_nullObject);
$this->_columns[$curTable]['grouping'] = $customDAO->table_name;
$this->_columns[$curTable]['group_title'] = $customDAO->title;
- foreach (array(
- 'fields',
- 'filters',
- 'group_bys',
- ) as $colKey) {
+ foreach (array('fields', 'filters', 'group_bys') as $colKey) {
if (!array_key_exists($colKey, $this->_columns[$curTable])) {
$this->_columns[$curTable][$colKey] = array();
}
case 'Boolean':
$curFilters[$fieldName]['operatorType'] = CRM_Report_Form::OP_SELECT;
- $curFilters[$fieldName]['options'] = array(
- '' => ts('- select -'),
- 1 => ts('Yes'),
- 0 => ts('No'),
- );
+ $curFilters[$fieldName]['options'] = array('' => ts('- select -'))
+ + CRM_Core_PseudoConstant::get('CRM_Core_BAO_CustomField', 'custom_' . $customDAO->cf_id, array(), 'search');
$curFilters[$fieldName]['type'] = CRM_Utils_Type::T_INT;
break;
break;
case 'String':
- $curFilters[$fieldName]['type'] = CRM_Utils_Type::T_STRING;
-
- if (!empty($customDAO->option_group_id)) {
- if (in_array($customDAO->html_type, array(
- 'Multi-Select',
- 'AdvMulti-Select',
- 'CheckBox',
- ))) {
- $curFilters[$fieldName]['operatorType'] = CRM_Report_Form::OP_MULTISELECT_SEPARATOR;
- }
- else {
- $curFilters[$fieldName]['operatorType'] = CRM_Report_Form::OP_MULTISELECT;
- }
- if ($this->_customGroupFilters) {
- $curFilters[$fieldName]['options'] = array();
- $ogDAO = CRM_Core_DAO::executeQuery("SELECT ov.value, ov.label FROM civicrm_option_value ov WHERE ov.option_group_id = %1 ORDER BY ov.weight", array(
- 1 => array(
- $customDAO->option_group_id,
- 'Integer',
- ),
- ));
- while ($ogDAO->fetch()) {
- $curFilters[$fieldName]['options'][$ogDAO->value] = $ogDAO->label;
- }
- CRM_Utils_Hook::customFieldOptions($customDAO->cf_id, $curFilters[$fieldName]['options'], FALSE);
- }
- }
- break;
-
case 'StateProvince':
- if (in_array($customDAO->html_type, array(
- 'Multi-Select State/Province',
- ))) {
- $curFilters[$fieldName]['operatorType'] = CRM_Report_Form::OP_MULTISELECT_SEPARATOR;
- }
- else {
- $curFilters[$fieldName]['operatorType'] = CRM_Report_Form::OP_MULTISELECT;
- }
- $curFilters[$fieldName]['options'] = CRM_Core_PseudoConstant::stateProvince();
- break;
-
case 'Country':
- if (in_array($customDAO->html_type, array(
- 'Multi-Select Country',
- ))) {
- $curFilters[$fieldName]['operatorType'] = CRM_Report_Form::OP_MULTISELECT_SEPARATOR;
- }
- else {
- $curFilters[$fieldName]['operatorType'] = CRM_Report_Form::OP_MULTISELECT;
+ $curFilters[$fieldName]['type'] = CRM_Utils_Type::T_STRING;
+
+ $options = CRM_Core_PseudoConstant::get('CRM_Core_BAO_CustomField', 'custom_' . $customDAO->cf_id, array(), 'search');
+ if ($options !== FALSE) {
+ $curFilters[$fieldName]['operatorType'] = CRM_Core_BAO_CustomField::isSerialized($customDAO) ? CRM_Report_Form::OP_MULTISELECT_SEPARATOR : CRM_Report_Form::OP_MULTISELECT;
+ $curFilters[$fieldName]['options'] = $options;
}
- $curFilters[$fieldName]['options'] = CRM_Core_PseudoConstant::country();
break;
case 'ContactReference':
$query->_from .= $from;
}
+ /**
+ * Get label for show results buttons.
+ *
+ * @return string
+ */
+ public function getResultsLabel() {
+ $showResultsLabel = $this->resultsDisplayed() ? ts('Refresh results') : ts('View results');
+ return $showResultsLabel;
+ }
+
+ /**
+ * Determine the output mode from the url or input.
+ *
+ * Output could be
+ * - pdf : Render as pdf
+ * - csv : Render as csv
+ * - print : Render in print format
+ * - save : save the report and display the new report
+ * - copy : save the report as a new instance and display that.
+ * - group : go to the add to group screen.
+ *
+ * Potentially chart variations could also be included but the complexity
+ * is that we might print a bar chart as a pdf.
+ */
+ protected function setOutputMode() {
+ $buttonName = $this->controller->getButtonName();
+ $this->_outputMode = CRM_Utils_Request::retrieve(
+ 'output',
+ 'String',
+ CRM_Core_DAO::$_nullObject,
+ FALSE,
+ CRM_Utils_Array::value('task', $this->_params)
+ );
+
+ if ($buttonName) {
+ if ($buttonName == $this->_instanceButtonName) {
+ $this->_outputMode = 'save';
+ }
+ if ($buttonName == $this->_printButtonName) {
+ $this->_outputMode = 'print';
+ }
+ if ($buttonName == $this->_pdfButtonName) {
+ $this->_outputMode = 'pdf';
+ }
+ if ($this->_csvButtonName == $buttonName) {
+ $this->_outputMode = 'csv';
+ }
+ if ($this->_groupButtonName == $buttonName) {
+ $this->_outputMode = 'group';
+ }
+ if ($buttonName == $this->_createNewButtonName) {
+ $this->_outputMode = 'copy';
+ }
+ }
+ }
+
}