groups/modules/groups/groups_directory/groups_directory.module

196 lines
5.5 KiB
Plaintext

<?php
/**
* @file
* Code for the Groups Directory feature.
*/
include_once 'groups_directory.features.inc';
/**
* Implements hook_block_info()
*/
function groups_directory_block_info() {
$blocks['groups_directory_filter'] = array(
'info' => t('Filter Groups'),
'cache' => DRUPAL_NO_CACHE,
);
$blocks['groups_directory_list'] = array(
'info' => t('Groups directory list'),
'cache' => DRUPAL_NO_CACHE,
);
return $blocks;
}
/**
* Implements hook_block_view().
*/
function groups_directory_block_view($delta='') {
$block = array();
switch ($delta) {
case 'groups_directory_filter':
$block['content'] = drupal_get_form('groups_directory_filter_form');
$block['subject'] = t('Filter Groups');
break;
case 'groups_directory_list':
$element = groups_directory_list();
$block['content'] = render($element);
$block['subject'] = t('Groups');
break;
}
return $block;
}
/**
* Clean array helper, defaults to check_plain filter.
*
* @return array Filtered array values.
*/
function _groups_directory_clean_array($array, $filter = 'check_plain') {
$clean = array();
foreach ($array as $key => $val) {
if (is_array($val)) {
$clean[$filter($key)] = _groups_directory_clean_array($val, $filter);
}
else {
$clean[$filter($key)] = $filter($val);
}
}
return $clean;
}
/**
* Get query parameters using a check_plain filter on values.
*/
function _groups_directory_get_query_parameters() {
$query_params = drupal_get_query_parameters();
return _groups_directory_clean_array($query_params);
}
/**
* Groups directory list callback.
*/
function groups_directory_list() {
$query = new EntityFieldQuery();
$query->entityCondition('entity_type', 'node')
->entityCondition('bundle', 'group')
->propertyCondition('status', NODE_PUBLISHED);
$query_params = _groups_directory_get_query_parameters();
// filter status
if (isset($query_params['status'])) {
$status_official = in_array('official', $query_params['status']);
$status_new = in_array('new', $query_params['status']);
if (($status_official) && (!$status_new)) {
// show official groups only
$query->fieldCondition('field_group_status', 'value', '1', '=');
}
if (($status_new) && (!$status_official)) {
// show new groups only
$query->fieldCondition('field_group_status', 'value', '1', '!=');
}
}
// filter by continent
if (isset($query_params['c'])) {
$query->fieldCondition('field_group_location', 'continent', (array)$query_params['c']);
}
// order by title
$query->fieldOrderBy('field_group_status', 'value', 'DESC');
$query->propertyOrderBy('title', 'ASC');
$result = $query->execute();
if (isset($result['node'])) {
$nids = array_keys($result['node']);
$entities = entity_load('node', $nids);
$contents = entity_view('node', $entities, 'teaser');
} else {
$contents = array(
'#type' => 'markup',
'#markup' => '<div class="results-empty">' . t('No results found.') . '</div>',
);
}
return $contents;
}
/**
* Groups filter form.
*/
function groups_directory_filter_form($form, &$form_state) {
module_load_include('inc', 'field_group_location', 'field_group_lookup');
$form['continents'] = array(
'#type' => 'checkboxes',
'#title' => t('By continent'),
'#options' => _continent_get_predefined_list(),
);
$form['status'] = array(
'#type' => 'checkboxes',
'#title' => 'By status',
'#options' => array(
'official' => 'Official group',
'new' => 'New group',
),
);
$form['submit_search'] = array(
'#type' => 'submit',
'#value' => t('Search'),
'#submit' => array('groups_directory_filter_form_submit'),
);
$form['submit_clear'] = array(
'#type' => 'submit',
'#value' => t('Clear filters'),
'#submit' => array('groups_directory_filter_form_clear_filters'),
);
$query_params = _groups_directory_get_query_parameters();
// set defaults for continents
$continents = isset($query_params['c']) ? $query_params['c'] : NULL;
if ((isset($continents)) && ((array)$continents == $continents)) {
$form['continents']['#default_value'] = $continents;
}
// set defaults for status
$status = isset($query_params['status']) ? $query_params['status'] : NULL;
if ((isset($status)) && ((array)$status == $status)) {
$form['status']['#default_value'] = $status;
}
return $form;
}
/**
* Groups filter submit callback.
*
* @see groups_directory_filter_form
*/
function groups_directory_filter_form_submit($form, &$form_state) {
$filter = array();
$continents = array_filter($form_state['values']['continents']);
foreach ($continents as $value) {
$filter[] = 'c[]='.$value;
}
$status = array_filter($form_state['values']['status']);
foreach ($status as $value) {
$filter[] = 'status[]='.$value;
}
$url_params = implode('&', $filter);
$path=$GLOBALS['base_url'].strtok($_SERVER["REQUEST_URI"],'?');
if (!empty($url_params)) {
$path .= '?'.$url_params;
}
drupal_goto($path);
}
/**
* Groups filter clear filters callback.
*
* @see groups_directory_filter_form
*/
function groups_directory_filter_form_clear_filters($form, &$form_state) {
$path=$GLOBALS['base_url'].strtok($_SERVER["REQUEST_URI"],'?');
drupal_goto($path);
}
/**
* Implements hook_leaflet_map_prebuild_alter()
*
* Add custom map js to override marker hover and popup balloon behavior.
*/
function groups_directory_leaflet_map_prebuild_alter(&$vars) {
drupal_add_js(drupal_get_path('module', 'groups_directory') . '/js/groups_directory_map.js');
}