diff --git a/media.module b/media.module index 6d3f5ec..03bebb6 100644 --- a/media.module +++ b/media.module @@ -1119,3 +1119,46 @@ function media_load_all_exports($module, $directory, $extension, $name = NULL) { return $return; } + +/** + * Implements hook_views_query_alter(). + * + * Alter the media browser library view to exclude files based on the media + * browser parameters. Note that the parameters come from the HTTP query and + * should be treated as user input. + */ +function media_views_query_alter(&$view, &$query) { + if ($view->name == 'media_default') { + module_load_include('inc', 'media', 'includes/media.browser'); + $params = media_get_browser_params(); + + // Restrict files by type. + if (!empty($params['types'])) { + $where_group = $query->set_where_group(); + $field = $query->base_table . '.type'; + $query->add_where($where_group, $field, $params['types'], 'IN'); + } + + // Restrict files by URI scheme. + if (!empty($params['schemes'])) { + $where_group = $query->set_where_group('OR'); + $field = $query->base_table . '.uri'; + foreach ($params['schemes'] as $scheme) { + $value = db_like($scheme) . '%'; + $query->add_where($where_group, $field, $value, 'LIKE'); + } + } + + // Restrict files by extension. + if (!empty($params['file_extensions'])) { + $where_group = $query->set_where_group('OR'); + $field = $query->base_table . '.uri'; + foreach (explode(' ', $params['file_extensions']) as $extension) { + // @todo MySQL is generally case insensitve, but case may be a problem + // on other databases. + $value = '%.' . db_like(trim($extension, '.')); + $query->add_where($where_group, $field, $value, 'LIKE'); + } + } + } +}