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
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()
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()
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()
- 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()
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()
- 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()
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()
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()
Search functions
- copy_filter()
- 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()
- get_grouped_related_keywords()
- update_search_from_request()
- 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()
- 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
process_collection_download()
Description
Generate a collection download ZIP file and the download filenameThis array will be updated and passed to subsidiary functions to keep track of processed file, generate text etc.
Could be moved to an object later
[
"filename" => [the name of download file],
"collection" => [Collection ID],
"collection_resources" => [Resources to include in download],
"collectiondata" => [Collection data - from get_collection()],
"exiftool_write_option" => [Write exif data?],
"useoriginal" => [Use original if requested size not available?],
"size" => [Requested Download size ID],
"settings_id" => [Index of selected option from $collection_download_settings],
"deletion_array" => [Array of paths to delete],
"include_csv_file" => [Include metadata CSV file?],
"include_alternatives" => [Include alternative files?],
"includetext" => Include text file?,
"collection_download_tar" => [Generate a TAR file?],
"count_data_only_types" => [Count of data only resources],
"id" => [Optional unique identifier - [used to create a download.php link that is specific to the user],
"k" => External access key from download request if set
];
[
"filename" => [the name of download file],
"path" => [path to the zip file],
"completed" => [Set to true if a tar has been sent],
];
Parameters
Column | Type | Default | Description |
---|---|---|---|
$dl_data: | array | ||
'collection_download_tar' | |||
'include_alternatives' | |||
as | 'k'] | ||
$dl_data | array | Array of collection download options passed from collection_download.php or from the offline job |
Return
array | Array of data about the created file and the download file nam, or the TAR status i.e. |
Location
include/collections_functions.php lines 6548 to 6951
Definition
function process_collection_download(array $dl_data): array
{
// Set eleemnts that may not have been set e.g. a job created in an earlier version
foreach (['archiver', 'collection_download_tar', 'include_alternatives', 'k'] as $unset_var)
if (!isset($dl_data[$unset_var])) {
$dl_data[$unset_var] = false;
}
$collection = (int) ($dl_data['collection'] ?? 0);
$collectiondata = $dl_data['collectiondata'] ?? [];
// Please note re: collection_resources - the current collection resources are not retrieved here as
// these may have changed since the download was requested. Used to be stored as "result" element
$collection_resources = $dl_data['collection_resources'] ?? ($dl_data['result'] ?? []);
$size = (string) ($dl_data['size'] ?? "");
$useoriginal = (bool) ($dl_data['useoriginal'] ?? false);
$id = (string) ($dl_data['id'] ?? uniqid("Col" . $collection));
$includetext = (bool) ($dl_data['includetext'] ?? false);
$count_data_only_types = (int) ($dl_data['count_data_only_types'] ?? 0);
$settings_id = (string) ($dl_data['settings_id'] ?? "");
$include_csv_file = (bool) ($dl_data['include_csv_file'] ?? false);
$include_alternatives = (bool) ($dl_data['include_alternatives'] ?? false);
$collection_download_tar = (bool) ($dl_data['collection_download_tar'] ?? false);
$archiver = (bool) ($dl_data["archiver"] ?? false);
// Set this as global - required by write_metadata()
global $exiftool_write_option;
$saved_exiftool_write_option = $exiftool_write_option;
$exiftool_write_option = $dl_data['exiftool_write_option'];
if (empty($collectiondata) && $collection > 0) {
$collectiondata = get_collection($collection);
}
if (
empty($collectiondata)
|| empty($collection_resources)
|| !isset($GLOBALS["userref"]) // Downloads need to be linked to a user
) {
debug("Missing collection data, Unable to proceed with collection download");
return [];
}
$zip = false;
if (!$collection_download_tar) {
// Generate a randomised path for zip file
$extension = $archiver ? $GLOBALS["collection_download_settings"][$settings_id]["extension"] : "zip";
$zipfile = get_temp_dir(false, 'user_downloads') . DIRECTORY_SEPARATOR . $GLOBALS["userref"] . "_" . md5($GLOBALS["username"] . $id . $GLOBALS["scramble_key"]) . "." . $extension;
debug('Collection download : $zipfile =' . $zipfile);
if ($GLOBALS['use_zip_extension']) {
$zip = new ZipArchive();
$zip->open($zipfile, ZIPARCHIVE::CREATE);
}
}
$dl_data['includefiles'] = []; // Store array of files to include in download
$dl_data['deletion_array'] = [];
$dl_data['filenames'] = []; // Set up an array to store the filenames as they are found (to analyze dupes)
$dl_data['used_resources'] = [];
$dl_data['subbed_original_resources'] = [];
$allsizes = get_all_image_sizes(true);
$rescount = count($collection_resources);
if ($includetext) {
// Initiate text file
$dl_data['text'] = i18n_get_collection_name($collectiondata) . "\r\n" .
$GLOBALS["lang"]["downloaded"] . " " . nicedate(date("Y-m-d H:i:s"), true, true) . "\r\n\r\n" .
$GLOBALS["lang"]["contents"] . ":\r\n\r\n";
if ($size == "") {
$dl_data['sizetext'] = "";
} else {
$dl_data['sizetext'] = "-" . $size;
}
}
db_begin_transaction("collection_download"); // Ensure all log updates are committed at once
for ($n = 0; $n < $rescount; $n++) {
// Set a flag to indicate whether file should be included
$skipresource = false;
if (!isset($collection_resources[$n]['resource_type'])) {
// Resource data is not present - e.g. an offline job
$collection_resources[$n] = get_resource_data($collection_resources[$n]["ref"]);
$dl_data['collection_resources'][$n] = $collection_resources[$n]; // Update so will be passed to other functions
}
resource_type_config_override($collection_resources[$n]['resource_type'], false); # False means execute override for every resource
$copy = false;
$ref = $collection_resources[$n]['ref'];
$access = get_resource_access($collection_resources[$n]);
$use_watermark = check_use_watermark();
$subbed_original = false;
// Do not download resources without proper access level
if ($access > 1) {
debug('Collection download : skipping resource ID ' . $ref . ' user ID ' . $GLOBALS["userref"] . ' does not have access to this resource');
continue;
}
// Get all possible sizes for this resource.
// If largest available has been requested then include internal or user could end up with no file depite being able to see the preview
$sizes = array_filter($allsizes, function ($availsize) use ($access, $size) {
return
($availsize["allow_restricted"] || $access === 0)
&& ((int) $availsize["internal"] === 0 || $size == "largest");
});
# Check availability of original file
$p = get_resource_path($ref, true, "", false, $collection_resources[$n]["file_extension"]);
if (
file_exists($p)
&& (($access == 0) || ($access == 1 && $GLOBALS["restricted_full_download"]))
&& resource_download_allowed($ref, '', $collection_resources[$n]['resource_type'], -1, true)
) {
$dl_data['available_sizes']['original'][] = $ref;
}
// Check for the availability of each size and load it to the available_sizes array
foreach ($sizes as $sizeinfo) {
if (in_array($collection_resources[$n]['file_extension'], $GLOBALS["ffmpeg_supported_extensions"])) {
$size_id = $sizeinfo['id'];
// Video files only have a 'pre' sized derivative so flesh out the sizes array using that.
$p = get_resource_path($ref, true, 'pre', false, $collection_resources[$n]['file_extension']);
$size_id = 'pre';
if (
resource_download_allowed($ref, $size_id, $collection_resources[$n]['resource_type'], -1, true)
&&
(
hook('size_is_available', '', array($collection_resources[$n], $p, $size_id))
|| file_exists($p)
)
) {
$dl_data['available_sizes'][$sizeinfo['id']][] = $ref;
}
} elseif (in_array($collection_resources[$n]['file_extension'], array_merge($GLOBALS["ffmpeg_audio_extensions"], ['mp3']))) {
// Audio files are ported to mp3 and do not have different preview sizes
$p = get_resource_path($ref, true, '', false, 'mp3');
if (
resource_download_allowed($ref, '', $collection_resources[$n]['resource_type'], -1, true)
&&
(
hook('size_is_available', '', array($collection_resources[$n], $p, ''))
|| file_exists($p)
)
) {
$dl_data['available_sizes'][$sizeinfo['id']][] = $ref;
}
} else {
$size_id = $sizeinfo['id'];
$size_extension = get_extension($collection_resources[$n], $size_id);
$p = get_resource_path($ref, true, $size_id, false, $size_extension);
if (
resource_download_allowed($ref, $size_id, $collection_resources[$n]['resource_type'], -1, true)
&&
(
hook('size_is_available', '', array($collection_resources[$n], $p, $size_id))
|| file_exists($p)
)
) {
$dl_data['available_sizes'][$size_id][] = $ref;
}
}
}
// Check which size to use
if ($size == "largest") {
foreach ($dl_data['available_sizes'] as $available_size => $resources) {
if (in_array($ref, $resources)) {
$usesize = $available_size;
if ($available_size == 'original') {
$usesize = "";
// Has access to the original so no need to check previews
break;
}
}
}
} else {
$usesize = ($size == 'original') ? "" : $size;
}
if (in_array($collection_resources[$n]['file_extension'], $GLOBALS["ffmpeg_supported_extensions"]) && $usesize !== '') {
// Supported video formats will only have a pre sized derivative
$pextension = $GLOBALS["ffmpeg_preview_extension"];
$p = get_resource_path($ref, true, 'pre', false, $pextension, -1, 1);
$usesize = 'pre';
} elseif (in_array($collection_resources[$n]['file_extension'], array_merge($GLOBALS["ffmpeg_audio_extensions"], ['mp3'])) && $usesize !== '') {
// Supported audio formats are ported to mp3
$pextension = 'mp3';
$p = get_resource_path($ref, true, '', false, 'mp3', -1, 1);
$usesize = '';
} else {
$pextension = get_extension($collection_resources[$n], $usesize);
$p = get_resource_path($ref, true, $usesize, false, $pextension, -1, 1, $use_watermark);
}
$target_exists = file_exists($p);
$replaced_file = false;
$new_file = hook('replacedownloadfile', '', array($collection_resources[$n], $usesize, $pextension, $target_exists));
if (
$new_file != ''
&& $p != $new_file
) {
$p = $new_file;
$dl_data['deletion_array'][] = $p;
$replaced_file = true;
$target_exists = file_exists($p);
} elseif (
!$target_exists
&& $useoriginal
&& resource_download_allowed($ref, '', $collection_resources[$n]['resource_type'], -1, true)
) {
// This size doesn't exist, so we'll try using the original instead
$p = get_resource_path($ref, true, '', false, $collection_resources[$n]['file_extension'], -1, 1, $use_watermark);
$pextension = $collection_resources[$n]['file_extension'];
$subbed_original = true;
$dl_data['subbed_original_resources'][] = $ref;
$target_exists = file_exists($p);
}
// Move to next resource if file doesn't exist or restricted access and user doesn't have access to the requested size
if (
!(
(
($target_exists && $access == 0)
|| (
$target_exists
&& $access == 1
&& (image_size_restricted_access($size) || ($usesize == '' && $GLOBALS["restricted_full_download"]))
)
)
&& resource_download_allowed($ref, $usesize, $collection_resources[$n]['resource_type'], -1, true)
)
) {
debug('Collection download : Skipping resource ID ' . (int) $ref
. ' file inaccessible to user - $target_exists = ' . $target_exists
. ', $access = ' . $access
. ', image_size_restricted_access(' . $size . ') = ' . image_size_restricted_access($size)
. ', $usesize = ' . $usesize
. ', $restricted_full_download = ' . $GLOBALS["restricted_full_download"]
. ', resource_download_allowed() = ' . resource_download_allowed($ref, $usesize, $collection_resources[$n]['resource_type'], -1, true)
);
// Set to skip, although alternative files may still be available
$skipresource = true;
}
$tmpfile = false;
if (!$skipresource) {
$dl_data['used_resources'][] = $ref;
if ($exiftool_write_option && !$collection_download_tar) {
$tmpfile = write_metadata($p, $ref, $id);
if ($tmpfile !== false && file_exists($tmpfile)) {
// File already in tmp, just rename it
$p = $tmpfile;
} elseif (!$replaced_file) {
// Copy the file from filestore rather than renaming
$copy = true;
}
}
// If using original filenames when downloading, copy the file to new location so the name is included.
$filename = get_download_filename($ref, $usesize, 0, $pextension);
collection_download_use_original_filenames_when_downloading(
$dl_data,
$filename,
$ref,
$pextension,
$p,
$copy,
);
if (hook("downloadfilenamealt")) {
$filename = hook("downloadfilenamealt");
}
if ($includetext) {
$addtext = collection_download_process_text_file($dl_data, $ref, $filename, $subbed_original);
$dl_data['text'] .= $addtext;
}
hook('modifydownloadfile');
if ($collection_download_tar) {
$usertempdir = get_temp_dir(false, "rs_" . $GLOBALS["userref"] . "_" . $id);
debug("collection_download adding symlink: " . $p . " - " . $usertempdir . DIRECTORY_SEPARATOR . $filename);
$GLOBALS["use_error_exception"] = true;
try {
symlink($p, $usertempdir . DIRECTORY_SEPARATOR . $filename);
} catch (Throwable $e) {
debug("process_collection_download(): Unable to create symlink for resource $ref {$e->getMessage()}");
return [];
}
unset($GLOBALS["use_error_exception"]);
} elseif ($GLOBALS['use_zip_extension']) {
debug("Adding $p - ($filename) for ref " . $ref . " to " . $zip->filename);
set_processing_message((string) ($n+1 . "/" . $rescount . " " . $GLOBALS["lang"]["filesaddedtozip"]));
$success = $zip->addFile($p, $filename);
debug('Collection download : Added resource ' . $ref . ' to zip archive = ' . ($success ? 'true' : 'false'));
} else {
$dl_data['includefiles'][] = $p;
}
}
if ($include_alternatives) {
debug("Processing alternative files for resource $ref");
// Process alternatives
$alternatives = get_alternative_files($ref);
foreach ($alternatives as $alternative) {
debug("Processing alternative file {$alternative['ref']} for resource $ref, extension: $size_extension");
$pextension = get_extension($alternative, $usesize);
$p = get_resource_path($ref, true, $usesize, false, $pextension, true, 1, $use_watermark, '', $alternative["ref"]);
$target_exists = file_exists($p);
if (
!$target_exists
&& ($useoriginal || in_array("format_chooser", $GLOBALS["plugins"]))
&& resource_download_allowed($ref, '', $collection_resources[$n]['resource_type'], $alternative["ref"], true)
) {
debug("Using original alternative file for alternative file {$alternative['ref']}");
// This size doesn't exist, so we'll try using the original instead
// Always use original if using format chooser as the option is not then available and dynamically generating custom sizes is not supported for alternatives
$p = get_resource_path($ref, true, '', false, $alternative['file_extension'], -1, 1, $use_watermark, '', $alternative["ref"]);
$pextension = $alternative['file_extension'];
$target_exists = file_exists($p);
$usesize = "";
}
debug("Using filepath $p for alternative ref " . $alternative["ref"]);
if ($target_exists) {
$download_filename_format_saved = $GLOBALS["download_filename_format"];
if (strpos($GLOBALS["download_filename_format"], "%alternative") === false) {
// To be safe, add in the alternative ID if not present in configured download filename format or
// it may conflict with the primary resource file
$GLOBALS["download_filename_format"] = str_replace(
".%extension",
"%alternative.%extension",
$GLOBALS["download_filename_format"]
);
}
$filename = get_download_filename($ref, $usesize, $alternative["ref"], $pextension);
$GLOBALS["download_filename_format"] = $download_filename_format_saved;
collection_download_use_original_filenames_when_downloading(
$dl_data,
$filename,
$ref,
$pextension,
$p,
$copy,
);
debug("Adding $p ($filename) for alternative ref " . $alternative["ref"]);
set_processing_message((string) ($n+1 . "/" . $rescount . " " . $GLOBALS["lang"]["filesaddedtozip"]));
if ($collection_download_tar) {
// $usertempdir = get_temp_dir(false, "rs_" . $GLOBALS["userref"] . "_" . $id);
debug("collection_download adding symlink: " . $p . " - " . $usertempdir . DIRECTORY_SEPARATOR . $filename);
$GLOBALS["use_error_exception"] = true;
try {
symlink($p, $usertempdir . DIRECTORY_SEPARATOR . $filename);
} catch (Throwable $e) {
debug("process_collection_download(): Unable to create symlink for ref {$ref},
alternative file {$alternative["ref"]}{$e->getMessage()}");
continue;
}
unset($GLOBALS["use_error_exception"]);
} elseif($archiver) {
$dl_data["includefiles"][] = $p;
} else {
$success = $zip->addFile($p, $filename);
debug('Collection download : Added resource ' . $ref . ' to zip archive = ' . ($success ? 'true' : 'false'));
}
} else {
debug("No file found for alternative ref " . $alternative["ref"]);
}
}
}
collection_download_log_resource_ready($dl_data, $tmpfile, $ref);
}
if (0 < $count_data_only_types) {
collection_download_process_data_only_types($dl_data, $zip);
}
collection_download_process_summary_notes($dl_data, $filename, $zip);
if ($include_csv_file == 'yes') {
collection_download_process_csv_metadata_file($dl_data, $zip);
}
if ($collection_download_tar) {
$suffix = '.tar';
} elseif ($archiver) {
$suffix = '.' . $GLOBALS["collection_download_settings"][$settings_id]['extension'];
} else {
$suffix = '.zip';
}
$filename = "";
collection_download_process_collection_download_name($filename, $collection, $size, $suffix, $collectiondata);
$completed = collection_download_process_archive_command($dl_data, $zip, $filename, $zipfile);
collection_download_clean_temp_files($dl_data['deletion_array']);
db_end_transaction("collection_download");
// Reset global
$exiftool_write_option = $saved_exiftool_write_option;
return [
"filename" => $filename,
"path" => $zipfile,
"completed" => $completed,
];
}
This article was last updated 31st March 2025 13:05 Europe/London time based on the source file dated 25th March 2025 11:20 Europe/London time.