This repository has been archived on 2025-06-21. You can view files and clone it, but you cannot make any changes to it's state, such as pushing and creating new issues, pull requests or comments.
suitedesk/modules/search_restrict/search_restrict.module

173 lines
4.9 KiB
Text

<?php
/**
* Implementation of hook_perm().
*/
function search_restrict_perm() {
return array('administer search_restrict');
}
/**
* Implementation of hook_form_FORM_alter().
*/
function search_restrict_form_node_type_form_alter(&$form, &$form_state) {
search_restrict_content_type_form($form);
}
/**
* Alter content type forms to include search restrict options.
*/
function search_restrict_content_type_form(&$form) {
$roles = user_roles();
ksort($roles);
$content_type = $form['#node_type']->type;
$restrictions = variable_get('search_restrict_type_'. $content_type, array());
$form['search_restrict'] = array(
'#type' => 'fieldset',
'#title' => t('Search Restrict'),
'#description' => t('Select which user roles can search for this content type. By default all roles can search.'),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
'#access' => user_access('administer search_restrict'),
);
$form['search_restrict']['search_restrict_roles'] = array(
'#type' => 'checkboxes',
'#title' => t('Roles'),
'#description' => t('If all checkboxes are unselected then everyone can search.'),
'#options' => $roles,
'#default_value' => $restrictions,
);
// Use custom submit function to avoid a query at time of search to get the
// list of content types.
// Add to front of array so that we can clear search_restrict_roles_<content_type>.
array_unshift($form['#submit'], 'search_restrict_content_type_form_submit');
}
/**
* use custom submit function to avoid a query at time of search to get the list of content types
*/
function search_restrict_content_type_form_submit($form, &$form_state) {
$roles = $form_state['values']['search_restrict_roles'];
$type = $form_state['values']['type'];
variable_set('search_restrict_type_'. $type, $roles);
unset($form_state['values']['search_restrict_roles']);
}
/**
* Implementation of hook_db_rewrite_sql().
*/
function search_restrict_db_rewrite_sql($query, $primary_table, $primary_field, $args) {
global $user;
// User 1 can search everything.
if ($user->uid == 1) {
return;
}
$user_roles = $user->roles;
$excluded_types = array();
if ($query == '' && $primary_table == 'n' && $primary_field == 'nid' && empty($args)) {
$types = node_get_types();
foreach ($types as $type => $type_info) {
$roles = variable_get('search_restrict_type_'. $type, array());
$access = FALSE;
$access_false = array();
$access_true = array();
// list included and excluded roles
foreach ($roles as $role_id => $selected) {
if (empty($selected)) {
$access_false[] = $role_id;
}
else {
$access_true[] = $role_id;
}
}
// If no roles or all roles have been selected then everyone has access
// skip this content type.
if (!empty($access_true) && !empty($access_false)) {
// If user has role in include list skip this content type.
foreach ($access_true as $role_selected) {
if (!empty($user_roles[$role_selected])) $access = TRUE;
}
// User doesn't have any roles that are allowed to search this content type.
if (empty($access)) $excluded_types[] = $type;
}
}
if (!empty($excluded_types)) {
$where = " n.type NOT IN ('". join("','", $excluded_types) ."') ";
return array('where' => $where);
}
}
}
/**
* Implementation of hook_form_alter().
*/
function search_restrict_form_alter(&$form, $form_state, $form_id) {
switch ($form_id) {
case 'search_form':
$form['#after_build'][] = '_search_restrict_advanced_form';
break;
}
}
/**
* Remove restricted content types from the advanced search form. We use
* after_build due to the method the node module uses to add the advanced
* search options.
*/
function _search_restrict_advanced_form($form_element, &$form_state) {
global $user;
if ($user->uid == 1) {
return $form_element;
}
$types = node_get_types();
$role_ids = array_keys($user->roles);
foreach ($types as $type => $type_info) {
$access = FALSE;
$roles = variable_get('search_restrict_type_'. $type, array());
if (empty($roles)) {
$access = TRUE;
}
else {
foreach ($roles as $role_id => $selected) {
if (!empty($selected) && in_array($role_id, $role_ids)) {
$access = TRUE;
break;
}
}
}
if (!$access) {
unset($form_element['advanced']['type']['#options'][$type]);
unset($form_element['advanced']['type'][$type]);
}
}
return $form_element;
}
/**
* Implementation of hook_node_type
*/
function search_restrict_node_type($op, $info) {
if ($op == 'delete') {
variable_del('search_restrict_type_'. $info->type);
}
}