Coding standards
                        Security in ResourceSpace
                        
                                            Developer reference
                        Database
                        - Table: activity_log
 - Table: annotation
 - Table: annotation_node
 - Table: collection
 - Table: collection_keyword
 - Table: collection_log
 - Table: collection_resource
 - Table: collection_savedsearch
 - Table: comment
 - Table: daily_stat
 - Table: dash_tile
 - Table: dynamic_tree_node
 - Table: external_access_keys
 - Table: filter
 - Table: filter_rule
 - Table: filter_rule_node
 - Table: ip_lockout
 - Table: job_queue
 - Table: keyword
 - Table: keyword_related
 - Table: mail_log
 - Table: message
 - Table: node
 - Table: node_keyword
 - Table: plugins
 - Table: preview_size
 - Table: report
 - Table: report_periodic_emails
 - Table: report_periodic_emails_unsubscribe
 - Table: request
 - Table: research_request
 - Table: resource
 - Table: resource_alt_files
 - Table: resource_custom_access
 - Table: resource_dimensions
 - Table: resource_keyword
 - Table: resource_log
 - Table: resource_node
 - Table: resource_related
 - Table: resource_type
 - Table: resource_type_field
 - Table: resource_type_field_resource_type
 - Table: search_log
 - Table: site_text
 - Table: slideshow
 - Table: sysvars
 - Table: tab
 - Table: user
 - Table: user_collection
 - Table: user_dash_tile
 - Table: user_message
 - Table: user_preferences
 - Table: user_rating
 - Table: user_report
 - Table: user_userlist
 - Table: usergroup
 - Table: usergroup_collection
 - Table: usergroup_dash_tile
 
Action functions
                        
                                            Admin functions
                        
                                            Ajax functions
                        Annotation functions
                        - deleteAnnotation()
 - getAnnotation()
 - getAnnotations()
 - getResourceAnnotationsCount()
 - getResourceAnnotations()
 - getAnnotoriousResourceAnnotations()
 - annotationEditable()
 - getAnnotationTags()
 - createAnnotation()
 - updateAnnotation()
 - addAnnotationNodes()
 - prepareTags()
 - search_add_annotation_count()
 - get_annotate_fields()
 - get_annotorious_lang()
 - create_annotated_pdf()
 - annotation_pdf_class()
 
API functions
                        Collections functions
                        - get_user_collections()
 - get_collection()
 - get_collection_resources()
 - get_collection_resources_with_data()
 - add_resource_to_collection()
 - remove_resource_from_collection()
 - collection_writeable()
 - collection_readable()
 - set_user_collection()
 - create_collection()
 - delete_collection()
 - refresh_collection_frame()
 - search_public_collections()
 - do_collections_search()
 - add_collection()
 - remove_collection()
 - index_collection()
 - save_collection()
 - get_max_theme_levels()
 - get_theme_headers()
 - themes_comparator()
 - collections_comparator()
 - collections_comparator_desc()
 - get_themes()
 - get_smart_theme_headers()
 - get_smart_themes_nodes()
 - email_collection()
 - generate_collection_access_key()
 - get_saved_searches()
 - add_saved_search()
 - remove_saved_search()
 - add_smart_collection()
 - get_search_title()
 - add_saved_search_items()
 - allow_multi_edit()
 - get_theme_image()
 - swap_collection_order()
 - update_collection_order()
 - get_collection_resource_comment()
 - save_collection_resource_comment()
 - relate_to_collection()
 - get_mycollection_name()
 - get_collection_comments()
 - send_collection_feedback()
 - copy_collection()
 - collection_is_research_request()
 - add_to_collection_link()
 - change_collection_link()
 - get_collection_external_access()
 - delete_collection_access_key()
 - collection_log()
 - get_collection_log()
 - get_collection_videocount()
 - collection_max_access()
 - collection_min_access()
 - collection_set_public()
 - collection_set_private()
 - collection_set_themes()
 - remove_all_resources_from_collection()
 - get_home_page_promoted_collections()
 - is_collection_approved()
 - edit_collection_external_access()
 - show_hide_collection()
 - get_session_collections()
 - update_collection_user()
 - compile_collection_actions()
 - makeFilenameUnique()
 - new_featured_collection_form()
 - get_last_resource_edit()
 - GetThemesFromRequest()
 - collection_download_get_archive_file()
 - collection_download_use_original_filenames_when_downloading()
 - collection_download_process_text_file()
 - collection_download_log_resource_ready()
 - update_zip_progress_file()
 - collection_download_process_data_only_types()
 - collection_download_process_summary_notes()
 - collection_download_process_csv_metadata_file()
 - collection_download_process_command_to_file()
 - collection_download_process_collection_download_name()
 - collection_download_process_archive_command()
 - collection_download_clean_temp_files()
 - collection_cleanup_inaccessible_resources()
 - relate_all_collection()
 - update_collection_type()
 - get_user_selection_collection()
 - delete_old_collections()
 - save_themename()
 - get_featured_collection_resources()
 - get_featured_collection_categ_sub_fcs()
 - generate_featured_collection_image_urls()
 - update_collection_parent()
 - get_featured_collections()
 - featured_collections_permissions_filter_sql()
 - featured_collection_check_access_control()
 - order_featured_collections_by_hasresources()
 - get_featured_collection_categories()
 - is_featured_collection_category()
 - is_featured_collection_category_by_children()
 - validate_collection_parent()
 - get_featured_collection_category_branch_by_leaf()
 - process_posted_featured_collection_categories()
 - get_featured_collection_ref_by_name()
 - allow_collection_share()
 - allow_featured_collection_share()
 - filter_featured_collections_by_root()
 - get_featured_collections_by_resources()
 - can_delete_featured_collection()
 - order_featured_collections()
 - strip_prefix_chars()
 - allow_upload_to_collection()
 - get_all_featured_collections()
 - compute_featured_collections_acess_control()
 - compute_featured_collections_access_control()
 - cleanup_anonymous_collections()
 - can_share_upload_link()
 - can_edit_upload_share()
 - create_upload_link()
 - generate_share_key()
 - upload_share_active()
 - upload_share_setup()
 - external_upload_notify()
 - purge_expired_shares()
 - can_delete_collection()
 - move_featured_collection_branch_path_root()
 - send_collection_to_admin()
 - collection_add_resources()
 - collection_remove_resources()
 - get_default_user_collection()
 - can_reorder_featured_collections()
 - reorder_collections()
 - update_smart_collection()
 - check_upload_terms()
 - unrelate_all_collection()
 - reorder_all_featured_collections_with_parent()
 - can_create_collections()
 - collection_can_download()
 - process_collection_download()
 - can_edit_featured_collection_category()
 
Comment functions
                        Config functions
                        - validate_field()
 - render_select_option()
 - render_bool_option()
 - render_text_option()
 - set_config_option()
 - get_config_option()
 - get_config_option_users()
 - get_config_options()
 - process_config_options()
 - config_clean()
 - config_html()
 - config_add_html()
 - config_text_input()
 - config_add_text_input()
 - config_file_input()
 - config_colouroverride_input()
 - config_add_file_input()
 - config_single_select()
 - config_add_single_select()
 - config_boolean_select()
 - config_add_boolean_select()
 - config_checkbox_select()
 - config_add_checkbox_select()
 - config_add_colouroverride_input()
 - config_add_single_ftype_select()
 - config_single_ftype_select()
 - config_generate_AutoSaveConfigOption_function()
 - config_process_file_input()
 - config_generate_html()
 - config_merge_non_image_types()
 - get_header_image()
 - config_register_core_fieldvars()
 - config_add_hidden_input()
 - config_register_core_field_refs()
 - checkValidExtension()
 - override_rs_variables_by_eval()
 - remove_config_option()
 - update_resource_type_field_resource_types()
 - get_resource_type_field_resource_types()
 - create_resource_type()
 - save_resource_type()
 - rs_get_resource_type()
 - save_resource_type_field()
 - get_resource_type_field_columns()
 - delete_config_option()
 - set_maxNumberOfFiles()
 - clear_restype_cache()
 - is_valid_contact_sheet_preview_size()
 - check_removed_ui_config()
 - config_add_fixed_input()
 - config_filter_by_search()
 - config_percent_range()
 - config_add_percent_range()
 - set_usergroup_config_option()
 - get_usergroup_parent_for_inherit_flag()
 - config_remove_user_preferences()
 - config_reapply_user_preferences()
 
CSV export functions
                        
                                            Dash functions
                        - create_dash_tile()
 - update_dash_tile()
 - delete_dash_tile()
 - revoke_all_users_flag_cascade_delete()
 - append_default_position()
 - reorder_default_dash()
 - update_default_dash_tile_order()
 - get_tile()
 - all_user_dash_tile_active()
 - existing_tile()
 - cleanup_dash_tiles()
 - checkTileConfig()
 - checkConfigCustomHomePanels()
 - get_alluser_available_tiles()
 - get_default_dash()
 - deleteDefaultDashTile()
 - updateDashTileOrder()
 - get_managed_dash()
 - add_usergroup_dash_tile()
 - append_usergroup_position()
 - reorder_usergroup_dash()
 - update_usergroup_dash_tile_order()
 - build_usergroup_dash()
 - get_tile_user_groups()
 - get_usergroup_available_tiles()
 - get_usergroup_tile()
 - add_user_dash_tile()
 - get_user_tile()
 - create_new_user_dash()
 - update_user_dash_tile_order()
 - delete_user_dash_tile()
 - empty_user_dash()
 - reorder_user_dash()
 - append_user_position()
 - get_user_available_tiles()
 - get_user_dash()
 - deleteDashTile()
 - render_delete_dialog_JS()
 - parse_dashtile_link()
 - build_dash_tile_list()
 - allow_tile_colour_change()
 - render_dash_tile_colour_chooser()
 - update_tile_preview_colour()
 - get_tile_custom_style()
 - delete_usergroup_dash_tile()
 - allowPromotedResources()
 - render_upgrade_available_tile()
 - generate_dash_tile_toolbar()
 - existing_dash_tile()
 - dash_tile_featured_collection_get_resources()
 - validate_tile_style()
 - validate_build_url()
 - tltype_srch_generate_js_for_background_and_count()
 - get_dash_search_data()
 - can_edit_tile()
 
Debug functions
                        Encryption functions
                        
                                            Facial recognition functions
                        
                                            File functions
                        - temp_local_download_remote_file()
 - permitted_archiver_arguments()
 - delete_temp_files()
 - parse_filename_extension()
 - is_safe_basename()
 - is_valid_rs_path()
 - validate_temp_path()
 - validate_resource_files()
 - is_valid_upload_path()
 - is_banned_extension()
 - remove_empty_temp_directory()
 - rrmdir()
 - check_valid_file_extension()
 - get_checksum()
 - isPathWhitelisted()
 - generateUserFilenameUID()
 - safe_file_name()
 
General functions
                        - getval()
 - getuid()
 - escape_check()
 - unescape()
 - nicedate()
 - redirect()
 - trim_spaces()
 - trim_array()
 - tidylist()
 - tidy_trim()
 - average_length()
 - get_stats_activity_types()
 - get_stats_years()
 - newlines()
 - get_all_site_text()
 - get_site_text()
 - check_site_text_custom()
 - save_site_text()
 - string_similar()
 - formatfilesize()
 - filesize2bytes()
 - get_mime_type()
 - send_mail()
 - send_mail_phpmailer()
 - log_mail()
 - rs_quoted_printable_encode()
 - rs_quoted_printable_encode_subject()
 - pager()
 - send_statistics()
 - remove_extension()
 - verify_extension()
 - get_allowed_extensions()
 - get_allowed_extensions_by_type()
 - getAbsolutePath()
 - getFolderContents()
 - mb_basename()
 - strip_extension()
 - is_process_lock()
 - set_process_lock()
 - clear_process_lock()
 - filesize_unlimited()
 - strip_leading_comma()
 - convert()
 - get_temp_dir()
 - convert_path_to_url()
 - escape_command_args()
 - run_command()
 - run_external()
 - error_alert()
 - xml_entities()
 - get_xml_entity_at_index_0()
 - sanitize_char()
 - format_display_field()
 - format_string_more_link()
 - sortmulti()
 - draw_performance_footer()
 - sql_affected_rows()
 - get_imagemagick_path()
 - get_utility_path()
 - get_executable_path()
 - truncate_cache_arrays()
 - txt2html()
 - is_html()
 - rs_setcookie()
 - get_editable_states()
 - validate_html()
 - generateURL()
 - tail()
 - move_array_element()
 - emptyiszero()
 - array_column()
 - get_slideshow_files_data()
 - form_value_display()
 - job_queue_add()
 - job_queue_update()
 - job_queue_delete()
 - job_queue_get_jobs()
 - job_queue_run_job()
 - user_set_usergroup()
 - generateSecureKey()
 - IsModal()
 - generateCSRFToken()
 - isValidCSRFToken()
 - generateFormToken()
 - generateAjaxToken()
 - enforcePostRequest()
 - findDuplicates()
 - is_resourcespace_upgrade_available()
 - get_recent_users()
 - check_script_last_ran()
 - count_errors()
 - search_array_by_keyvalue()
 - bypass_permissions()
 - set_sysvar()
 - get_sysvar()
 - hook()
 - strip_tags_and_attributes()
 - show_pagetime()
 - get_debug_log_dir()
 - debug()
 - rcRmdir()
 - daily_stat()
 - pagename()
 - text()
 - get_section_list()
 - resolve_user_agent()
 - get_ip()
 - ResolveKB()
 - trim_filename()
 - job_queue_get_job()
 - job_queue_purge()
 - get_inner_html_from_tag()
 - array_flip_by_value_key()
 - reshape_array_by_value_keys()
 - permission_j()
 - permission_negative_j()
 - cleanup_files()
 - is_int_loose()
 - ip_matches()
 - set_unique_filename()
 - build_permission()
 - validate_remote_code()
 - get_system_status()
 - allowed_type_mime()
 - try_unlink()
 - check_filestore_browseability()
 - check_imagemagick_cli_version_found()
 - check_numeric_cli_version_found()
 - check_utility_cli_version_found_by_name()
 - command_line_only()
 - prefix_value()
 - generate_csrf_js_object()
 - strip_paragraph_tags()
 - set_order_by_to_zero()
 - try_getimagesize()
 - execution_lockout_remove_resource_type_field_props()
 - is_positive_int_loose()
 - compute_dpi()
 - compute_megapixel()
 - is_jpeg_extension()
 - get_total_approved_users()
 - get_total_resources()
 - getCertificateExpiry()
 - validate_sort_value()
 - js_call_CentralSpaceLoad()
 - isValidCssColor()
 - generateConsistentColour()
 - hslToRgb()
 - get_usage_options()
 - usage_options_reorder()
 - usage_option_delete()
 - toggle_usage_option()
 - create_usage_option()
 - html_find_and_replace_node()
 - html_find_and_replace()
 - check_tinymce_plugins()
 - check_exiftool_cli_version_found()
 - get_mime_types_by_extension()
 - check_tinymce_toolbar()
 - validate_digit_csv()
 - sanitise_url()
 - date_to_age()
 - preview_from_text()
 - pluginname()
 - is_original_preview()
 - format_query()
 - log_bandwidth()
 - acl_can_view_confidential_resources()
 
Language functions
                        - ucfirstletter()
 - lang_or_i18n_get_translated()
 - i18n_get_translated()
 - i18n_get_collection_name()
 - i18n_get_indexable()
 - i18n_get_translations()
 - str_replace_formatted_placeholder()
 - ucfirstletter_callback()
 - normalize_keyword()
 - remove_accents()
 - seems_utf8()
 - http_get_preferred_language()
 - setLanguage()
 - lang_load_site_text()
 - i18n_get_all_translations()
 - i18n_merge_translations()
 - get_display_language()
 
Log functions
                        Login functions
                        Message functions
                        - system_notification()
 - message_get()
 - message_add()
 - message_remove()
 - message_seen()
 - message_unseen()
 - message_seen_all()
 - message_purge()
 - message_send_unread_emails()
 - message_remove_related()
 - message_user_remove()
 - message_get_conversation()
 - send_user_message()
 - message_deleteselusrmsg()
 - message_selectedseen()
 - message_selectedunseen()
 - message_getrefs()
 - send_user_notification()
 - get_user_message()
 - send_integrity_failure_notices()
 - build_specialsearch_list_urls()
 
Migration functions
                        Node functions
                        - set_node()
 - delete_node()
 - delete_nodes_for_resource_type_field()
 - get_node()
 - is_parent_node()
 - get_tree_node_level()
 - get_root_node_by_leaf()
 - reorder_node()
 - reorder_nodes()
 - render_new_node_record()
 - get_node_order_by()
 - draw_tree_node_table()
 - node_field_options_override()
 - add_node_keyword()
 - remove_node_keyword()
 - remove_all_node_keyword_mappings()
 - check_node_indexed()
 - add_node_keyword_mappings()
 - remove_node_keyword_mappings()
 - add_resource_nodes()
 - add_resource_nodes_multi()
 - get_resource_nodes()
 - delete_resource_nodes()
 - delete_resource_nodes_multi()
 - delete_all_resource_nodes()
 - copy_resource_nodes()
 - get_nodes_from_keywords()
 - update_resource_node_hitcount()
 - copy_resource_type_field_nodes()
 - get_parent_nodes()
 - get_nodes_count()
 - extract_node_options()
 - get_node_by_name()
 - get_node_id()
 - node_name_comparator()
 - node_orderby_comparator()
 - get_node_elements()
 - get_node_tree()
 - get_tree_strings()
 - compute_node_branch_path()
 - compute_nodes_by_parent()
 - get_resource_nodes_batch()
 - get_nodes_by_refs()
 - process_node_search_syntax_to_names()
 - delete_unused_non_fixed_list_nodes()
 - remove_invalid_node_keyword_mappings()
 - get_nodes_use_count()
 - check_delete_nodes()
 - remove_field_keywords()
 - get_cattree_nodes_ordered()
 - get_cattree_node_strings()
 - cattree_node_creator()
 - cattree_node_flatten()
 - get_resources_nodes_by_rtf()
 - get_node_strings()
 - order_tree_nodes()
 - add_sql_node_language()
 - migrate_fixed_to_text()
 - cleanup_invalid_nodes()
 - get_all_parents_by_leaf()
 - get_all_ancestors_for_node()
 - delete_node_resources()
 - remove_invalid_resource_node_mappings()
 - update_node_active_state()
 - toggle_active_state_for_nodes()
 - toggle_category_tree_nodes_active_state()
 - node_is_active()
 - node_translated_name_comparator()
 - get_nodes()
 
PDF functions
                        Plugin functions
                        - activate_plugin()
 - deactivate_plugin()
 - purge_plugin_config()
 - get_plugin_yaml()
 - config_json_encode()
 - config_encode()
 - get_plugin_config()
 - set_plugin_config()
 - is_plugin_activated()
 - handle_rsc_upload()
 - display_rsc_upload()
 - config_gen_setup_post()
 - config_gen_setup_html()
 - config_section_header()
 - config_add_section_header()
 - config_add_text_list_input()
 - config_multi_select()
 - config_add_multi_select()
 - config_single_user_select()
 - config_add_single_user_select()
 - config_multi_user_select()
 - config_add_multi_user_select()
 - config_single_group_select()
 - config_add_single_group_select()
 - config_multi_group_select()
 - config_add_multi_group_select()
 - config_multi_ftype_select()
 - config_add_multi_ftype_select()
 - config_single_rtype_select()
 - config_add_single_rtype_select()
 - config_multi_rtype_select()
 - config_add_multi_rtype_select()
 - config_db_single_select()
 - config_add_db_single_select()
 - config_db_multi_select()
 - config_add_db_multi_select()
 - config_add_hidden()
 - config_text_field()
 - config_userselect_field()
 - config_field_select()
 - config_boolean_field()
 - config_custom_select_multi()
 - config_custom_select()
 - get_plugin_css()
 - plugin_activate_for_setup()
 - include_plugin_config()
 - register_plugin_language()
 - get_plugin_path()
 - register_plugin()
 - config_multi_archive_select()
 - config_add_multi_archive_select()
 - plugin_encode_complex_configs()
 - plugin_decode_complex_configs()
 - get_active_plugins()
 - register_group_access_plugins()
 - RenderPlugin()
 - register_all_group_access_plugins()
 
Render functions
                        - render_search_field()
 - render_sort_order()
 - render_dropdown_option()
 - render_actions()
 - render_user_group_multi_select()
 - render_user_group_select()
 - render_user_group_checkbox_select()
 - render_text_question()
 - render_split_text_question()
 - render_dropdown_question()
 - render_access_key_tr()
 - is_field_displayed()
 - display_multilingual_text_field()
 - display_field()
 - render_date_range_field()
 - renderBreadcrumbs()
 - renderCallToActionTile()
 - renderSocialMediaShareLinksForUrl()
 - renderLockButton()
 - render_resource_image()
 - calculate_image_display()
 - render_share_options()
 - render_field_selector_question()
 - render_filter_bar_button()
 - render_upload_here_button()
 - render_trash()
 - render_browse_bar()
 - generate_browse_bar_item()
 - render_help_link()
 - render_question_div()
 - render_custom_fields()
 - render_selected_resources_counter()
 - render_edit_selected_btn()
 - render_clear_selected_btn()
 - render_selected_collection_actions()
 - render_user_collection_select()
 - render_csrf_data_attributes()
 - check_display_condition()
 - has_browsebar()
 - display_upload_options()
 - display_field_data()
 - render_resource_lock_link()
 - EditNav()
 - SaveAndClearButtons()
 - UpdateResultOrder()
 - display_size_option()
 - show_upgrade_in_progress()
 - render_audio_download_link()
 - render_table()
 - render_array_in_table_cells()
 - render_new_featured_collection_cta()
 - render_featured_collection_category_selector()
 - render_featured_collections()
 - render_featured_collection()
 - DrawOption()
 - render_featured_collections_category_permissions()
 - render_top_page_error_style()
 - render_workflow_state_question()
 - render_share_password_question()
 - pclick()
 - pblur()
 - render_question_form_helper()
 - render_hidden_input()
 - radio_get_layout()
 - render_radio_buttons_question()
 - render_message()
 - render_antispam_question()
 - render_fixed_text_question()
 - render_fa_icon_selector()
 - filterIcons()
 - escape_quoted_data()
 - display_related_resources()
 - admin_resource_type_field_constraint()
 - admin_resource_type_field_option()
 - showHideResTypeSelector()
 - render_resource_type_selector_question()
 - add_download_column()
 - escape()
 - render_resource_view_image()
 - is_another_tool_option_enabled()
 - toggleMode()
 - toggleAnnotationsOption()
 - toggleImagePreviewZoomOption()
 - render_resource_tools_size_download_options()
 - render_fixedlist_as_pills()
 - render_fixed_list_as_pills()
 - render_top_right_menu_btn()
 - render_featured_collection_context_menu()
 
Reporting functions
                        - render_bar_graph()
 - render_pie_graph()
 - report_process_query_placeholders()
 - report_has_thumbnail()
 - report_has_date_by_id()
 - report_has_date()
 - get_translated_activity_type()
 - unsubscribe_user_from_periodic_report()
 - delete_periodic_report()
 - send_periodic_report_emails()
 - create_periodic_email()
 - do_report()
 - get_reports()
 - get_report_name()
 
Request functions
                        - managed_collection_request()
 - get_request()
 - get_user_requests()
 - save_request()
 - get_requests()
 - email_collection_request()
 - email_resource_request()
 - get_valid_custom_fields()
 - gen_custom_fields_html_props()
 - process_custom_fields_submission()
 - can_use_owner_field()
 - get_notification_users_by_owner_field()
 - resource_request_visible()
 
Research functions
                        Slideshow functions
                        
                                            Theme permission functions
                        
                                            User functions
                        - validate_user()
 - setup_user()
 - get_users()
 - get_users_with_permission()
 - get_user_by_email()
 - get_user_by_username()
 - get_usergroups()
 - get_usergroup()
 - get_user()
 - save_user()
 - email_user_welcome()
 - email_reset_link()
 - auto_create_user_account()
 - email_user_request()
 - new_user()
 - get_active_users()
 - change_password()
 - make_password()
 - bulk_mail()
 - get_user_log()
 - resolve_userlist_groups()
 - resolve_userlist_groups_smart()
 - remove_groups_smart_from_userlist()
 - check_password()
 - resolve_users()
 - check_access_key()
 - check_access_key_collection()
 - make_username()
 - get_registration_selectable_usergroups()
 - open_access_to_user()
 - open_access_to_group()
 - resolve_open_access()
 - remove_access_to_user()
 - user_email_exists()
 - resolve_user_emails()
 - create_password_reset_key()
 - get_rs_session_id()
 - get_notification_users()
 - verify_antispam()
 - check_share_password()
 - get_users_from_permission_lookup()
 - offset_user_local_timezone()
 - checkPermission_anonymoususer()
 - checkPermission_dashadmin()
 - checkPermission_dashuser()
 - checkPermission_dashmanage()
 - checkPermission_dashcreate()
 - checkperm()
 - checkperm_user_edit()
 - internal_share_access()
 - save_usergroup()
 - set_user_profile()
 - delete_profile_image()
 - get_profile_image()
 - get_profile_text()
 - get_languages_notify_users()
 - get_upload_url()
 - emulate_user()
 - is_authenticated()
 - get_approver_usergroups()
 - get_usergroup_approvers()
 - copy_usergroup_permissions()
 - mark_email_as_invalid()
 - check_email_invalid()
 - get_users_by_permission()
 - is_anonymous_user()
 - get_users_by_preference()
 - generate_temp_download_key()
 - validate_temp_download_key()
 - setup_command_line_user()
 - user_limit_reached()
 - can_set_admin_usergroup()
 - update_user_access()
 - checkPermission_manage_users()
 - set_processing_message()
 - checkperm_login_as_user()
 - cors_is_origin_allowed()
 - delete_usergroup()
 - browser_check()
 - x9Zq()
 - xor_base64_encode()
 - load_site_text_for_usergroup()
 
Video functions
                        
                                            Database functions
                        - sql_truncate_text_val()
 - db_end_transaction()
 - db_rollback_transaction()
 - sql_query()
 - sql_value()
 - sql_array()
 - sql_insert_id()
 - get_query_cache_location()
 - clear_query_cache()
 - check_db_structs()
 - CheckDBStruct()
 - sql_limit()
 - sql_is_null_or_eq_val()
 - sql_null_or_val()
 - sql_query_prepared()
 - ps_query()
 - fetch_assoc_stmt()
 - copy_value()
 - ps_value()
 - ps_array()
 - ps_param_insert()
 - ps_param_fill()
 - columns_in()
 - sql_limit_with_total_count()
 - sql_reorder_records()
 - ps_fill_param_array()
 - db_chunk_id_list()
 - errorhandler()
 - db_use_multiple_connection_modes()
 - db_set_connection_mode()
 - db_get_connection_mode()
 - db_clear_connection_mode()
 - sql_connect()
 - db_begin_transaction()
 
Metadata functions
                        Resource functions
                        - get_resource_path()
 - get_resource_data()
 - put_resource_data()
 - create_resource()
 - update_hitcount()
 - save_resource_data()
 - set_resource_defaults()
 - save_resource_data_multi()
 - append_field_value()
 - remove_keyword_mappings()
 - remove_keyword_from_resource()
 - add_keyword_mappings()
 - add_keyword_to_resource()
 - remove_all_keyword_mappings_for_field()
 - update_field()
 - ()
 - email_resource()
 - delete_resource()
 - get_resource_type_field()
 - get_resource_field_data()
 - get_resource_field_data_batch()
 - get_resource_types()
 - get_resource_top_keywords()
 - clear_resource_data()
 - get_max_resource_ref()
 - get_resource_ref_range()
 - copy_resource()
 - resource_log()
 - get_resource_log()
 - get_resource_type_name()
 - get_resource_custom_access()
 - get_resource_custom_access_users_usergroups()
 - save_resource_custom_access()
 - get_custom_access()
 - get_themes_by_resource()
 - update_resource_type()
 - relate_to_array()
 - get_exiftool_fields()
 - createTempFile()
 - stripMetadata()
 - write_metadata()
 - delete_exif_tmpfile()
 - update_resource()
 - import_resource()
 - get_alternative_files()
 - add_alternative_file()
 - delete_alternative_file()
 - get_alternative_file()
 - save_alternative_file()
 - user_rating_save()
 - process_notify_user_contributed_submitted()
 - notify_user_contributed_submitted()
 - notify_user_contributed_unsubmitted()
 - get_field()
 - get_field_options_with_stats()
 - save_field_options()
 - get_resources_matching_keyword()
 - get_keyword_from_option()
 - add_field_option()
 - get_resource_access()
 - get_custom_access_user()
 - edit_resource_external_access()
 - resource_download_allowed()
 - get_edit_access()
 - filter_match()
 - log_diff()
 - get_metadata_templates()
 - get_resource_collections()
 - download_summary()
 - check_use_watermark()
 - autocomplete_blank_fields()
 - get_resource_files()
 - reindex_resource()
 - get_page_count()
 - update_disk_usage()
 - update_disk_usage_cron()
 - get_total_disk_usage()
 - overquota()
 - notify_user_resources_approved()
 - get_original_imagesize()
 - generate_resource_access_key()
 - get_resource_external_access()
 - delete_resource_access_key()
 - resource_type_config_override()
 - update_archive_status()
 - delete_resources_in_collection()
 - update_related_resource()
 - can_share_resource()
 - delete_resource_custom_access_usergroups()
 - truncate_join_field_value()
 - get_video_snapshots()
 - resource_file_readonly()
 - delete_resource_custom_user_access()
 - get_video_info()
 - copyAllDataToResource()
 - copyResourceDataValues()
 - copy_locked_data()
 - copy_locked_fields()
 - copyRelatedResources()
 - process_edit_form()
 - update_timestamp()
 - get_extension()
 - get_last_resource_edit_array()
 - get_default_archive_state()
 - save_original_file_as_alternative()
 - replace_resource_file()
 - get_resource_all_image_sizes()
 - sanitize_date_field_input()
 - download_link_generate_key()
 - download_link_check_key()
 - filter_check()
 - update_resource_keyword_hitcount()
 - copy_hitcount_to_live()
 - get_image_sizes()
 - get_preview_quality()
 - get_related_resources()
 - get_field_options()
 - get_data_by_field()
 - get_resources_by_resource_data_value()
 - get_all_image_sizes()
 - image_size_restricted_access()
 - get_fields()
 - get_hidden_indexed_fields()
 - get_category_tree_fields()
 - get_OR_fields()
 - get_nopreview_icon()
 - get_indexed_resource_type_fields()
 - get_resource_type_fields()
 - notify_resource_change()
 - add_verbatim_keywords()
 - metadata_field_edit_access()
 - get_download_filename()
 - get_resource_type_from_extension()
 - canSeePreviewTools()
 - checkPreviewToolsOptionUniqueness()
 - alt_is_ffmpeg_alternative()
 - create_resource_type_field()
 - metadata_field_view_access()
 - get_workflow_states()
 - delete_resource_type_field()
 - tab_names()
 - get_resource_table_joins()
 - update_resource_lock()
 - get_resource_lock_message()
 - get_resource_data_batch()
 - get_external_shares()
 - get_video_duration()
 - relate_all_resources()
 - allow_in_browser()
 - update_node_hitcount_from_search()
 - update_resource_field_column()
 - get_all_resource_types()
 - data_joins_field_value_translate_and_csv()
 - process_resource_data_joins_values()
 - canSeeAnnotationsFields()
 - apply_resource_default()
 - skip_scr_size_preview()
 - related_resource_pull()
 - get_resource_preview()
 - check_resources()
 - get_resources_to_validate()
 - get_nopreview_html()
 - get_workflow_state_names()
 
Search functions
                        - update_search_from_request()
 - save_related_keywords()
 - get_simple_search_fields()
 - get_fields_for_search_display()
 - get_filters()
 - get_filter()
 - get_filter_rules()
 - get_filter_rule()
 - save_filter()
 - save_filter_rule()
 - delete_filter()
 - delete_filter_rule()
 - copy_filter()
 - get_grouped_related_keywords()
 - get_search_default_restypes()
 - get_selectedtypes()
 - render_advanced_search_buttons()
 - get_collections_resource_count()
 - get_search_params()
 - is_not_wildcard_only()
 - search_title_node_processing()
 - setup_search_chunks()
 - log_keyword_usage()
 - set_search_order_by()
 - prepare_regex_search_string()
 - get_upload_here_selected_nodes()
 - suggest_refinement()
 - get_advanced_search_fields()
 - get_advanced_search_collection_fields()
 - search_form_to_search_query()
 - refine_searchstring()
 - compile_search_actions()
 - search_filter()
 - search_special()
 - resolve_nodes_from_string()
 - rebuild_specific_field_search_from_node()
 - search_get_previews()
 - resolve_soundex()
 - get_default_search_states()
 - get_filter_sql()
 - split_keywords()
 - cleanse_string()
 - resolve_keyword()
 - add_partial_index()
 - highlightkeywords()
 - str_highlight()
 - sorthighlights()
 - get_suggested_keywords()
 - get_related_keywords()
 
Map functions
                        Job functions
                        
                                            Tab functions
                        Test functions
                        
                                message_send_unread_emails()
Description
Send a summary of all unread notifications as an emailfrom the standard cron_copy_hitcount
Parameters
This function accepts no parameters.
Return
| boolean | Returns false if not due to run | 
Location
include/message_functions.php lines 457 to 734
Definition
 
function message_send_unread_emails()
{
    global $lang, $applicationname, $baseurl, $list_search_results_title_trim, $user_pref_daily_digest, $applicationname, $actions_on, $inactive_message_auto_digest_period, $user_pref_inactive_digest;
    $lastrun = get_sysvar('daily_digest', '1970-01-01');
    # Don't run if already run in last 24 hours.
    if (time() - strtotime($lastrun) < 24 * 60 * 60) {
        echo " - Skipping message_send_unread_emails (daily_digest) - last run: " . $lastrun . "<br />\n";
        return false;
    }
    $sendall = array();
    // Get all the users who have chosen to receive the digest email (or the ones that have opted out if set globally)
    if ($user_pref_daily_digest) {
        $allusers = get_users("", "", "u.username", "", -1, 1);
        $nodigestusers = get_config_option_users('user_pref_daily_digest', 0);
        $digestusers = array_diff(array_column($allusers, "ref"), $nodigestusers);
    } else {
        $digestusers = get_config_option_users('user_pref_daily_digest', 1);
    }
    if ($inactive_message_auto_digest_period > 0 && is_numeric($inactive_message_auto_digest_period)) {
        // Add any users who have not logged on to the array
        $allusers = get_users(0, "", "u.ref", false, -1, 1, false, "u.ref, u.username, u.last_active");
        foreach ($allusers as $user) {
            if (!in_array($user["ref"], $digestusers) && strtotime((string)$user["last_active"]) < date(time() - $inactive_message_auto_digest_period *  60 * 60 * 24)) {
                debug("message_send_unread_emails: Processing unread messages for inactive user: " . $user["username"]);
                $digestusers[] = $user["ref"];
                $sendall[] = $user["ref"];
            }
        }
    }
    if (!empty($digestusers)) {
        $digestuserschunks = array_chunk($digestusers, SYSTEM_DATABASE_IDS_CHUNK_SIZE);
        $unreadmessages = [];
        foreach ($digestuserschunks as $chunk) {
            # Get all unread notifications created since last run, or all messages sent to inactive users.
            # Build array of sql query parameters
            $parameters = array();
            $parameters = array_merge($parameters, ps_param_fill($chunk, "i"));
            $parameters = array_merge($parameters, array("s",$lastrun));
            $digestusers_sql = " AND u.ref IN (" . ps_param_insert(count($chunk)) . ")";
            $sendall_chunk = array_intersect($sendall, $chunk);
            if (count($sendall_chunk) > 0) {
                $parameters  = array_merge($parameters, ps_param_fill($sendall_chunk, "i"));
                $sendall_sql = " OR u.ref IN (" . ps_param_insert(count($sendall_chunk)) . ")";
            } else {
                $sendall_sql = "";
            }
            $unreadmessages = array_merge(
                $unreadmessages,
                ps_query(
                    "SELECT u.ref AS userref, u.email, m.ref AS messageref, m.message, m.created, m.url
                    FROM user_message um
                        JOIN user u ON u.ref = um.user
                        JOIN message m ON m.ref = um.message
                        WHERE um.seen = 0
                        $digestusers_sql
                        AND u.email <> ''
                        AND (m.created > ?
                            $sendall_sql)
                        ORDER BY m.created DESC",
                    $parameters
                )
            );
        }
    } else {
        $parameters = array("s",$lastrun);
        $unreadmessages = ps_query(
            "SELECT u.ref AS userref, u.email, m.ref AS messageref, m.message, m.created, m.url
                FROM user_message um
                    JOIN user u ON u.ref = um.user
                    JOIN message m ON m.ref = um.message
                    WHERE um.seen = 0
                    AND u.email <> ''
                    AND (m.created > ?)
                    ORDER BY m.created DESC",
            $parameters
        );
        if (!empty($sendall)) {
            $sendall_chunks = array_chunk($sendall, SYSTEM_DATABASE_IDS_CHUNK_SIZE);
            foreach ($sendall_chunks as $sendall_chunk) {
                if (count($sendall_chunk) > 0) {
                    $parameters_chunk  = array_merge($parameters, ps_param_fill($sendall_chunk, "i"));
                    $sendall_sql = " OR u.ref IN (" . ps_param_insert(count($sendall_chunk)) . ")";
                }
                $unreadmessages = array_merge(
                    $unreadmessages,
                    ps_query(
                        "SELECT u.ref AS userref, u.email, m.ref AS messageref, m.message, m.created, m.url
                        FROM user_message um
                            JOIN user u ON u.ref = um.user
                            JOIN message m ON m.ref = um.message
                            WHERE um.seen = 0
                            AND u.email <> ''
                            AND (m.created > ?
                                $sendall_sql)
                            ORDER BY m.created DESC",
                        $parameters_chunk
                    )
                );
            }
        }
    }
    // Keep record of the current value for these config options. setup_user() may override them with the user group specific ones.
    $current_inactive_message_auto_digest_period = $inactive_message_auto_digest_period;
    $current_user_pref_inactive_digest = $user_pref_inactive_digest;
    $current_user_pref_daily_digest = $user_pref_daily_digest;
    foreach ($digestusers as $digestuser) {
        // Reset config variables before setting up the user to not have logic influenced by the previous iteration.
        $inactive_message_auto_digest_period = $current_inactive_message_auto_digest_period;
        $user_pref_inactive_digest = $current_user_pref_inactive_digest;
        $user_pref_daily_digest = $current_user_pref_daily_digest;
        $messageuser = get_user($digestuser);
        if (!$messageuser) {
            // Invalid user
            continue;
        }
        setup_user($messageuser);
        $pref_msg_user_for_inactive_digest = $pref_msg_user_pref_daily_digest = null;
        get_config_option(['user' => $messageuser['ref'], 'usergroup' => $messageuser['usergroup']], 'user_pref_inactive_digest', $pref_msg_user_for_inactive_digest);
        get_config_option(['user' => $messageuser['ref'], 'usergroup' => $messageuser['usergroup']], 'user_pref_daily_digest', $pref_msg_user_pref_daily_digest);
        if ($inactive_message_auto_digest_period == 0 || (!$pref_msg_user_for_inactive_digest && !$pref_msg_user_pref_daily_digest)) {
            debug("Skipping email digest for user ref " . $digestuser . " as user or group preference disabled");
            continue;
        }
        $usermail = $messageuser["email"];
        if (!filter_var($usermail, FILTER_VALIDATE_EMAIL)) {
            debug("Skipping email digest for user ref " . $digestuser . " due to invalid email:  " . $usermail);
            continue;
        }
        $messageflag = false;
        $actionflag = false;
        // Set up an array of message to delete for this user if they have chosen to purge the messages
        $messagerefs = array();
        // Start the new email
        if (in_array($digestuser, $sendall)) {
            $message = $lang['email_auto_digest_inactive'] . "<br /><br />";
        } else {
            $message = $lang['email_daily_digest_text'] . "<br /><br />";
        }
        $message .= "<style>.InfoTable td {padding:5px; margin: 0px;border: 1px solid #000;}</style><table class='InfoTable'>";
        $message .= "<tr><th>" . $lang["columnheader-date_and_time"] . "</th><th>" . $lang["message"] . "</th><th></th></tr>";
        foreach ($unreadmessages as $unreadmessage) {
            if ($unreadmessage["userref"] == $digestuser) {
                // Message applies to this user
                $messageflag = true;
                $usermail = $unreadmessage["email"];
                $msgurl = $unreadmessage["url"];
                if (substr($msgurl, 0, 1) == "/") {
                    // If a relative link is provided make sure we add the full URL when emailing
                    $msgurl = $baseurl . $msgurl;
                }
                $message .= "<tr><td>" . nicedate($unreadmessage["created"], true, true, true) . "</td><td>" . $unreadmessage["message"] . "</td><td><a href='" . $msgurl . "'>" . $lang["link"] . "</a></td></tr>";
                $messagerefs[] = $unreadmessage["messageref"];
            }
        }
        if (count($messagerefs) == 0) {
            $message .= "<tr><td colspan='3'>" . $lang["nomessages"] . "</td></tr>";
        }
        if ($actions_on) {
            if (!$actions_on) {
                break;
            }
            $user_actions = get_user_actions(false, '', 'date', 'DESC');
            $action_count = count($user_actions);
            $actions_truncated = false;
            if ($action_count > 1000) {
                $user_actions = array_slice($user_actions, 0, 1000);
                $actions_truncated = true;
            }
            if ($action_count > 0) {
                $actionflag = true;
                debug("Adding actions to message for user " . $usermail);
                if ($messageflag) {
                    $message .= "</table><br /><br />";
                }
                $message .= $lang['email_daily_digest_actions'] . "<br /><br />" . $lang["actions_introtext"] . "<br />";
                if ($actions_truncated) {
                    $message .= escape(str_replace(array('[total]', '[application_name]'), array($action_count, $applicationname), $lang['email_actions_truncated'])) . "<br />";
                }
                $message .= "<style>.InfoTable td {padding:5px; margin: 0px;border: 1px solid #000;}</style><table class='InfoTable'>";
                $message .= "<tr><th>" . $lang["date"] . "</th>";
                $message .= "<th>" . $lang["property-reference"] . "</th>";
                $message .= "<th>" . $lang["description"] . "</th>";
                $message .= "<th>" . $lang["type"] . "</th></tr>";
                foreach ($user_actions as $user_action) {
                    $actionlinks = hook("actioneditlink", '', array($user_action));
                    if ($actionlinks) {
                        $actioneditlink = $actionlinks["editlink"];
                        $actionviewlink = $actionlinks["viewlink"];
                    } else {
                        $actioneditlink = '';
                        $actionviewlink = '';
                    }
                    if ($user_action["type"] == "resourcereview") {
                        $actioneditlink = $baseurl . "/pages/edit.php";
                        $actionviewlink = $baseurl . "/pages/view.php";
                    } elseif ($user_action["type"] == "resourcerequest") {
                        $actioneditlink = $baseurl . "/pages/team/team_request_edit.php";
                    } elseif ($user_action["type"] == "userrequest") {
                        $actioneditlink = $baseurl . "/pages/team/team_user_edit.php";
                    }
                    $linkparams["ref"] = $user_action["ref"];
                    $editlink = ($actioneditlink == '') ? '' : generateURL($actioneditlink, $linkparams);
                    $viewlink = ($actionviewlink == '') ? '' : generateURL($actionviewlink, $linkparams);
                    $message .= "<tr>";
                    $message .= "<td>" . nicedate($user_action["date"], true, true, true) . "</td>";
                    $message .= "<td><a href=\"" . $editlink . "\" >" . $user_action["ref"] . "</a></td>";
                    $message .= "<td>" . tidy_trim(TidyList($user_action["description"]), $list_search_results_title_trim) . "</td>";
                    $message .= "<td>" . $lang["actions_type_" . $user_action["type"]] . "</td>";
                    $message .= "<td><div class=\"ListTools\">";
                    if ($editlink != "") {
                        $message .= "  <a href=\"" . $editlink . "\" >" . $lang["action-edit"] . "</a>";
                    }
                    if ($viewlink != "") {
                        $message .= "  <a href=\"" . $viewlink . "\" >" . $lang["view"] . "</a>";
                    }
                    $message .= "</div>";
                    $message .= "</td></tr>";
                } // End of each $user_actions loop
            }
        }
        // Send the email
        debug("Sending summary to user ref " . $digestuser . ", email " . $usermail);
        $message .= "</table>";
        $userprefurl = $baseurl . "/pages/user/user_preferences.php#UserPreferenceEmailSection";
        $message .= "<br /><br />" . $lang["email_digest_disable"] . "<br /><a href='" . $userprefurl  . "'>" . $userprefurl . "</a>";
        if ($messageflag || $actionflag) {
            // Send mail
            send_mail($usermail, $applicationname . ": " . $lang["email_daily_digest_subject"], $message);
        }
        get_config_option(['user' => $messageuser['ref'], 'usergroup' => $messageuser['usergroup']], 'user_pref_daily_digest_mark_read', $mark_read);
        if ($mark_read && count($messagerefs) > 0) {
            $parameters = array("i",MESSAGE_ENUM_NOTIFICATION_TYPE_EMAIL);
            $parameters = array_merge($parameters, ps_param_fill($messagerefs, "i"));
            $parameters = array_merge($parameters, array("i",$digestuser));
            ps_query("UPDATE user_message SET seen = ? WHERE message IN (" . ps_param_insert(count($messagerefs)) . ") and user = ?", $parameters);
        }
    }
    set_sysvar("daily_digest", date("Y-m-d H:i:s"));
    return true;
}
This article was last updated 4th November 2025 15:05 Europe/London time based on the source file dated 15th September 2025 12:55 Europe/London time.