PK ! %md d Controller.phpnu [ parent = \C_NextGen_Admin_Page_Controller::get_instance(); $this->_load_displayed_gallery(); if ( ! has_action( 'wp_print_scripts', [ $this, 'filter_scripts' ] ) ) { add_action( 'wp_print_scripts', [ $this, 'filter_scripts' ] ); } if ( ! has_action( 'wp_print_scripts', [ $this, 'filter_styles' ] ) ) { add_action( 'wp_print_scripts', [ $this, 'filter_styles' ] ); } } static function get_instance( string $context = 'all' ): Controller { if ( ! isset( self::$_instances[ $context ] ) ) { self::$_instances[ $context ] = new Controller( $context ); } return self::$_instances[ $context ]; } /** * Necessary for compatibility with Pro. * * @TODO Remove when use of this method has been removed from Pro */ public static function has_method(): bool { return false; } public function _load_displayed_gallery() { $mapper = DisplayedGalleryMapper::get_instance(); // Fetch the displayed gallery by ID. if ( ( $id = $this->parent->param( 'id' ) ) ) { $this->displayed_gallery = $mapper->find( $id ); } elseif ( isset( $_REQUEST['shortcode'] ) && isset( $_REQUEST['nonce'] ) && \wp_verify_nonce( sanitize_text_field( wp_unslash( $_REQUEST['nonce'] ) ), 'ngg_attach_to_post_iframe' ) ) { // Fetch the displayed gallery by shortcode. $shortcode = base64_decode( $_REQUEST['shortcode'] ); // $shortcode lacks the opening and closing brackets but still begins with 'ngg ' or 'ngg_images ' which are not parameters. $params = preg_replace( '/^(ngg|ngg_images) /i', '', $shortcode, 1 ); $params = stripslashes( $params ); $params = str_replace( [ '[', ']' ], [ '[', ']' ], $params ); $params = shortcode_parse_atts( $params ); $this->displayed_gallery = Renderer::get_instance()->params_to_displayed_gallery( $params ); } // If all else fails, then create fresh with a new displayed gallery. if ( empty( $this->displayed_gallery ) ) { $this->displayed_gallery = $mapper->create(); } } /** * Gets all dependencies for a particular resource that has been registered using wp_register_style/wp_register_script * * @param $handle * @param $type * * @return array */ public function get_resource_dependencies( $handle, $type ) { $retval = []; $wp_resources = $GLOBALS[ $type ]; if ( ( $index = array_search( $handle, $wp_resources->registered ) ) !== false ) { $registered_script = $wp_resources->registered[ $index ]; if ( $registered_script->deps ) { foreach ( $registered_script->deps as $dep ) { $retval[] = $dep; $retval = array_merge( $retval, $this->get_script_dependencies( $handle ) ); } } } return $retval; } public function get_script_dependencies( $handle ) { return $this->get_resource_dependencies( $handle, 'wp_scripts' ); } public function get_style_dependencies( $handle ) { return $this->get_resource_dependencies( $handle, 'wp_styles' ); } public function get_ngg_provided_resources( $type ) { $wp_resources = $GLOBALS[ $type ]; $retval = []; foreach ( $wp_resources->queue as $handle ) { $script = $wp_resources->registered[ $handle ]; if ( strpos( $script->src, plugin_dir_url( NGG_PLUGIN_BASENAME ) ) !== false ) { $retval[] = $handle; } if ( defined( 'NGG_PRO_PLUGIN_BASENAME' ) && strpos( $script->src, plugin_dir_url( NGG_PRO_PLUGIN_BASENAME ) ) !== false ) { $retval[] = $handle; } if ( defined( 'NGG_PLUS_PLUGIN_BASENAME' ) && strpos( $script->src, plugin_dir_url( NGG_PLUS_PLUGIN_BASENAME ) ) !== false ) { $retval[] = $handle; } } return array_unique( $retval ); } public function get_ngg_provided_scripts() { return $this->get_ngg_provided_resources( 'wp_scripts' ); } public function get_ngg_provided_styles() { return $this->get_ngg_provided_resources( 'wp_styles' ); } public function get_igw_allowed_scripts() { $retval = []; foreach ( $this->get_ngg_provided_scripts() as $handle ) { $retval[] = $handle; $retval = array_merge( $retval, $this->get_script_dependencies( $handle ) ); } foreach ( $this->get_display_type_scripts() as $handle ) { $retval[] = $handle; $retval = array_merge( $retval, $this->get_script_dependencies( $handle ) ); } foreach ( $this->attach_to_post_scripts as $handle ) { $retval[] = $handle; $retval = array_merge( $retval, $this->get_script_dependencies( $handle ) ); } return array_unique( apply_filters( 'ngg_igw_approved_scripts', $retval ) ); } public function get_display_type_scripts() { global $wp_scripts; $wp_scripts->old_queue = $wp_scripts->queue; $wp_scripts->queue = []; $mapper = DisplayTypeMapper::get_instance(); foreach ( $mapper->find_all() as $display_type ) { $form = \C_Form::get_instance( $display_type->name ); $form->enqueue_static_resources(); } $retval = $wp_scripts->queue; $wp_scripts->queue = $wp_scripts->old_queue; unset( $wp_scripts->old_queue ); return $retval; } public function get_display_type_styles() { global $wp_styles; $wp_styles->old_queue = $wp_styles->queue; $wp_styles->queue = []; $mapper = DisplayTypeMapper::get_instance(); foreach ( $mapper->find_all() as $display_type ) { $form = \C_Form::get_instance( $display_type->name ); $form->enqueue_static_resources(); } $retval = $wp_styles->queue; $wp_styles->queue = $wp_styles->old_queue; unset( $wp_styles->old_queue ); return $retval; } public function get_igw_allowed_styles() { $retval = []; foreach ( $this->get_ngg_provided_styles() as $handle ) { $retval[] = $handle; $retval = array_merge( $retval, $this->get_style_dependencies( $handle ) ); } foreach ( $this->get_display_type_styles() as $handle ) { $retval[] = $handle; $retval = array_merge( $retval, $this->get_style_dependencies( $handle ) ); } foreach ( $this->attach_to_post_styles as $handle ) { $retval[] = $handle; $retval = array_merge( $retval, $this->get_style_dependencies( $handle ) ); } return array_unique( apply_filters( 'ngg_igw_approved_styles', $retval ) ); } public function filter_scripts() { global $wp_scripts; $new_queue = []; $current_queue = $wp_scripts->queue; $approved = $this->get_igw_allowed_scripts(); foreach ( $current_queue as $handle ) { if ( in_array( $handle, $approved ) ) { $new_queue[] = $handle; } } $wp_scripts->queue = $new_queue; } public function filter_styles() { global $wp_styles; $new_queue = []; $current_queue = $wp_styles->queue; $approved = $this->get_igw_allowed_styles(); foreach ( $current_queue as $handle ) { if ( in_array( $handle, $approved ) ) { $new_queue[] = $handle; } } $wp_styles->queue = $new_queue; } /** * Necessary for compatibility with Pro. * * @TODO Remove when use of this method has been removed from Pro * @return false */ public function mark_script( $handle ) { return false; } public function enqueue_display_tab_js() { // Enqueue backbone.js library, required by the Attach to Post display tab. wp_enqueue_script( 'backbone' ); // provided by WP. // Enqueue the backbone app for the display tab. Get all entities used by the display tab. $context = 'attach_to_post'; $gallery_mapper = GalleryMapper::get_instance(); $album_mapper = AlbumMapper::get_instance(); $image_mapper = ImageMapper::get_instance(); $display_type_mapper = DisplayTypeMapper::get_instance(); $sources = SourceManager::get_instance(); $router = Router::get_instance(); $settings = Settings::get_instance(); // Get the nextgen tags. global $wpdb; $tags = $wpdb->get_results( "SELECT DISTINCT name AS 'id', name FROM {$wpdb->terms} WHERE term_id IN ( SELECT term_id FROM {$wpdb->term_taxonomy} WHERE taxonomy = 'ngg_tag' )" ); $all_tags = new \stdClass(); $all_tags->name = 'All'; $all_tags->id = 'All'; array_unshift( $tags, $all_tags ); $display_types = []; $display_type_mapper->flush_query_cache(); $all_display_types = $display_type_mapper->find_all(); if ( \C_NextGEN_Bootstrap::get_pro_api_version() >= 4.0 ) { foreach ( $all_display_types as $display_type ) { $available = ControllerFactory::has_controller( $display_type->name ); if ( ! \apply_filters( 'ngg_atp_show_display_type', $available, $display_type ) ) { continue; } if ( ! ControllerFactory::has_controller( $display_type->name ) ) { continue; } $controller = ControllerFactory::get_controller( $display_type->name ); if ( $controller->is_hidden_from_igw() ) { continue; } $display_type->preview_image_url = $controller->get_preview_image_url(); $display_types[] = $display_type; } } else { foreach ( $all_display_types as $display_type ) { if ( ( isset( $display_type->hidden_from_igw ) && $display_type->hidden_from_igw ) || ( isset( $display_type->hidden_from_ui ) && $display_type->hidden_from_ui ) ) { continue; } $available = ControllerFactory::has_controller( $display_type->name ); if ( ! $available && class_exists( '\C_Component_Registry' ) ) { $available = \C_Component_Registry::get_instance()->is_module_loaded( $display_type->name ); if ( ! $available && defined( 'NGG_PRO_ALBUMS' ) && in_array( $display_type->name, [ \NGG_PRO_LIST_ALBUM, \NGG_PRO_GRID_ALBUM ] ) ) { $available = true; } } if ( ! \apply_filters( 'ngg_atp_show_display_type', $available, $display_type ) ) { continue; } if ( ControllerFactory::has_controller( $display_type->name ) ) { $controller = ControllerFactory::get_controller( $display_type->name ); $display_type->preview_image_url = $controller->get_preview_image_url(); } else { $display_type->preview_image_url = StaticPopeAssets::get_url( $display_type->preview_image_relpath ); } $display_types[] = $display_type; } } usort( $display_types, [ $this, '_display_type_list_sort' ] ); \wp_enqueue_script( 'ngg_display_tab', StaticAssets::get_url( 'AttachToPost/display_tab.js', 'photocrati-attach_to_post#display_tab.js' ), [ 'jquery', 'backbone', 'photocrati_ajax' ], NGG_SCRIPT_VERSION ); \wp_localize_script( 'ngg_display_tab', 'igw_data', [ 'displayed_gallery_preview_url' => $router->get_url( '/' . NGG_ATTACH_TO_POST_SLUG . '/preview', false ), 'displayed_gallery' => $this->displayed_gallery->get_entity(), 'sources' => $sources->get_all(), 'gallery_primary_key' => $gallery_mapper->get_primary_key_column(), 'galleries' => $gallery_mapper->find_all(), 'albums' => $album_mapper->find_all(), 'tags' => $tags, 'display_types' => $display_types, 'nonce' => wp_create_nonce( 'wp_rest' ), 'image_primary_key' => $image_mapper->get_primary_key_column(), 'display_type_priority_base' => NGG_DISPLAY_PRIORITY_BASE, 'display_type_priority_step' => NGG_DISPLAY_PRIORITY_STEP, // Nonce verification has already been performed by the methods that invoke this method. // phpcs:ignore WordPress.Security.NonceVerification.Recommended 'shortcode_ref' => isset( $_REQUEST['ref'] ) ? floatval( $_REQUEST['ref'] ) : null, 'shortcode_defaults' => [ 'order_by' => $settings->get( 'galSort' ), 'order_direction' => $settings->get( 'galSortDir' ), 'returns' => 'included', 'maximum_entity_count' => $settings->get( 'maximum_entity_count' ), ], 'shortcode_attr_replacements' => [ 'source' => 'src', 'container_ids' => 'ids', 'display_type' => 'display', ], 'i18n' => [ 'sources' => \__( 'Are you inserting a Gallery (default), an Album, or images based on Tags?', 'nggallery' ), 'optional' => \__( '(optional)', 'nggallery' ), 'slug_tooltip' => \__( 'Sets an SEO-friendly name to this gallery for URLs. Currently only in use by the Pro Lightbox', 'nggallery' ), 'slug_label' => \__( 'Slug', 'nggallery' ), 'no_entities' => \__( 'No entities to display for this source', 'nggallery' ), 'exclude_question' => \__( 'Exclude?', 'nggallery' ), 'select_gallery' => \__( 'Select a Gallery', 'nggallery' ), 'galleries' => \__( 'Select one or more galleries (click in box to see available galleries).', 'nggallery' ), 'albums' => \__( 'Select one album (click in box to see available albums).', 'nggallery' ), ], ] ); } public function start_resource_monitoring() { global $wp_scripts, $wp_styles; $this->attach_to_post_scripts = []; $this->attach_to_post_styles = []; $wp_styles->before_monitoring = $wp_styles->queue; $wp_scripts->before_monitoring = $wp_styles->queue; } public function stop_resource_monitoring() { global $wp_scripts, $wp_styles; $this->attach_to_post_scripts = array_diff( $wp_scripts->queue, $wp_scripts->before_monitoring ); $this->attach_to_post_styles = array_diff( $wp_styles->queue, $wp_styles->before_monitoring ); } public function enqueue_backend_resources() { $this->start_resource_monitoring(); // Enqueue frame event publishing. \wp_enqueue_script( 'frame_event_publisher' ); \wp_enqueue_script( 'ngg_tabs', StaticAssets::get_url( 'AttachToPost/ngg_tabs.js', 'photocrati-attach_to_post#ngg_tabs.js' ), [ 'jquery-ui-tabs', 'jquery-ui-sortable', 'jquery-ui-tooltip', 'jquery-ui-accordion' ], NGG_SCRIPT_VERSION ); \wp_enqueue_style( 'buttons' ); // Ensure select2. \wp_enqueue_style( 'ngg_select2' ); \wp_enqueue_script( 'ngg_select2' ); // Ensure that the Photocrati AJAX library is loaded. \wp_enqueue_script( 'photocrati_ajax' ); // Enqueue logic for the Attach to Post interface as a whole. \wp_enqueue_script( 'ngg_attach_to_post_js', StaticAssets::get_url( 'AttachToPost/attach_to_post.js', 'photocrati-attach_to_post#attach_to_post.js' ), [], NGG_SCRIPT_VERSION ); \wp_enqueue_style( 'ngg_attach_to_post', StaticAssets::get_url( 'AttachToPost/attach_to_post.css', 'photocrati-attach_to_post#attach_to_post.css' ), [], NGG_SCRIPT_VERSION ); \wp_dequeue_script( 'debug-bar-js' ); \wp_dequeue_style( 'debug-bar-css' ); $this->enqueue_display_tab_js(); if ( ! \M_Marketing::is_plus_or_pro_enabled() ) { $marketing = new Marketing(); $marketing->enqueue_display_tab_js(); } \do_action( 'ngg_igw_enqueue_scripts' ); \do_action( 'ngg_igw_enqueue_styles' ); $this->stop_resource_monitoring(); } /** * Renders the interface * * @param bool $return * @return string */ public function index_action( $return = true ) { $parent = \C_NextGen_Admin_Page_Controller::get_instance(); $parent->enqueue_backend_resources(); $parent->do_not_cache(); $this->enqueue_backend_resources(); \wp_enqueue_style( 'nggadmin', NGGALLERY_URLPATH . 'admin/css/nggadmin.css', [], NGG_SCRIPT_VERSION, 'screen' ); \do_action( 'admin_enqueue_scripts' ); // If Elementor is also active a fatal error is generated due to this method not existing. if ( ! function_exists( 'wp_print_media_templates' ) ) { require_once ABSPATH . WPINC . '/media-template.php'; } $view = new View( 'AttachToPost/attach_to_post', [ 'page_title' => $this->_get_page_title(), 'tabs' => $this->_get_main_tabs(), 'logo' => StaticPopeAssets::get_url( 'photocrati-nextgen_admin#imagely_icon.png' ), ], 'photocrati-attach_to_post#attach_to_post' ); return $view->render( $return ); } /** * Returns the page title of the Attach to Post interface * * @return string */ public function _get_page_title() { return \__( 'NextGEN Gallery - Attach To Post', 'nggallery' ); } /** * Returns the main tabs displayed on the Attach to Post interface * * @return array */ public function _get_main_tabs() { $retval = []; if ( Security::is_allowed( 'NextGEN Manage gallery' ) ) { $retval['displayed_tab'] = [ 'content' => $this->_render_display_tab(), 'title' => \__( 'Insert Into Page', 'nggallery' ), ]; } if ( Security::is_allowed( 'NextGEN Upload images' ) ) { $retval['create_tab'] = [ 'content' => $this->_render_create_tab(), 'title' => \__( 'Upload Images', 'nggallery' ), ]; } if ( Security::is_allowed( 'NextGEN Manage others gallery' ) && Security::is_allowed( 'NextGEN Manage gallery' ) ) { $retval['galleries_tab'] = [ 'content' => $this->_render_galleries_tab(), 'title' => \__( 'Manage Galleries', 'nggallery' ), ]; } if ( Security::is_allowed( 'NextGEN Edit album' ) ) { $retval['albums_tab'] = [ 'content' => $this->_render_albums_tab(), 'title' => \__( 'Manage Albums', 'nggallery' ), ]; } return apply_filters( 'ngg_attach_to_post_main_tabs', $retval ); } /** * Renders a NextGen Gallery page in an iframe, suited for the attach to post * interface * * @param string $page * @param null|int $tab_id (optional) * @return string */ public function _render_ngg_page_in_frame( $page, $tab_id = null ) { $frame_url = \admin_url( "/admin.php?page={$page}&attach_to_post" ); $frame_url = Router::esc_url( $frame_url ); if ( $tab_id ) { $tab_id = " id='ngg-iframe-{$tab_id}'"; } return ""; } /** * Renders the display tab for adjusting how images/galleries will be displayed * * @return string */ public function _render_display_tab() { $view = new View( 'AttachToPost/display_tab', [ 'messages' => [], 'displayed_gallery' => $this->displayed_gallery, 'tabs' => $this->_get_display_tabs(), ], 'photocrati-attach_to_post#display_tab' ); return $view->render( true ); } /** * Renders the tab used primarily for Gallery and Image creation * * @return string */ public function _render_create_tab() { return $this->_render_ngg_page_in_frame( 'ngg_addgallery', 'create_tab' ); } /** * Renders the tab used for Managing Galleries * * @return string */ public function _render_galleries_tab() { return $this->_render_ngg_page_in_frame( 'nggallery-manage-gallery', 'galleries_tab' ); } /** * Renders the tab used for Managing Albums. */ public function _render_albums_tab() { return $this->_render_ngg_page_in_frame( 'nggallery-manage-album', 'albums_tab' ); } public function _display_type_list_sort( $type_1, $type_2 ) { $order_1 = $type_1->view_order; $order_2 = $type_2->view_order; if ( $order_1 == null ) { $order_1 = NGG_DISPLAY_PRIORITY_BASE; } if ( $order_2 == null ) { $order_2 = NGG_DISPLAY_PRIORITY_BASE; } if ( $order_1 > $order_2 ) { return 1; } if ( $order_1 < $order_2 ) { return -1; } return 0; } /** * Gets a list of tabs to render for the "Display" tab */ public function _get_display_tabs() { // The ATP requires more memmory than some applications, somewhere around 60MB. // Because it's such an important feature of NextGEN Gallery, we temporarily disable // any memory limits. if ( ! extension_loaded( 'suhosin' ) ) { @ini_set( 'memory_limit', -1 ); } return [ 'choose_display_tab' => $this->_render_choose_display_tab(), 'display_settings_tab' => $this->_render_display_settings_tab(), 'preview_tab' => $this->_render_preview_tab(), ]; } /** * Renders the accordion tab, "What would you like to display?" */ public function _render_choose_display_tab() { return [ 'id' => 'choose_display', 'title' => \__( 'Choose Display', 'nggallery' ), 'content' => $this->_render_display_source_tab_contents() . $this->_render_display_type_tab_contents(), ]; } /** * Renders the contents of the source tab * * @return string */ public function _render_display_source_tab_contents() { $view = new View( 'AttachToPost/display_tab_source', [ 'i18n' => [], ], 'photocrati-attach_to_post#display_tab_source' ); return $view->render( true ); } /** * Renders the contents of the display type tab */ public function _render_display_type_tab_contents() { $view = new View( 'AttachToPost/display_tab_type', [], 'photocrati-attach_to_post#display_tab_type' ); return $view->render( true ); } /** * Renders the display settings tab for the Attach to Post interface * * @return array */ public function _render_display_settings_tab() { return [ 'id' => 'display_settings_tab', 'title' => \__( 'Customize Display Settings', 'nggallery' ), 'content' => $this->_render_display_settings_contents(), ]; } /** * If editing an existing displayed gallery, retrieves the name * of the display type * * @return string */ public function _get_selected_display_type_name() { $retval = ''; if ( $this->displayed_gallery ) { $retval = $this->displayed_gallery->display_type; } return $retval; } /** * Is the displayed gallery that's being edited using the specified display * type? * * @param string $name name of the display type * @return bool */ public function is_displayed_gallery_using_display_type( $name ) { $retval = false; if ( $this->displayed_gallery ) { $retval = $this->displayed_gallery->display_type == $name; } return $retval; } /** * Renders the contents of the display settings tab * * @return string */ public function _render_display_settings_contents() { $retval = []; // Get all display setting forms. $form_manager = FormManager::get_instance(); $forms = $form_manager->get_forms( NGG_DISPLAY_SETTINGS_SLUG, true ); // Display each form. foreach ( $forms as $form ) { // Enqueue the form's static resources. $form->enqueue_static_resources(); // Determine which classes to use for the form's "class" attribute. $model = $form->get_model(); if ( null === $model ) { continue; } $current = $this->is_displayed_gallery_using_display_type( $model->name ); $css_class = $current ? 'display_settings_form' : 'display_settings_form hidden'; $defaults = $model->settings; // If this form is used to provide the display settings for the current // displayed gallery, then we need to override the forms settings // with the displayed gallery settings. if ( $current ) { $settings = $this->parent->array_merge_assoc( $model->settings, $this->displayed_gallery->display_settings, true ); $model->settings = $settings; } // Output the display settings form. $view = new View( 'AttachToPost/display_settings_form', [ 'settings' => $form->render(), 'display_type_name' => $model->name, 'css_class' => $css_class, 'defaults' => $defaults, ], 'photocrati-attach_to_post#display_settings_form' ); $retval[] = $view->render( true ); } // In addition, we'll render a form that will be displayed when no display type has been selected in the // Attach to Post interface. Render the default "no display type selected" view. $css_class = $this->_get_selected_display_type_name() ? 'display_settings_form hidden' : 'display_settings_form'; $view = new View( 'AttachToPost/no_display_type_selected', [ 'no_display_type_selected' => \__( 'No display type selected', 'nggallery' ), 'css_class' => $css_class, ], 'photocrati-attach_to_post#no_display_type_selected' ); $retval[] = $view->render( true ); // Return all display setting forms. return implode( "\n", $retval ); } /** * Renders the tab used to preview included images * * @return array */ public function _render_preview_tab() { return [ 'id' => 'preview_tab', 'title' => \__( 'Sort or Exclude Images', 'nggallery' ), 'content' => $this->_render_preview_tab_contents(), ]; } /** * Renders the contents of the "Preview" tab. * * @return string */ public function _render_preview_tab_contents() { $view = new View( 'AttachToPost/preview_tab', [], 'photocrati-attach_to_post#preview_tab' ); return $view->render( true ); } } PK ! ں EventPublisher.phpnu [ setting_name = Settings::get_instance()->get( 'frame_event_cookie_name' ); } public function register_hooks() { add_action( 'init', [ $this, 'register_script' ] ); add_filter( 'ngg_admin_script_handles', [ $this, 'add_script_to_ngg_pages' ] ); add_action( 'ngg_enqueue_frame_event_publisher_script', [ $this, 'enqueue_script' ] ); // Elementor's editor.php runs `new \WP_Scripts()` which requires we register scripts on both init and this // action if we want the attach-to-post code to function (which relies on frame_event_publisher). add_action( 'elementor/editor/before_enqueue_scripts', [ $this, 'register_script' ] ); // Emit frame communication events. if ( $this->does_request_require_frame_communication() ) { add_action( 'ngg_created_new_gallery', [ $this, 'new_gallery_event' ] ); add_action( 'ngg_after_new_images_added', [ $this, 'images_added_event' ] ); add_action( 'ngg_page_event', [ $this, 'nextgen_page_event' ] ); add_action( 'ngg_manage_tags', [ $this, 'manage_tags_event' ] ); } } public static function get_instance() { if ( ! isset( self::$instance ) ) { self::$instance = new EventPublisher(); } return self::$instance; } /** * Encodes data for a setting * * @param array $data * @return string */ protected function encode( $data ) { return \rawurlencode( \json_encode( $data ) ); } /** * Decodes data from a setting * * @param string $data * @return array */ protected function decode( $data ) { return (array) \json_decode( \rawurldecode( $data ) ); } /** * Adds a setting to the frame events * * @param array $data * @return array */ public function add_event( $data ) { $id = \md5( \serialize( $data ) ); $data['context'] = 'attach_to_post'; $write_cookie = true; if ( \defined( 'XMLRPC_REQUEST' ) ) { $write_cookie = XMLRPC_REQUEST == false; } if ( $write_cookie ) { \setrawcookie( $this->setting_name . '_' . $id, $this->encode( $data ), \time() + 10800, '/', \parse_url( \site_url(), PHP_URL_HOST ) ); } return $data; } /* TODO: Determine if this is necessary and remove it */ public function add_script_to_ngg_pages( $scripts ) { $scripts['frame_event_publisher'] = NGG_SCRIPT_VERSION; return $scripts; } public function enqueue_script() { wp_enqueue_script( 'frame_event_publisher' ); wp_localize_script( 'frame_event_publisher', 'frame_event_publisher_domain', [ parse_url( site_url(), PHP_URL_HOST ) ] ); } public function register_script() { wp_register_script( 'frame_event_publisher', StaticAssets::get_url( 'IGW/frame_event_publisher.js', 'photocrati-frame_communication#frame_event_publisher.js' ), [ 'jquery' ], NGG_SCRIPT_VERSION ); } public function does_request_require_frame_communication(): bool { // phpcs:ignore WordPress.Security.NonceVerification.Recommended return ( strpos( $_SERVER['REQUEST_URI'], 'attach_to_post' ) !== false or ( isset( $_SERVER['HTTP_REFERER'] ) && strpos( $_SERVER['HTTP_REFERER'], 'attach_to_post' ) !== false ) or array_key_exists( 'attach_to_post', $_REQUEST ) ); } /** * Notify frames that a new gallery has been created * * @param int $gallery_id */ public function new_gallery_event( $gallery_id ) { $gallery = GalleryMapper::get_instance()->find( $gallery_id ); if ( $gallery ) { $this->add_event( [ 'event' => 'new_gallery', 'gallery_id' => intval( $gallery_id ), 'gallery_title' => $gallery->title, ] ); } } /** * Notifies a frame that images have been added to a gallery * * @param int $gallery_id * @param array $image_ids */ public function images_added_event( $gallery_id, $image_ids = [] ) { $this->add_event( [ 'event' => 'images_added', 'gallery_id' => intval( $gallery_id ), ] ); } /** * Notifies a frame that an action has been performed on a particular NextGEN page * * @param array $event */ public function nextgen_page_event( $event ) { $this->add_event( $event ); } /** * Notifies a frame that the tags have changed * * @param array $tags */ public function manage_tags_event( $tags = [] ) { $this->add_event( [ 'event' => 'manage_tags', 'tags' => $tags, ] ); } } PK ! w[9 9 Marketing.phpnu [ $id, 'default_source' => 'galleries', 'entity_types' => [ 'image' ], 'hidden_from_igw' => false, 'hidden_from_ui' => false, 'name' => $name, 'title' => $title, 'preview_image_url' => $preview_mvc_path ? StaticAssets::get_url( $preview_mvc_path ) : '', ]; } public function get_pro_display_types() { return [ $this->new_pro_display_type_upsell( -1, 'pro-tile', __( 'Pro Tile', 'nggallery' ), 'IGW/Marketing/pro-tile-preview.jpg' ), $this->new_pro_display_type_upsell( -2, 'pro-mosaic', __( 'Pro Mosaic', 'nggallery' ), 'IGW/Marketing/pro-mosaic-preview.jpg' ), $this->new_pro_display_type_upsell( -3, 'pro-masonry', __( 'Pro Masonry', 'nggallery' ), 'IGW/Marketing/pro-masonry-preview.jpg' ), $this->new_pro_display_type_upsell( -4, 'igw-promo' ), ]; } public function get_marketing_cards() { $pro_tile = new \C_Marketing_Block_Popup( __( 'Pro Tile Gallery', 'nggallery' ), \M_Marketing::get_i18n_fragment( 'feature_not_available', __( 'the Pro Tile Gallery', 'nggallery' ) ), \M_Marketing::get_i18n_fragment( 'lite_coupon' ), StaticAssets::get_url( 'IGW/Marketing/pro-tile-preview.jpg' ), 'igw', 'tiledgallery' ); $pro_masonry = new \C_Marketing_Block_Popup( __( 'Pro Masonry Gallery', 'nggallery' ), \M_Marketing::get_i18n_fragment( 'feature_not_available', __( 'the Pro Masonry Gallery', 'nggallery' ) ), \M_Marketing::get_i18n_fragment( 'lite_coupon' ), StaticAssets::get_url( 'IGW/Marketing/pro-masonry-preview.jpg' ), 'igw', 'masonrygallery' ); $pro_mosaic = new \C_Marketing_Block_Popup( __( 'Pro Mosaic Gallery', 'nggallery' ), \M_Marketing::get_i18n_fragment( 'feature_not_available', __( 'the Pro Mosaic Gallery', 'nggallery' ) ), \M_Marketing::get_i18n_fragment( 'lite_coupon' ), StaticAssets::get_url( 'IGW/Marketing/pro-mosaic-preview.jpg' ), 'igw', 'mosaicgallery' ); return [ 'pro-tile' => '
' . _( 'Invalid Displayed Gallery' ) . '
'; if ( $displayed_gallery ) { $retval = ''; $renderer = Renderer::get_instance(); if ( defined( 'NGG_SHOW_DISPLAYED_GALLERY_ERRORS' ) && NGG_SHOW_DISPLAYED_GALLERY_ERRORS && ! $displayed_gallery->is_valid() ) { $retval .= var_export( $displayed_gallery->validation(), true ); } if ( self::$substitute_placeholders ) { $retval .= $renderer->render( $displayed_gallery, true ); } } $content = str_replace( $match[0], $retval, $content ); } } return $content; } /** * Enqueues static resources required by the Attach-To-Post interface */ public function enqueue_static_resources() { // Enqueue resources needed at post/page level. if ( $this->is_new_or_edit_post_screen() ) { \wp_enqueue_script( 'nextgen_admin_js' ); \wp_enqueue_style( 'nextgen_admin_css' ); \wp_enqueue_script( 'frame_event_publisher' ); DisplayManager::enqueue_fontawesome(); \wp_register_script( 'Base64', StaticAssets::get_url( 'AttachToPost/base64.js', 'photocrati-attach_to_post#base64.js' ), [], NGG_SCRIPT_VERSION ); \wp_enqueue_style( 'ngg_attach_to_post_dialog', StaticAssets::get_url( 'AttachToPost/attach_to_post_dialog.css', 'photocrati-attach_to_post#attach_to_post_dialog.css' ), [ 'gritter' ], NGG_SCRIPT_VERSION ); \wp_enqueue_script( 'ngg-igw', StaticAssets::get_url( 'AttachToPost/igw.js', 'photocrati-attach_to_post#igw.js' ), [ 'jquery', 'Base64', 'gritter' ], NGG_SCRIPT_VERSION ); \wp_localize_script( 'ngg-igw', 'ngg_igw_i18n', [ 'nextgen_gallery' => \__( 'NextGEN Gallery', 'nggallery' ), 'edit' => \__( 'Edit', 'nggallery' ), 'remove' => \__( 'Delete', 'nggallery' ), ] ); // Nonce verification is not necessary here: we are only enqueueing resources for the IGW iframe children. // phpcs:disable WordPress.Security.NonceVerification.Recommended } elseif ( isset( $_REQUEST['attach_to_post'] ) || isset( $_REQUEST['nextgen-attach_to_post'] ) || ( isset( $_REQUEST['page'] ) && false !== strpos( $_REQUEST['page'], 'nggallery' ) ) ) { // phpcs:enable WordPress.Security.NonceVerification.Recommended \wp_enqueue_script( 'iframely', StaticAssets::get_url( 'AttachToPost/iframely.js', 'photocrati-attach_to_post#iframely.js' ), [], NGG_SCRIPT_VERSION ); \wp_enqueue_style( 'iframely', StaticAssets::get_url( 'AttachToPost/iframely.css', 'photocrati-attach_to_post#iframely.css' ), [], NGG_SCRIPT_VERSION ); \wp_enqueue_style( 'nextgen_addgallery_page' ); \wp_enqueue_style( 'ngg_marketing_blocks_style' ); \wp_enqueue_style( 'uppy' ); \wp_enqueue_script( 'nextgen_admin_js' ); \wp_enqueue_style( 'nextgen_admin_css' ); } } public function is_new_or_edit_post_screen() { return preg_match( '/\/wp-admin\/(post|post-new|site-editor)\.php$/', $_SERVER['SCRIPT_NAME'] ); } public function can_use_tinymce() { $checks = [ Security::is_allowed( 'NextGEN Attach Interface' ), Security::is_allowed( 'NextGEN Use TinyMCE' ), \get_user_option( 'rich_editing' ) == 'true', ]; return ! in_array( false, $checks ); } /** * Enqueues resources needed by the TinyMCE editor */ public function enqueue_tinymce_resources() { if ( $this->is_new_or_edit_post_screen() ) { \add_editor_style( 'https://fonts.googleapis.com/css?family=Lato' ); \add_editor_style( StaticAssets::get_url( 'AttachToPost/ngg_attach_to_post_tinymce_plugin.css', 'photocrati-attach_to_post#ngg_attach_to_post_tinymce_plugin.css' ) ); \wp_enqueue_script( 'photocrati_ajax' ); \wp_localize_script( 'media-editor', 'igw', [ 'url' => \admin_url( '/?' . NGG_ATTACH_TO_POST_SLUG . '=1' ), ] ); \wp_localize_script( 'photocrati_ajax', 'ngg_tinymce_plugin', [ 'url' => add_query_arg( 'ver', NGG_SCRIPT_VERSION, StaticAssets::get_url( 'AttachToPost/ngg_attach_to_post_tinymce_plugin.js', 'photocrati-attach_to_post#ngg_attach_to_post_tinymce_plugin.js' ) ), 'i18n' => [ 'button_label' => \__( 'Add NextGEN Gallery', 'nggallery' ), ], 'name' => $this->attach_to_post_tinymce_plugin, 'nonce' => \wp_create_nonce( 'ngg_attach_to_post_iframe' ), ] ); } } /** * Adds a TinyMCE button for the Attach To Post plugin * * @param array $buttons * @return array */ public function add_attach_to_post_button( $buttons ) { if ( $this->can_use_tinymce() ) { array_push( $buttons, 'separator', $this->attach_to_post_tinymce_plugin ); } return $buttons; } /** * Adds the Attach To Post TinyMCE plugin * * @param array $plugins * @return array * @uses mce_external_plugins filter */ public function add_attach_to_post_tinymce_plugin( $plugins ) { if ( $this->can_use_tinymce() ) { $plugins[ $this->attach_to_post_tinymce_plugin ] = \add_query_arg( 'ver', NGG_SCRIPT_VERSION, StaticAssets::get_url( 'AttachToPost/ngg_attach_to_post_tinymce_plugin.js', 'photocrati-attach_to_post#ngg_attach_to_post_tinymce_plugin.js' ) ); } return $plugins; } /** * Adds the Attach To Post TinyMCE i18n strings * * @param $mce_translation * @return mixed */ public function add_attach_to_post_tinymce_i18n( $mce_translation ) { $mce_translation['ngg_attach_to_post.title'] = \__( 'Attach NextGEN Gallery to Post', 'nggallery' ); return $mce_translation; } } PK ! ?ۿ frame_event_publisher.jsnu [ (function(g,f){'use strict';var h=function(e){if("object"!==typeof e.document)throw Error("Cookies.js requires a `window` with a `document` object");var b=function(a,d,c){return 1===arguments.length?b.get(a):b.set(a,d,c)};b._document=e.document;b._cacheKeyPrefix="cookey.";b._maxExpireDate=new Date("Fri, 31 Dec 9999 23:59:59 UTC");b.defaults={path:"/",secure:!1};b.get=function(a){b._cachedDocumentCookie!==b._document.cookie&&b._renewCache();a=b._cache[b._cacheKeyPrefix+a];return a===f?f:decodeURIComponent(a)}; b.set=function(a,d,c){c=b._getExtendedOptions(c);c.expires=b._getExpiresDate(d===f?-1:c.expires);b._document.cookie=b._generateCookieString(a,d,c);return b};b.expire=function(a,d){return b.set(a,f,d)};b._getExtendedOptions=function(a){return{path:a&&a.path||b.defaults.path,domain:a&&a.domain||b.defaults.domain,expires:a&&a.expires||b.defaults.expires,secure:a&&a.secure!==f?a.secure:b.defaults.secure}};b._isValidDate=function(a){return"[object Date]"===Object.prototype.toString.call(a)&&!isNaN(a.getTime())}; b._getExpiresDate=function(a,d){d=d||new Date;"number"===typeof a?a=Infinity===a?b._maxExpireDate:new Date(d.getTime()+1E3*a):"string"===typeof a&&(a=new Date(a));if(a&&!b._isValidDate(a))throw Error("`expires` parameter cannot be converted to a valid Date instance");return a};b._generateCookieString=function(a,b,c){a=a.replace(/[^#$&+\^`|]/g,encodeURIComponent);a=a.replace(/\(/g,"%28").replace(/\)/g,"%29");b=(b+"").replace(/[^!#$&-+\--:<-\[\]-~]/g,encodeURIComponent);c=c||{};a=a+"="+b+(c.path?";path="+ c.path:"");a+=c.domain?";domain="+c.domain:"";a+=c.expires?";expires="+c.expires.toUTCString():"";return a+=c.secure?";secure":""};b._getCacheFromString=function(a){var d={};a=a?a.split("; "):[];for(var c=0;c