Collections functions
Encryption functions
General functions
Render functions
Theme permission functions
Video functions
Resource functions

search_filter()

Parameters

ColumnTypeDefaultDescription
$search
$archive
$restypes
$starsearch
$recent_search_daylimit
$access_override
$return_disk_usage
$editable_only false
$access null

Location

include/search_functions.php lines 773 to 1125

Definition

 
function search_filter($search,$archive,$restypes,$starsearch,$recent_search_daylimit,$access_override,$return_disk_usage,$editable_only=false$access null)
    {
    
debug_function_call("search_filter"func_get_args());

    global 
$userref,$userpermissions,$resource_created_by_filter,$uploader_view_override,$edit_access_for_contributor,$additional_archive_states,$heightmin,
    
$heightmax,$widthmin,$widthmax,$filesizemin,$filesizemax,$fileextension,$haspreviewimage,$geo_search_restrict,$pending_review_visible_to_all,
    
$search_all_workflow_states,$pending_submission_searchable_to_all,$collections_omit_archived,$k,$collection_allow_not_approved_share,$archive_standard,
    
$open_access_for_contributor$searchstates;
    
    if (
hook("modifyuserpermissions")){$userpermissions=hook("modifyuserpermissions");}
    
$userpermissions = (isset($userpermissions)) ? $userpermissions : array();
    
    
# Convert the provided search parameters into appropriate SQL, ready for inclusion in the do_search() search query.
    
if(!is_array($archive)){$archive=explode(",",$archive);}
    
$archive array_filter($archive,function($state){return (string)(int)$state==(string)$state;}); // remove non-numeric values

    # Start with an empty string = an open query.
    
$sql_filter="";

    
# Apply resource types
    
if (($restypes!="")&&(substr($restypes,0,6)!="Global") && substr($search011) != '!collection')
        {
        if (
$sql_filter!="") {$sql_filter.=" AND ";}
        
$restypes_x=explode(",",$restypes);
        
$sql_filter.="resource_type IN ('" join("','"escape_check_array_values($restypes_x)) . "')";
        }

    
# Apply star search
    
if ($starsearch!="" && $starsearch!=&& $starsearch!=-1)
        {
        if (
$sql_filter!="") {$sql_filter.=" AND ";}
        
$sql_filter.="user_rating >= '$starsearch'";
        }   
    if (
$starsearch==-1)
        {
        if (
$sql_filter!="") {$sql_filter.=" AND ";}
        
$sql_filter.="user_rating = '-1'";
        }

    
# Apply day limit
    
if('' != $recent_search_daylimit && is_numeric($recent_search_daylimit))
        {
        if(
'' != $sql_filter)
            {
            
$sql_filter .= ' AND ';
            }

        
$sql_filter.= "creation_date > (curdate() - interval '" escape_check($recent_search_daylimit) . "' DAY)";
        }

    
# The ability to restrict access by the user that created the resource.
    
if (isset($resource_created_by_filter) && count($resource_created_by_filter)>0)
        {
        
$created_filter="";
        foreach (
$resource_created_by_filter as $filter_user)
        {
        if (
$filter_user==-1) {$filter_user=$userref;} # '-1' can be used as an alias to the current user. I.e. they can only see their own resources in search results.
        
if ($created_filter!="") {$created_filter.=" OR ";} 
        
$created_filter.= "created_by = '" $filter_user "'";
        }
        if (
$created_filter!="")
        {
        if (
$sql_filter!="") {$sql_filter.=" AND ";}
        
$sql_filter.="(" $created_filter ")";
        }
        }


    
# Geo zone exclusion
    # A list of upper/lower long/lat bounds, defining areas that will be excluded from geo search results.
    # Areas are defined as southwest lat, southwest long, northeast lat, northeast long
    
if (count($geo_search_restrict)>&& substr($search,0,4)=="!geo")
        {
        foreach (
$geo_search_restrict as $zone)
        {
        if (
$sql_filter!="") {$sql_filter.=" AND ";}
        
$sql_filter.= "(geo_lat IS null OR geo_long IS null OR not(geo_lat >= '" $zone[0] . "' AND geo_lat<= '" $zone[2] . "'";
        
$sql_filter.= " AND geo_long >= '" $zone[1] . "' AND geo_long<= '" $zone[3] . "'))";
        }
        }

    
# append resource type restrictions based on 'T' permission 
    # look for all 'T' permissions and append to the SQL filter.
    
$rtfilter=array();
    for (
$n=0;$n<count($userpermissions);$n++)
        {
        if (
substr($userpermissions[$n],0,1)=="T")
            {
            
$rt=substr($userpermissions[$n],1);
            if (
is_numeric($rt)&&!$access_override) {$rtfilter[]=$rt;}
            }
        }
    if (
count($rtfilter)>0)
        {
        if (
$sql_filter!="") {$sql_filter.=" AND ";}
        
$sql_filter.="resource_type NOT IN (" join(",",$rtfilter) . ")";
        }

    
# append "use" access rights, do not show confidential resources unless admin
    
if (!checkperm("v")&&!$access_override)
        {
        if (
$sql_filter!="") {$sql_filter.=" AND ";}
        
# Check both the resource access, but if confidential is returned, also look at the joined user-specific or group-specific custom access for rows.
        
$sql_filter.="(r.access<>'2' OR (r.access=2 AND ((rca.access IS NOT null AND rca.access<>2) OR (rca2.access IS NOT null AND rca2.access<>2))))";
        }
        
    
# append standard archive searching criteria. Updated Jan 2016 to apply to collections as resources in a pending state that are in a shared collection could bypass approval process
    
if (!$access_override)
        {
        if(
substr($search,0,11)=="!collection" || substr($search,0,5)=="!list" || substr($search,0,15)=="!archivepending" || substr($search,0,12)=="!userpending")
            {
            
# Resources in a collection or list may be in any archive state
            # Other special searches define the archive state in search_special()
            
if(substr($search,0,11)=="!collection" && $collections_omit_archived && !checkperm("e2"))
                {
                
$sql_filter.= (($sql_filter!="")?" AND ":"") . "archive<>2";
                }
            }
        elseif (
$search_all_workflow_states || substr($search,0,8)=="!related" || substr($search,0,8)=="!hasdata")
            {
hook("search_all_workflow_states_filter");}   
        elseif (
count($archive) == || $archive_standard)
            {
            
# If no archive specified add in default archive states (set by config options or as set in rse_workflow plugin)
            
if ($sql_filter!="") {$sql_filter.=" AND ";}
            
$defaultsearchstates get_default_search_states();
            if(
count($defaultsearchstates) == 0)
                {
                
// Make sure we have at least one state - system has been misconfigured
                
$defaultsearchstates[] = 0;
                }
            
$sql_filter.="archive IN (" implode(",",$defaultsearchstates) . ")";
            }
        else
            {
            
# Append normal filtering - extended as advanced search now allows searching by archive state
            
if($sql_filter!="")
                {
                
$sql_filter.=" AND ";
                }

            
$sql_filter.="archive IN (" implode(",",$archive) . ")";
            }
        if (!
checkperm("v") && !(substr($search,0,11)=="!collection" && $k!='' && $collection_allow_not_approved_share)) 
            {
            
$pending_states_visible_to_all_sql "";
            
# Append standard filtering to hide resources in a pending state, whatever the search
            
if (!$pending_submission_searchable_to_all) {$pending_states_visible_to_all_sql.= "(r.archive<>-2 OR r.created_by='" $userref "')";}
            if (!
$pending_review_visible_to_all){$pending_states_visible_to_all_sql.=(($pending_states_visible_to_all_sql!="")?" AND ":"") . "(r.archive<>-1 OR r.created_by='" $userref "')";}

            if (
$pending_states_visible_to_all_sql != "")
                {
                    
#Except when the resource is type that the user has ert permission for
                    
$rtexclusions "";
                    for (
$n=0;$n<count($userpermissions);$n++)
                        {
                        if (
substr($userpermissions[$n],0,3)=="ert")
                            {
                            
$rt=substr($userpermissions[$n],3);
                            if (
is_numeric($rt)) {$rtexclusions .= " OR (resource_type=" $rt ")";}
                            }
                        }
                    
$sql_filter .= " AND ((" $pending_states_visible_to_all_sql ") " $rtexclusions ")";
                    unset(
$rtexclusions);
                }
            }
        }
        
    
# Add code to filter out resoures in archive states that the user does not have access to due to a 'z' permission
    
$filterblockstates="";
    for (
$n=-2;$n<=3;$n++)
        {
        if(
checkperm("z" $n) && !$access_override)
            {
            if (
$filterblockstates!="") {$filterblockstates.="','";}
            
$filterblockstates .= $n;
            }
        }

    foreach (
$additional_archive_states as $additional_archive_state)
        {
        if(
checkperm("z" $additional_archive_state))
            {
            if (
$filterblockstates!="") {$filterblockstates.="','";}
            
$filterblockstates .= $additional_archive_state;
            }
        }
    if (
$filterblockstates!=""&&!$access_override)
        {
        if (
$uploader_view_override)
            {
            if (
$sql_filter!="") {$sql_filter.=" AND ";}
            
$sql_filter.="(archive NOT IN ('$filterblockstates') OR created_by='" $userref "')";
            }
        else
            {
            if (
$sql_filter!="") {$sql_filter.=" AND ";}
            
$sql_filter.="archive NOT IN ('$filterblockstates')";
            }
        }
    
    
# Append media restrictions
    
    
if ($heightmin!='')
        {
        if (
$sql_filter!="") {$sql_filter.=" AND ";}
        
$sql_filter.= "dim.height>='$heightmin'";
        }

    
# append ref filter - never return the batch upload template (negative refs)
    
if ($sql_filter!="") {$sql_filter.=" AND ";}
    
$sql_filter.="r.ref>0";

    
// Only users with v perm can search for resources with a specific access
    
if(checkperm("v") && !is_null($access) && is_numeric($access))
        {
        
$sql_filter .= (trim($sql_filter) != "" " AND " "");
        
$sql_filter .= "r.access = {$access}";
        }

    
// Append filter if only searching for editable resources
    // ($status<0 && !(checkperm("t") || $resourcedata['created_by'] == $userref) && !checkperm("ert" . $resourcedata['resource_type']))
    
if($editable_only)
        {       
        
$editable_filter "";

        if(!
checkperm("v") && !$access_override)
            {
            
// following condition added 2020-03-02 so that resources without an entry in the resource_custom_access table are included in the search results - "OR (rca.access IS NULL AND rca2.access IS NULL)"    
            
$editable_filter .= "(r.access <> 1 OR (r.access = 1 AND ((rca.access IS NOT null AND rca.access <> 1) OR (rca2.access IS NOT null AND rca2.access <> 1) OR (rca.access IS NULL AND rca2.access IS NULL)))) ";
            }

        
# Construct resource type exclusion based on 'ert' permission 
        # look for all 'ert' permissions and append to the exclusion array.
        
$rtexclusions=array();
        for (
$n=0;$n<count($userpermissions);$n++)
            {
            if (
substr($userpermissions[$n],0,3)=="ert")
                {
                
$rt=substr($userpermissions[$n],3);
                if (
is_numeric($rt)) {$rtexclusions[]=$rt;}
                }
            }   
            
        
$blockeditstates=array();
        for (
$n=-2;$n<=