You are here

function privatemsg_filter_query_privatemsg_list_alter in Privatemsg 7

Same name and namespace in other branches
  1. 7.2 privatemsg_filter/privatemsg_filter.module \privatemsg_filter_query_privatemsg_list_alter()

Hook into the query builder to add the tagging info to the correct query

File

privatemsg_filter/privatemsg_filter.module, line 685
Allows users to tag private messages and to filter based upon those tags.

Code

function privatemsg_filter_query_privatemsg_list_alter($query) {
  $account = $query
    ->getMetaData('arg_1');
  $argument = $query
    ->getMetaData('arg_2');

  // Add all conditions to the count query too.
  $count_query = $query
    ->getCountQuery();

  // Check if its a filtered view.
  if ($argument == 'sent') {
    $query
      ->condition('pm.author', $account->uid);
    $count_query
      ->condition('pm.author', $account->uid);
  }
  $filter = privatemsg_filter_get_filter($account);
  if ($argument == 'inbox') {
    $filter['tags'][] = variable_get('privatemsg_filter_inbox_tag', '');
  }

  // Filter the message listing by any set tags.
  if ($filter) {
    if (!empty($filter['tags'])) {
      foreach ($filter['tags'] as $tag) {
        $alias = $query
          ->join('pm_tags_index', 'pmti', "%alias.thread_id = pmi.thread_id AND %alias.uid = pmi.recipient AND pmi.type IN ('user', 'hidden')");
        $query
          ->condition($alias . '.tag_id', $tag);
        $alias = $count_query
          ->join('pm_tags_index', 'pmti', "%alias.thread_id = pmi.thread_id AND %alias.uid = pmi.recipient AND pmi.type IN ('user', 'hidden')");
        $count_query
          ->condition($alias . '.tag_id', $tag);
      }
    }
    if (isset($filter['author']) && !empty($filter['author'])) {
      foreach ($filter['author'] as $author) {
        $alias = $query
          ->join('pm_index', 'pmi', '%alias.mid = pm.mid');
        $query
          ->condition($alias . '.recipient', $author->uid);
        $query
          ->condition($alias . '.type', 'user');
        $alias = $count_query
          ->join('pm_index', 'pmi', '%alias.mid = pm.mid');
        $count_query
          ->condition($alias . '.recipient', $author->uid);
        $count_query
          ->condition($alias . '.type', 'user');
      }
    }
    if (!empty($filter['search'])) {
      if (variable_get('privatemsg_filter_searchbody', FALSE)) {
        $search = db_or()
          ->condition('pm.subject', '%' . $filter['search'] . '%', 'LIKE')
          ->condition('pm.body', '%' . $filter['search'] . '%', 'LIKE');

        // Clone the condition so that they are both compiled.
        $query
          ->condition(clone $search);
        $count_query
          ->condition($search);
      }
      else {
        $query
          ->condition('pm.subject', '%' . $filter['search'] . '%', 'LIKE');
        $count_query
          ->condition('pm.subject', '%' . $filter['search'] . '%', 'LIKE');
      }
    }
  }
}