You are here

contact_save.module in Contact Save 7

Contact save module logic.

File

contact_save.module
View source
<?php

/**
 * @file
 * Contact save module logic.
 */
define('CONTACT_SAVE_MESSAGE_STATE_UNREAD', 0);
define('CONTACT_SAVE_MESSAGE_STATE_READ', 1);
define('CONTACT_SAVE_MESSAGES_LIST_PATH', 'admin/structure/contact/messages');
require_once 'includes/contact_save.views.inc';

/**
 * Implements hook_menu().
 */
function contact_save_menu() {
  $items['admin/structure/contact/settings'] = array(
    'title' => 'Contact save settings',
    'page callback' => 'drupal_get_form',
    'page arguments' => array(
      'contact_save_settings',
    ),
    'access arguments' => array(
      'administer contact forms',
    ),
    'type' => MENU_LOCAL_TASK,
    'weight' => 1,
    'file' => 'includes/contact_save.admin.inc',
  );
  $items['admin/structure/contact/message/%/delete'] = array(
    'title' => 'Contact save settings',
    'page callback' => 'drupal_get_form',
    'page arguments' => array(
      'contact_save_message_delete_form',
      4,
    ),
    'access arguments' => array(
      'administer contact forms',
    ),
    'type' => MENU_CALLBACK,
    'file' => 'includes/contact_save.admin.inc',
  );
  return $items;
}

/**
 * Implements hook_cron().
 *
 * Deletes old messages.
 */
function contact_save_cron() {
  $live_time = variable_get('contact_save_live_time', 0);
  if ($live_time) {
    db_delete('contact_save')
      ->condition('created', REQUEST_TIME - $live_time, '<')
      ->execute();
  }
}

/**
 * Implements hook_mail_alter().
 */
function contact_save_mail_alter(&$message) {
  if ($message['id'] == 'contact_page_mail') {
    $body = $message['body'];

    // Remove default contact string.
    unset($body[0]);
    $record = array(
      'cid' => isset($message['params']['category']['cid']) ? $message['params']['category']['cid'] : 1,
      'uid' => isset($message['params']['sender']) ? $message['params']['sender']->uid : 0,
      'name' => $message['params']['name'],
      'mail' => $message['params']['mail'],
      'subject' => $message['params']['subject'],
      'message' => implode("\n", $body),
      'created' => REQUEST_TIME,
    );
    drupal_write_record('contact_save', $record);
    module_invoke_all('contact_save_message_insert', $record['id']);
  }
}

/**
 * Implements hook_views_api().
 */
function contact_save_views_api() {
  return array(
    'api' => 3,
    'path' => drupal_get_path('module', 'contact_save') . '/includes',
  );
}

/**
 * Delete message by ID.
 *
 * @param int $id
 *   Message ID.
 *
 * @return int
 *   Returns 1 if success.
 */
function contact_save_message_delete($id) {
  $query = db_delete('contact_save')
    ->condition('id', $id, '=');
  $result = $query
    ->execute();
  return $result;
}

/**
 * Implements hook_views_post_render().
 */
function contact_save_views_post_render(&$view, &$output, &$cache) {
  if ($view->name == 'contact_messages' && $view->current_display == 'message') {
    $message_id = $view->args[0];
    module_invoke_all('contact_save_message_read', $message_id);
  }
}

/**
 * Implements hook_contact_save_message_read().
 */
function contact_save_contact_save_message_read($message_id) {
  $status = contact_save_message_read_status($message_id);
  $result = db_update('contact_save')
    ->fields(array(
    '`read`' => REQUEST_TIME,
  ))
    ->condition('id', $message_id, '=')
    ->execute();
  if ($status == CONTACT_SAVE_MESSAGE_STATE_UNREAD) {
    module_invoke_all('contact_save_message_first_read', $message_id);
  }
}

/**
 * Get the 'read' status of a message.
 *
 * @param int $message_id
 *   Message identifier.
 *
 * @return string $status
 *   Either 'read' or 'unread' string.
 */
function contact_save_message_read_status($message_id) {
  $query = db_select('contact_save', 'cs');
  $query
    ->condition('cs.id', $message_id);
  $query
    ->addField('cs', 'read', 'read_status');
  $read = $query
    ->execute()
    ->fetchField();
  if ($read > 0) {
    return CONTACT_SAVE_MESSAGE_STATE_READ;
  }
  return CONTACT_SAVE_MESSAGE_STATE_UNREAD;
}

/**
 * Return the number of unread messages.
 *
 * @return int
 *   Number of messages that have yet to be read.
 */
function contact_save_unread_messages() {
  return db_select('contact_save', 'cs')
    ->condition('cs.read', 0)
    ->countQuery()
    ->execute()
    ->fetchField();
}

/**
 * Implements hook_user_login().
 */
function contact_save_user_login(&$edit, $account) {
  if (user_access('administer contact forms', $account)) {
    if (variable_get('contact_save_unread_message_status_at_login', TRUE)) {
      $unread_messages = contact_save_unread_messages();
      if ($unread_messages > 0) {
        drupal_set_message(t('There are <a href="@url">@number unread contact form
          messages</a>.', array(
          '@url' => url(CONTACT_SAVE_MESSAGES_LIST_PATH),
          '@number' => $unread_messages,
        )));
      }
    }
  }
}

/**
 * Implements hook_user_view().
 */
function contact_save_user_view($account, $view_mode, $langcode) {
  if (user_access('administer contact forms', $account)) {
    if (variable_get('contact_save_unread_message_status_on_profile', FALSE)) {
      $unread_messages = contact_save_unread_messages();
      if ($unread_messages > 0) {
        $account->content['contact_save'] = array(
          '#type' => 'user_profile_category',
          '#title' => 'Contact form messages',
          'messages' => array(
            '#type' => 'user_profile_item',
            '#title' => '',
            '#markup' => t('There are !url.', array(
              '!url' => l(format_plural($unread_messages, 'unread contact form message', 'unread contact form messages'), CONTACT_SAVE_MESSAGES_LIST_PATH),
            )),
          ),
        );
      }
    }
  }
}

/**
 * Implements hook_field_extra_fields().
 */
function contact_save_field_extra_fields() {
  $fields['user']['user'] = array(
    'display' => array(
      'contact_save' => array(
        'label' => t('Site contact form messages'),
        'description' => t('Saved site contact form messages view element.'),
        'weight' => 10,
      ),
    ),
  );
  return $fields;
}