add_action( 'wp_enqueue_scripts', [ $this, 'load_assets' ] ); $this->add_filter( 'timber/context', [ $this, 'fill_fields_for_timber' ], 5 ); $this->add_action( 'RomhackPlaza\\Extenders\\Submissions\\Get_A_File_Server', [ $this, 'get_file_server' ] ); } /** * Return list of IDs for submissions. * @param string $type 'simple', 'complete' or 'all' ( Default 'all' ) * @return int[] */ public function get_all_forms_page_ids( string $type = 'all' ): array { $option_name = ''; switch ( $type ) { case 'simple': $option_name = 'simple_submissions_form_page_ids'; break; case 'complete': $option_name = 'complete_submissions_form_page_ids'; break; default: $type = 'all'; // Make sure it's the affected value. break; } global $_romhackplaza; if( $type === 'simple' || $type === 'complete' ) { $string_list = $_romhackplaza->settings->get( $option_name ); $arr = explode( ';', $string_list ); if( $arr[0] == '' ) $arr = []; return array_map( 'intval', $arr ); } $first_string_list = $_romhackplaza->settings->get( 'simple_submissions_form_page_ids' ); $first_arr = explode( ';', $first_string_list ); if( $first_arr[0] == '' ) $first_arr = []; $second_string_list = $_romhackplaza->settings->get( 'complete_submissions_form_page_ids' ); $second_arr = explode( ';', $second_string_list ); if( $second_arr[0] == '' ) $second_arr = []; $arr = array_merge( $first_arr, $second_arr ); return array_map( 'intval', $arr ); } /** * Load CSS and JS scripts only on the good pages. * @return void */ public function load_assets(): void { global $post; if( !isset( $post->ID ) ) return; $simple_page_ids = $this->get_all_forms_page_ids( 'simple' ); $complete_page_ids = $this->get_all_forms_page_ids( 'complete' ); if( in_array( $post->ID, $complete_page_ids ) ){ // Translations, Romhacks, Homebrew, Utilities, Documents, LUA Scripts, Tutorials $this->children['script_hash_calc'] = new Script( Script_Type::JS, 'hash-calculator', ROMHACKPLAZA_PLUGIN_URI . '/assets/js/submissions/hashes.js', [], '20251106', args: [ 'defer' => true, 'in_footer' => true ] )->enqueue(); $this->children['script_uploader'] = new Script( Script_Type::JS, 'submissions-uploader', ROMHACKPLAZA_PLUGIN_URI . '/assets/js/submissions/uploader.js', [], '20251106', args: [ 'defer' => true, 'in_footer' => true ] )->enqueue()->add_localize( '_romhackplaza_script_uploader', [ 'submit_url' => admin_url( 'admin-ajax.php' ) ], ); } if( in_array( $post->ID, $simple_page_ids ) ){ // News $this->children['script_simple_uploader'] = new Script( Script_Type::JS, 'submissions-simple-uploader', ROMHACKPLAZA_PLUGIN_URI . '/assets/js/submissions/simple-uploader.js', [], '20251106', args: [ 'defer' => true, 'in_footer' => true ] )->enqueue()->add_localize( '_romhackplaza_script_uploader', [ 'submit_url' => admin_url( 'admin-ajax.php' ) ], ); } if( in_array( $post->ID, $simple_page_ids ) || in_array( $post->ID, $complete_page_ids ) ){ $this->children['script_css'] = new Script( Script_Type::CSS, 'submissions-css', ROMHACKPLAZA_PLUGIN_URI . '/assets/css/submissions.css', [], '20251106', )->enqueue(); $this->children['script_select2_css'] = new Script( Script_Type::CSS, 'select2', 'https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css' )->enqueue(); $this->children['script_select2_js'] = new Script( Script_Type::JS, 'select2', 'https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js', [ 'jquery' ], '', args: [ 'defer' => true, 'in_footer' => true ] )->enqueue(); wp_enqueue_media(); // WP Media Library scripts. // ACF / ACF Pro Scripts. if( function_exists( 'acf_form_head' ) ) acf_form_head(); if( function_exists( 'acf_enqueue_scripts' ) ) acf_enqueue_scripts(); } } protected function test_terms_array( mixed $terms_array ){ if( $terms_array && !is_wp_error( $terms_array ) ) return $terms_array; return []; } protected function priority_language_names(){ return [ 'English', 'French', 'German', 'Spanish', 'Italian', 'Japanese' ]; } protected function priority_language_terms_obj( array $terms_array ): array{ $priority = $this->priority_language_names(); return array_filter( $terms_array, function( $term ) use ( $priority ){ return in_array( $term->name, $priority ); }); } protected function add_and_format_language( &$context ) { $terms = \get_terms([ 'taxonomy' => 'language', 'hide_empty' => false, ]); $priority_names = $this->priority_language_names(); $priority_terms = $this->priority_language_terms_obj( $terms ); $other_terms = array_udiff( $terms, $priority_terms, function( $a, $b ) { return strcmp( $a->term_id, $b->term_id ); }); usort( $priority_terms, function( $a, $b ) use( $priority_names ){ $pos_a = array_search( $a->name, $priority_names ); $pos_b = array_search( $b->name, $priority_names ); return $pos_a - $pos_b; }); $context['terms_language'] = array_merge( $priority_terms, $other_terms ); $context['value_terms_language'] = $context['submission_post_id'] != 0 ? wp_get_post_terms( $context['submission_post_id'], Taxonomies::LANG->value, [ 'fields' => 'ids' ] ) |> $this->test_terms_array(...) : []; return $context; } protected function add_and_format_game( &$context ){ $game_term = $context['submission_post_id'] != 0 ? get_the_terms( $context['submission_post_id'], Taxonomies::GAME->value ) : 0; $context['value_game_id'] = $game_term != 0 && !is_wp_error( $game_term ) ? $game_term[0]->term_id : ''; $context['value_game_name'] = $game_term != 0 && !is_wp_error( $game_term ) ? $game_term[0]->name : ''; return $context; } protected function add_and_format_platform( &$context ){ $context['terms_platform'] = \Timber\Timber::get_terms([ 'taxonomy' => Taxonomies::PLATFORM->value, 'hide_empty' => false, ]); $platform_term = $context['submission_post_id'] != 0 ? wp_get_post_terms( $context['submission_post_id'], Taxonomies::PLATFORM->value , ['fields' => 'ids'] ) : 0; $context['value_platform_id'] = $platform_term != 0 && !empty( $platform_term ) ? $platform_term[0] : ''; return $context; } protected function add_and_format_hashes( &$context ) { $context['value_hashes'] = $context['submission_post_id'] != 0 ? esc_textarea( get_post_meta( $context['submission_post_id'], Post_Fields::HASHES->value, true ) ) : ''; return $context; } protected function add_and_format_genre( &$context ){ $context['terms_genre'] = \Timber\Timber::get_terms([ 'taxonomy' => Taxonomies::GENRE->value, 'hide_empty' => false, ]); $genre_term = $context['submission_post_id'] != 0 ? wp_get_post_terms( $context['submission_post_id'], Taxonomies::GENRE->value, ['fields' => 'ids'] ) : 0; $context['value_genre_id'] = $genre_term != 0 && !empty( $genre_term ) ? $genre_term[0] : ''; return $context; } protected function add_and_format_status( &$context ){ $context['terms_status'] = \Timber\Timber::get_terms([ 'taxonomy' => Taxonomies::STATUS->value, 'hide_empty' => false, ]); $context['value_terms_status'] = $context['submission_post_id'] != 0 ? wp_get_post_terms( $context['submission_post_id'], Taxonomies::STATUS->value, [ 'fields' => 'ids' ] ) |> $this->test_terms_array(...) : []; return $context; } protected function add_and_format_main_image_gallery( &$context ){ if( !function_exists( 'acf_form' ) ){ $context['can_acf'] = false; return $context; } $context['can_acf'] = true; $context['attachments_settings'] = [ 'post_id' => $context['submission_post_id'] != 0 ? $context['submission_post_id'] : 'new-post', 'fields_groups' => "REPLACED", 'fields' => [ Post_Fields::MAIN_IMAGE->value, Post_Fields::GALLERY->value ], 'submit_value' => __( 'Add Images', 'romhackplaza' ), 'updated_message' => __( "Images added!", 'romhackplaza' ), 'form' => false ]; return $context; } protected function add_and_format_author( &$context ){ $context['value_authors'] = $context['submission_post_id'] != 0 ? get_the_terms( $context['submission_post_id'], Taxonomies::AUTHORS->value ) |> $this->test_terms_array(...) : []; return $context; } protected function add_and_format_credits( &$context ){ $context['value_credits'] = $context['submission_post_id'] != 0 ? esc_textarea( get_post_meta( $context['submission_post_id'], Post_Fields::STAFF_CREDITS->value, true ) ) : ''; return $context; } protected function add_and_format_extra_links( &$context ){ $context['value_release_site'] = $context['submission_post_id'] != 0 ? esc_attr( get_post_meta( $context['submission_post_id'], Post_Fields::RELEASE_SITE->value, true ) ) : ''; $context['value_youtube_video'] = $context['submission_post_id'] != 0 ? esc_attr( get_post_meta( $context['submission_post_id'], Post_Fields::YOUTUBE_VIDEO->value, true ) ) : ''; return $context; } public function fill_fields_for_timber( $context ){ global $post; if( !isset( $post->ID ) ) return $context; $simple_page_ids = $this->get_all_forms_page_ids( 'simple' ); $complete_page_ids = $this->get_all_forms_page_ids( 'complete' ); if( !in_array( $post->ID, $simple_page_ids ) && !in_array( $post->ID, $complete_page_ids ) ) return $context; /* * The filter is removed to avoid duplications. */ global $_romhackplaza_theme, $_romhackplaza; remove_filter( 'timber/context', [ $_romhackplaza_theme->children['template_context'], 'timber_context_handler_by_page' ] ); // General ones. // If we are on the result page and why. $context['submission_result'] = isset( $_GET['result'] ) ? sanitize_text_field( $_GET['result'] ) : ''; // If we edit an entry, the post ID. $context['submission_post_id'] = isset( $_GET['edit_entry'] ) ? intval( $_GET['edit_entry'] ) : 0; // If we edit an entry on the result page. URL. $context['submission_edit_entry'] = isset( $_GET['edit_entry'] ) ? add_query_arg( [ 'edit_entry' => intval( $_GET['edit_entry'] ) ], get_permalink() ) : ''; // If the current user is verified or staff. $context['submission_author_is_verified'] = $_romhackplaza->user_roles->current_is( Roles::Verified ) || $_romhackplaza->user_roles->current_is_staff(); // If the current user can edit this entry, if it already exist. $context['submission_can_edit'] = !isset($context['submission_post_id']) || $_romhackplaza->user_roles->current_can_edit_entry($context['submission_post_id']); // If the current user can bypass a locked entry. Only if it is a staff member. $context['submission_can_bypass_locked'] = $_romhackplaza->user_roles->current_is_staff(); // If the current user can bypass a trashed entry and a private entry. Only an administrator can. $context['submission_can_bypass_trashed_private'] = $_romhackplaza->user_roles->current_is(Roles::Administrator); // If the public edit is disabled or not. $context['submission_public_edit_disabled'] = Properties::public_edit_disabled(); // Submission team message, like queue status. Private message. Locked reason, etc... $context['submission_queue_status'] = isset( $context['submission_post_id'] ) ? get_field( 'queue_status', $context['submission_post_id'] ) : ""; if( $context['submission_queue_status'] === "not checked" ) // Default message. $context['submission_queue_status'] = ""; // Save Nonce $context['submission_save_nonce'] = wp_nonce_field( Format::format_nonce_name( 'submissions_save_entry' ), display: false ); // Entry title field default name. $context['entry_title_field_name'] = __( "Name:", "romhackplaza" ); // Entry title value. $context['value_entry_title'] = $context['submission_post_id'] != 0 ? esc_attr( get_post_meta( $context['submission_post_id'], Post_Fields::ENTRY_TITLE->value, true ) ) : ""; // Patch version label. $context['version_number_field_name'] = __( "Version:", "romhackplaza" ); // Patch version value $context['value_version_number'] = $context['submission_post_id'] != 0 ? esc_attr( get_post_meta( $context['submission_post_id'], Post_Fields::VERSION_NUMBER->value, true ) ) : ""; // Release date value $context['value_release_date'] = ""; $release_date = $context['submission_post_id'] != 0 ? get_post_meta( $context['submission_post_id'], Post_Fields::LAST_UPDATED->value, true ) : false; if( $release_date ) { $date = \DateTime::createFromFormat( 'Ymd', $release_date ); if( $date ) $context['value_release_date'] = $date->format( 'Y-m-d' ); } // Editor settings and value $context['value_post_content'] = $context['submission_post_id'] != 0 ? get_post_field( 'post_content', $context['submission_post_id'], 'edit' ) : ""; $context['post_content_settings'] = [ 'textarea_name' => 'postContent', 'media_buttons' => false, 'textarea_rows' => 7, 'tinymce' => array( 'theme_advanced_buttons1' => 'formatselect,|,bold,italic,underline,|,' . 'bullist,numlist,|,link,unlink,|,undo,redo,|,' . 'removeformat,|,charmap,|,outdent,indent,|,cut,copy,paste', 'content_css' => get_stylesheet_directory_uri() . '/editor.css' ), 'quicktags' => array('buttons' => 'strong,em,link,block,del,ins,img,ul,ol,li,code,close'), ]; $context['submission_save_as_draft_checkbox'] = $context['submission_post_id'] != 0 && get_post_status($context['submission_post_id']) === 'draft'; $post_type_rhpz_obj = null; if( str_contains( $post->post_name, 'translation' ) ){ $post_type_rhpz_obj = &$_romhackplaza->cpt->select->translations; $context['entry_title_field_name'] = __( "Custom Name:", "romhackplaza" ); $context['version_number_field_name'] = __( "Patch Version:", "romhackplaza" ); $context = $this->add_and_format_status( $context ); $context = $this->add_and_format_language( $context ); $context = $this->add_and_format_game( $context ); $context = $this->add_and_format_platform( $context ); $context = $this->add_and_format_genre( $context ); $context = $this->add_and_format_hashes( $context ); $context = $this->add_and_format_main_image_gallery( $context ); $context = $this->add_and_format_author( $context ); $context = $this->add_and_format_credits( $context ); $context = $this->add_and_format_extra_links( $context ); } else if( str_contains( $post->post_name, 'romhack' ) ){ $post_type_rhpz_obj = &$_romhackplaza->cpt->select->romhacks; $context['version_number_field_name'] = __( "Patch Version:", "romhackplaza" ); $context = $this->add_and_format_status( $context ); $context = $this->add_and_format_language( $context ); $context = $this->add_and_format_game( $context ); $context = $this->add_and_format_platform( $context ); $context = $this->add_and_format_genre( $context ); $context = $this->add_and_format_hashes( $context ); $context = $this->add_and_format_main_image_gallery( $context ); $context = $this->add_and_format_author( $context ); $context = $this->add_and_format_credits( $context ); } else if( str_contains( $post->post_name, 'news' ) ){ $post_type_rhpz_obj = &$_romhackplaza->cpt->select->news; $context['entry_title_field_name'] = __( "Title:", "romhackplaza" ); } // General ones sequel. if( $post_type_rhpz_obj ) { // Post type name. $context['post_type'] = $post_type_rhpz_obj->name; // Post type singular name. $context['post_type_singular'] = $post_type_rhpz_obj->singular_name; // ACF Field group. $context['post_type_acf'] = $post_type_rhpz_obj->getAcfFieldGroupKey(); // Add for main image and gallery if( isset( $context['attachments_settings'] ) ) $context['attachments_settings']['field_groups'] = [ $context['post_type_acf'] ]; } new Modal( 'submissions', "", "" )->render(); return $context; } public function get_file_server( int $post_id = 0 ){ global $post; if( !isset( $post->ID ) ) return; $complete_page_ids = $this->get_all_forms_page_ids( 'complete' ); if( in_array( $post->ID, $complete_page_ids ) ) { // Translations, Romhacks, Homebrew, Utilities, Documents, LUA Scripts, Tutorials new File_Server($post_id)->print_js(); } } }