* This function creates a table AND adds the details to the developer tab & $this->>temporary tables.
*
* @param string $identifier
- * @param $sql
+ * This is the key that will be used for the table in the temporaryTables property.
+ * @param string $sql
+ * Sql select statement or column description (the latter requires the columns flag)
+ * @param bool $isColumns
+ * Is the sql describing columns to create (rather than using a select query).
+ * @param bool $isMemory
+ * Create a memory table rather than a normal INNODB table.
*
* @return string
*/
- public function createTemporaryTable($identifier, $sql) {
- $tempTable = CRM_Utils_SQL_TempTable::build()->setUtf8(TRUE)->createWithQuery($sql);
+ public function createTemporaryTable($identifier, $sql, $isColumns = FALSE, $isMemory = FALSE) {
+ $tempTable = CRM_Utils_SQL_TempTable::build()->setUtf8();
+ if ($isMemory) {
+ $tempTable->setMemory();
+ }
+ if ($isColumns) {
+ $tempTable->createWithColumns($sql);
+ }
+ else {
+ $tempTable->createWithQuery($sql);
+ }
$name = $tempTable->getName();
// Developers may force tables to be durable to assist in debugging so lets check.
$isNotTrueTemporary = $tempTable->isDurable();
- // The TempTable build routine adds the next line - we output it to help developers see what has happened.
- $sql = 'CREATE ' . ($isNotTrueTemporary ? '' : 'TEMPORARY ') . "TABLE $name DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci " . $sql;
- $this->addToDeveloperTab($sql);
+ $this->addToDeveloperTab($tempTable->getCreateSql());
$this->temporaryTables[$identifier] = ['temporary' => !$isNotTrueTemporary, 'name' => $name];
return $name;
}
// CRM-16274 Determine if user has 'edit all contacts' or equivalent
$permission = CRM_Core_Permission::getPermission();
- if ($permission == CRM_Core_Permission::EDIT &&
+ if ($this->_instanceForm && $permission == CRM_Core_Permission::EDIT &&
$this->_add2groupSupported
) {
$this->addElement('select', 'groups', ts('Group'),
break;
}
+ //dev/core/544 Add report support for multiple contact subTypes
+ if ($field['name'] == 'contact_sub_type' && $clause) {
+ $clause = $this->whereSubtypeClause($field, $value, $op);
+ }
if (!empty($field['group']) && $clause) {
$clause = $this->whereGroupClause($field, $value, $op);
}
return $clause;
}
+ /**
+ * Get SQL where clause for contact subtypes
+ * @param string $field
+ * @param mixed $value
+ * @param string $op SQL Operator
+ *
+ * @return string
+ */
+ public function whereSubtypeClause($field, $value, $op) {
+ $clause = '( ';
+ $subtypeFilters = count($value);
+ for ($i = 0; $i < $subtypeFilters; $i++) {
+ $clause .= "{$field['dbAlias']} LIKE '%$value[$i]%'";
+ if ($i !== ($subtypeFilters - 1)) {
+ $clause .= " OR ";
+ }
+ }
+ $clause .= ' )';
+ return $clause;
+ }
+
/**
* Get SQL where clause for a date field.
*
list($from, $to) = $this->getFromTo($relative, $from, $to, $fromTime, $toTime);
if ($from) {
- $from = ($type == CRM_Utils_Type::T_DATE) ? substr($from, 0, 8) : $from;
$clauses[] = "( {$fieldName} >= $from )";
}
if ($to) {
- $to = ($type == CRM_Utils_Type::T_DATE) ? substr($to, 0, 8) : $to;
$clauses[] = "( {$fieldName} <= {$to} )";
}
$rows[$rowNum]["{$fieldName}_link"] = $url;
$rows[$rowNum]["{$fieldName}_hover"] = ts("%1 for this %2.", array(1 => $linkText, 2 => $addressField));
}
- $entryFound = TRUE;
}
+ $entryFound = TRUE;
}
}
/**
* Get a standard set of contact fields.
- *
+ * @deprecated - use getColumns('Contact') instead
* @return array
*/
public function getBasicContactFields() {
'is_filters' => TRUE,
'is_group_bys' => FALSE,
),
+ $options['prefix'] . 'external_identifier' => array(
+ 'title' => $options['prefix_label'] . ts('Contact identifier from external system'),
+ 'name' => 'external_identifier',
+ 'is_fields' => TRUE,
+ 'is_filters' => FALSE,
+ 'is_group_bys' => FALSE,
+ 'is_order_bys' => TRUE,
+ ),
+ $options['prefix'] . 'preferred_language' => array(
+ 'title' => $options['prefix_label'] . ts('Preferred Language'),
+ 'name' => 'preferred_language',
+ 'is_fields' => TRUE,
+ 'is_filters' => TRUE,
+ 'is_group_bys' => TRUE,
+ 'is_order_bys' => TRUE,
+ ),
);
+ foreach ([
+ 'postal_greeting_display' => 'Postal Greeting',
+ 'email_greeting_display' => 'Email Greeting',
+ 'addressee_display' => 'Addressee',
+ ] as $field => $title) {
+ $spec[$options['prefix'] . $field] = array(
+ 'title' => $options['prefix_label'] . ts($title),
+ 'name' => $field,
+ 'is_fields' => TRUE,
+ 'is_filters' => FALSE,
+ 'is_group_bys' => FALSE,
+ );
+ }
+ foreach (['do_not_email', 'do_not_phone', 'do_not_mail', 'do_not_sms', 'is_opt_out'] as $field) {
+ $spec[$options['prefix'] . $field] = [
+ 'name' => $field,
+ 'type' => CRM_Utils_Type::T_BOOLEAN,
+ 'is_fields' => TRUE,
+ 'is_filters' => TRUE,
+ 'is_group_bys' => FALSE,
+ ];
+ }
$individualFields = array(
$options['prefix'] . 'first_name' => array(
'name' => 'first_name',
'is_filters' => TRUE,
'is_group_bys' => FALSE,
),
+ $options['prefix'] . 'job_title' => array(
+ 'name' => 'job_title',
+ 'is_fields' => TRUE,
+ 'is_filters' => FALSE,
+ 'is_group_bys' => FALSE,
+ ),
+ $options['prefix'] . 'employer_id' => array(
+ 'title' => $options['prefix_label'] . ts('Current Employer'),
+ 'type' => CRM_Utils_Type::T_INT,
+ 'name' => 'employer_id',
+ 'is_fields' => TRUE,
+ 'is_filters' => FALSE,
+ 'is_group_bys' => TRUE,
+ ),
);
if (!$options['contact_type'] || $options['contact_type'] === 'Individual') {
$spec = array_merge($spec, $individualFields);