X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=CRM%2FReport%2FForm.php;h=7b4608b02176c669c5c74c5d2ebc4566b50e8adc;hb=12d90034bd7c9883b721738f3cbf014363f01f53;hp=1bd2b024f66be49e9b7e93bc5132e61fe08645f8;hpb=a5b08a92f51c39c668edf05a5db3b199a300ddde;p=civicrm-core.git diff --git a/CRM/Report/Form.php b/CRM/Report/Form.php index 1bd2b024f6..7b4608b021 100644 --- a/CRM/Report/Form.php +++ b/CRM/Report/Form.php @@ -176,6 +176,13 @@ class CRM_Report_Form extends CRM_Core_Form { */ protected $tabs = array(); + /** + * Should we add paging. + * + * @var bool + */ + protected $addPaging = TRUE; + /** * An attribute for checkbox/radio form field layout * @@ -237,7 +244,8 @@ class CRM_Report_Form extends CRM_Core_Form { * 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; @@ -522,11 +530,22 @@ class CRM_Report_Form extends CRM_Core_Form { $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; } @@ -991,6 +1010,15 @@ class CRM_Report_Form extends CRM_Core_Form { $this->_offsetValue = $_offsetValue; } + /** + * Setter for $addPaging. + * + * @param bool $value + */ + public function setAddPaging($value) { + $this->addPaging = $value; + } + /** * Getter for $_defaultValues. * @@ -1792,33 +1820,13 @@ class CRM_Report_Form extends CRM_Core_Form { 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; @@ -2023,21 +2031,11 @@ class CRM_Report_Form extends CRM_Core_Form { 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 @@ -2047,13 +2045,7 @@ WHERE cg.extends IN ('" . implode("','", $this->_customGroupExtends) . "') 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(); @@ -2061,7 +2053,7 @@ WHERE cg.extends IN ('" . implode("','", $this->_customGroupExtends) . "') AND 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; } } @@ -2074,128 +2066,6 @@ WHERE cg.extends IN ('" . implode("','", $this->_customGroupExtends) . "') AND } } - /** - * 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. * @@ -2609,13 +2479,7 @@ WHERE cg.extends IN ('" . implode("','", $this->_customGroupExtends) . "') AND * 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( @@ -2628,44 +2492,40 @@ WHERE cg.extends IN ('" . implode("','", $this->_customGroupExtends) . "') AND $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')); @@ -2677,10 +2537,10 @@ WHERE cg.extends IN ('" . implode("','", $this->_customGroupExtends) . "') AND * 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 ) { @@ -2705,7 +2565,16 @@ WHERE cg.extends IN ('" . implode("','", $this->_customGroupExtends) . "') AND ) { $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(); } @@ -3071,7 +2940,8 @@ WHERE cg.extends IN ('" . implode("','", $this->_customGroupExtends) . "') AND 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 ) { @@ -3280,15 +3150,6 @@ WHERE cg.extends IN ('" . implode("','", $this->_customGroupExtends) . "') AND $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); - } } /** @@ -3378,7 +3239,7 @@ WHERE cg.extends IN ('" . implode("','", $this->_customGroupExtends) . "') AND 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); @@ -3630,11 +3491,7 @@ ORDER BY cg.weight, cf.weight"; $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(); } @@ -3674,11 +3531,8 @@ ORDER BY cg.weight, cf.weight"; 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; @@ -3698,57 +3552,15 @@ ORDER BY cg.weight, cf.weight"; 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': @@ -4614,4 +4426,60 @@ LEFT JOIN civicrm_contact {$field['alias']} ON {$field['alias']}.id = {$this->_a $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'; + } + } + } + }