merci-8.x-2.x-dev/modules/merci_staff/merci_staff.module
modules/merci_staff/merci_staff.module
<?php
/**
* @file
* merci_staff functions
*/
/**
* @todo Please document this function.
* @see http://drupal.org/node/1354
*/
function merci_staff_menu() {
$items = array();
if (module_exists('civicrm')) {
$items['user/autocompletecivi'] = array(
'title' => 'User autocomplete',
'page callback' => 'merci_staff_autocomplete',
'access callback' => 'user_access',
'access arguments' => array('access user profiles'),
'type' => MENU_CALLBACK,
);
}
return $items;
}
/**
* @todo Please document this function.
* @see http://drupal.org/node/1354
*/
function merci_staff_load_user($post = NULL) {
static $admin_user;
global $user;
if (empty($admin_user)) {
$admin_user = $user;
}
if ($post and empty($post['override']) and ($newuser = user_load_by_name($post['name']))) {
$user = $newuser;
}
else {
$user = $admin_user;
}
}
//function merci_staff_after_build($form, &$form_state) {
function merci_staff_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {
return;
if($form_id != 'merci_reservation_node_form') {
return;
}
if (!user_access('manage reservations')) {
return;
}
if (isset($form_state['values'])) {
$node = (array)$form_state['values'] + (array)$form['#node'];
} else {
$node = $form['#node'];
}
$node = (object) $node;
// Override the validation function so we can validate as the submitted user.
$form['#merci_staff_validated'][] = 'merci_reservation_node_validate';
$form['#validate'][] = 'merci_staff_reservation_node_validate';
foreach ($form['#merci_staff_validated'] as $function) {
$key = array_search($function, $form['#validate']);
if (is_numeric($key)) {
unset($form['#validate'][$key]);
}
}
// Recreate the groups and choices based on the submitted name.
merci_staff_load_user((array) $node);
// Add the current choices to the form.
$reset = true;
foreach (element_children($form['choice_wrapper']['merci_reservation_items']) as $delta) {
if (is_numeric($delta)) {
continue;
}
$delta = substr($delta, 7);
$default = isset($node->merci_reservation_items["choice_" . $delta]['merci_item_nid']) ? $node->merci_reservation_items["choice_" . $delta]['merci_item_nid'] : '';
$form['choice_wrapper']['merci_reservation_items']["choice_" . $delta]['merci_item_nid'] =
_merci_choice_form($node, $form_state, $delta, $default, $reset);
$reset = false;
}
merci_staff_load_user();
array_push($form['field_merci_date']['field_merci_date_button']['#limit_validation_errors'], array('name'), array('override'));
array_push($form['choice_wrapper']['merci_more']['#limit_validation_errors'], array('name'), array('override'));
return $form;
}
/**
* Implementation of hook_form_alter
**/
/**
* @todo Please document this function.
* @see http://drupal.org/node/1354
*/
function merci_staff_form_merci_reservation_node_form_alter(&$form, &$form_state) {
if (user_access('manage reservations')) {
if (isset($form_state['node'])) {
$node = (array) $form_state['node'] + (array) $form['#node'];
}
else {
$node = $form['#node'];
}
$node = (object) $node;
// Move the author field and set autocomplete and ahah handlers.
// We do this here and not in after_build because the ahah hash is handled before after_build is called.
$form['name'] = $form['author']['name'];
$form['name']['#title'] = 'Reserve for';
$form['name']['#weight'] = -99;
if (module_exists('civicrm')) {
$form['name']['#autocomplete_path'] = 'user/autocompletecivi';
}
$form['name']['#ajax'] = array(
//'path' => 'mercistaff/updatename',
//'wrapper' => 'edit-og-groups-wrapper',
'callback' => 'merci_staff_update_name',
'wrapper' => 'merci-staff-edit-form-wrapper',
'method' => 'replace',
'effect' => 'fade',
);
unset($form['author']['name']);
//create override checkbox
$form['override'] = array(
//'#type' => 'optionwidgets_onoff',
'#type' => 'checkbox',
'#title' => 'Override Validation',
'#default_value' => isset($node->override) ? $node->override : FALSE,
'#weight' => -97,
'#columns' => 0,
);
$form['#prefix'] = '<div id="merci-staff-edit-form-wrapper">';
$form['#suffix'] = '</div>';
}
}
/**
* @todo Please document this function.
* @see http://drupal.org/node/1354
*/
function merci_staff_reservation_node_validate($form, &$form_state) {
merci_staff_load_user($form_state['values']);
foreach ($form['#merci_staff_validated'] as $function) {
$function($form, $form_state);
}
merci_staff_load_user();
}
/**
** Menu callback; Retrieve a JSON object containing autocomplete suggestions for existing users.
**/
function merci_staff_autocomplete($string = '') {
$matches = array();
if ($string) {
if ( ! civicrm_initialize( ) ) {
return;
}
$fields = field_info_fields();
$field = $fields[$field_name];
$references = _merci_staff_potential_references($field, $string);
foreach ($references as $id => $row) {
// Add a class wrapper for a few required CSS overrides.
$matches["{$row['title']}"] = '<div class="reference-autocomplete">' . $row['rendered'] . '</div>';
}
}
drupal_json_output($matches);
}
/**
* Menu callback for AHAH additions.
*/
function merci_staff_update_name($form, $form_state) {
return $form;
}
function _merci_staff_potential_references($field, $string = '', $exact_string = FALSE) {
static $results = array();
$references = _merci_staff_potential_references_standard($field, $string, $exact_string);
// Store the results.
$results[$field['field_name']][$string][$exact_string] = $references;
return $results[$field['field_name']][$string][$exact_string];
}
/**
* Helper function for _civicrm_cck_potential_references():
* referenceable nodes defined by content types.
*/
function _merci_staff_potential_references_standard( $field, $string = '', $exact_string = FALSE, $limit = '10' ) {
$args = $whereClause = $contactTypes = $contactSubTypes = array();
if ( ! civicrm_initialize( ) ) {
return;
}
global $civicrm_root;
require_once $civicrm_root . '/CRM/Contact/BAO/ContactType.php';
require_once $civicrm_root . '/CRM/Core/BAO/UFMatch.php';
$basicTypes = CRM_Contact_BAO_ContactType::basicTypePairs( );
foreach ( $basicTypes as $name => $label ) {
if ( is_array( $field[$name] ) ) {
$contactNames = array_filter( $field[$name] );
if ( !empty( $contactNames ) ) {
if ( in_array( $name, $contactNames ) ) {
$contactTypes[] = $name;
}
else {
$contactSubTypes = array_merge( $contactSubTypes, array_keys( $contactNames ) );
}
}
}
}
if ( !empty( $contactTypes ) ) {
$contactTypes = implode( "','", $contactTypes );
$whereClause[] = "contact_type IN ( '{$contactTypes}' )";
}
if ( !empty( $contactSubTypes ) ) {
$contactSubTypes = implode( "','", $contactSubTypes );
$whereClause[] = "contact_sub_type IN ( '{$contactSubTypes}' )";
}
$whereClause = empty( $whereClause ) ? '' : '(' . implode( ' OR ', $whereClause ) . ') AND';
$related_clause = "";
if (isset($string)) {
if ($exact_string) {
$string_clause = " AND display_name = %1";
$args[] = $string;
}
else {
$string_clause = " AND display_name LIKE %1";
$args[] = "%%" . $string . "%";
}
}
$q = "
SELECT civicrm_contact.id, display_name
FROM civicrm_contact
JOIN civicrm_uf_match ON civicrm_contact.id = civicrm_uf_match.contact_id
WHERE $whereClause
display_name IS NOT NULL
AND display_name NOT LIKE ''
AND display_name NOT LIKE '<Last>%%'
AND display_name NOT LIKE '%@%%'
AND display_name NOT LIKE '--%%'
AND display_name NOT LIKE '- -%%'
AND display_name NOT LIKE ',%%'
AND display_name NOT LIKE '..%%'
" . $string_clause . " LIMIT $limit";
$params = array(1 => array($args[0], "String"));
$dao = CRM_Core_DAO::executeQuery( $q, $params );
$references = array();
while ($dao->fetch()) {
$uid = CRM_Core_BAO_UFMatch::getUFId($dao->id);
$username = db_query("SELECT name FROM {users} WHERE uid = :uid", array(':uid' => $uid))->fetchField();
$references[$dao->id] = array(
'title' => $username,
'rendered' => $dao->display_name,
);
}
return $references;
}
function merci_staff_field_widget_form_alter(&$element, \Drupal\Core\Form\FormStateInterface $form_state, $context) {
return;
if ($context['instance']['bundle'] == 'merci_reservation' and $context['instance']['field_name'] == 'group_audience') {
$form = $context['form'];
$field = $context['field'];
$instance = $context['instance'];
$langcode = $context['langcode'];
$items = $context['items'];
$delta = $context['delta'];
if (!user_access('manage reservations')) {
return;
}
if (isset($form_state['values'])) {
$node = (array)$form_state['values'] + (array)$form['#node'];
} else {
$node = $form['#node'];
}
$node = (object) $node;
drupal_static_reset('og_field_audience_options');
unset($element['#input']);
unset($element['#type']);
unset($element['#options']);
unset($element['#default_value']);
unset($element['#attributes']);
unset($element['#disabled']);
// Re-use options widget element validation, to correctly transform
// submitted values from field => delta to delta => field.
// @see options_field_widget().
unset($element['#value_key']);
unset($element['#element_validate']);
unset($element['#properties']);
// Add OG specific context.
unset($element['#opt_group']);
unset($element['#audience']);
unset($element['#hidden_selected_gids']);
$base = $element;
// Recreate the groups and choices based on the submitted name.
merci_staff_load_user((array) $node);
global $user;
$return = og_field_widget_form($form, $form_state, $field, $instance, $langcode, $items, $delta, $base);
merci_staff_load_user();
$element = $return;
}
}
