Viewing 2 replies - 1 through 2 (of 2 total)
  • Thread Starter ltdxdtl

    (@ltdxdtl)

    I got a reply through email with NextGens Wonderful support. And they replied:

    “There appears to be an issue within your theme or one of your other active plugins that is causing our XHTML compliant <img> tag placeholder to be written as an HTML (only) compliant <img> tag.

    We believe we have sorted out this issue and the corrections will be in the next release of NextGEN Gallery. In the meantime I am attaching a patch/replacement file that should sort this out immediately.

    Please replace the existing file located at ../wp-content/plugins/nextgen-gallery/products/photocrati_nextgen/modules/attach_to_post/module.attach_to_post.php with the attached file.”

    File Contains:

    <?php
    /**
     {
    	Module:		photocrati-attach_to_post,
    	Depends:	{ photocrati-nextgen_gallery_display }
     }
     */
    
    define('NGG_ATTACH_TO_POST_SLUG', 'nextgen-attach_to_post');
    
    class M_Attach_To_Post extends C_Base_Module
    {
    	var $attach_to_post_tinymce_plugin  = 'NextGEN_AttachToPost';
        var $_event_publisher               = NULL;
    
    	/**
    	 * Defines the module
    	 * @param string|bool $context
    	 */
        function define($context=FALSE)
        {
            parent::define(
    			'photocrati-attach_to_post',
    			'Attach To Post',
    			'Provides the "Attach to Post" interface for displaying galleries and albums',
    			'0.10',
    			'https://www.nextgen-gallery.com',
    			'Photocrati Media',
    			'https://www.photocrati.com',
    		    $context
    		);
    
    		include_once('class.attach_to_post_option_handler.php');
    		C_NextGen_Settings::get_instance()->add_option_handler('C_Attach_To_Post_Option_Handler', array(
    			'attach_to_post_url',
    			'gallery_preview_url',
    			'attach_to_post_display_tab_js_url'
    		));
            if (is_multisite()) C_NextGen_Global_Settings::get_instance()->add_option_handler('C_Attach_To_Post_Option_Handler', array(
                'attach_to_post_url',
                'gallery_preview_url',
                'attach_to_post_display_tab_js_url'
            ));
    
    		include_once('class.attach_to_post_installer.php');
    		C_Photocrati_Installer::add_handler($this->module_id, 'C_Attach_To_Post_Installer');
    
            // Set WP_ADMIN=true for better compatibility with certain themes & plugins.
            // Unfortunately as of 3.9 in a multisite environment this causes problems.
            if (self::is_atp_url() && (!defined('MULTISITE') || (defined('MULTISITE') && !MULTISITE)))
                define('WP_ADMIN', true);
        }
    
        // We only register our display-type settings forms when IS_ADMIN, but WordPress 3.9 introduced a problem
        // with doing this on multisite sub-sites. Now we register our forms when is_atp_url() is true OR is_admin()
        static function is_atp_url()
        {
            return (strpos(strtolower($_SERVER['REQUEST_URI']), '/nextgen-attach_to_post') !== false) ? TRUE : FALSE;
        }
    
        /**
         * Gets the Frame Event Publisher
         * @return C_Component
         */
        function _get_frame_event_publisher()
        {
            if (is_null($this->_event_publisher)) {
                $this->_event_publisher = $this->get_registry()->get_utility('I_Frame_Event_Publisher', 'attach_to_post');
            }
    
            return $this->_event_publisher;
        }
    
    	/**
    	 * Registers requires the utilites that this module provides
    	 */
    	function _register_utilities()
    	{
    		// This utility provides a controller that renders the
    		// Attach to Post interface, used to manage Displayed Galleries
    		$this->get_registry()->add_utility(
    			'I_Attach_To_Post_Controller',
    			'C_Attach_Controller'
    //			'C_Attach_To_Post_Proxy_Controller'
    		);
    	}
    
    	/**
    	 * Registers the adapters that this module provides
    	 */
    	function _register_adapters()
    	{
    		// Installs the Attach to Post module
    		$this->get_registry()->add_adapter(
    			'I_Installer', 'A_Attach_To_Post_Installer'
    		);
    
    		// Provides routing for the Attach To Post interface
    		$this->get_registry()->add_adapter(
    			'I_Router', 'A_Attach_To_Post_Routes'
    		);
    
    		// Provides AJAX actions for the Attach To Post interface
    		$this->get_registry()->add_adapter(
    			'I_Ajax_Controller',   'A_Attach_To_Post_Ajax'
    		);
    
    		// Applies a post hook to the generate_thumbnail method of the
    		// gallery storage component
    		$this->get_registry()->add_adapter(
    			'I_Gallery_Storage', 'A_Gallery_Storage_Frame_Event'
    		);
    	}
    
    	function _register_hooks()
    	{
    		if (is_admin()) {
    			add_action(
    				'admin_enqueue_scripts',
    				array(&$this, 'enqueue_static_resources'),
    				1
    			);
    		}
    
    		// Add hook to delete displayed galleries when removed from a post
    		add_action('pre_post_update', array(&$this, 'locate_stale_displayed_galleries'));
    		add_action('before_delete_post', array(&$this, 'locate_stale_displayed_galleries'));
    		add_action('post_updated',	array(&$this, 'cleanup_displayed_galleries'));
    		add_action('after_delete_post', array(&$this, 'cleanup_displayed_galleries'));
    
    		// Add hook to subsitute displayed gallery placeholders
    		add_filter('the_content', array(&$this, 'substitute_placeholder_imgs'), PHP_INT_MAX, 1);
    
    		// Emit frame communication events
    		add_action('ngg_created_new_gallery',	array(&$this, 'new_gallery_event'));
    		add_action('ngg_after_new_images_added',array(&$this, 'images_added_event'));
    		add_action('ngg_page_event',			array(&$this, 'nextgen_page_event'));
            add_action('ngg_manage_tags',           array(&$this, 'manage_tags_event'));
    
            // We use two hooks here because we need it to execute for both the post-new.php
            // page and ATP interface
            add_action('plugins_loaded',            array(&$this, 'fix_ie11'), 1);
            add_action('admin_init',                array(&$this, 'fix_ie11'), PHP_INT_MAX-1);
            add_action('admin_enqueue_scripts',     array(&$this, 'fix_ie11'), 1);
            add_action('admin_enqueue_scripts',     array(&$this, 'fix_ie11'), PHP_INT_MAX-1);
    	}
    
        /**
         * WordPress sets the X-UA-Compatible header to IE=edge. Unfortunately, this causes problems with Plupload,
         * so we have the send this header
         */
        function fix_ie11()
        {
            if ((array_search('attach_to_post', array_keys($_REQUEST)) !== FALSE OR strpos($_SERVER['REQUEST_URI'], NGG_ATTACH_TO_POST_SLUG) !== FALSE OR strpos($_SERVER['REQUEST_URI'], 'wp-admin/post.php') !== FALSE OR strpos($_SERVER['REQUEST_URI'], 'wp-admin/post-new.php') !== FALSE)) {
                if (!headers_sent()) {
                    header('X-UA-Compatible: IE=EmulateIE10');
                }
            }
        }
    
    	/**
         * Substitutes the gallery placeholder content with the gallery type frontend
         * view, returns a list of static resources that need to be loaded
         * @param string $content
         */
        function substitute_placeholder_imgs($content)
        {
            $mapper = $this->get_registry()->get_utility('I_Displayed_Gallery_Mapper');
            // To match ATP entries we compare the stored url against a generic path; entries MUST have a gallery ID
            if (preg_match_all("#<img.*http(s)?://(.*)/nextgen-attach_to_post/preview/id--(\\d+).*>#mi", $content, $matches, PREG_SET_ORDER)) {
    			foreach ($matches as $match) {
    				// Find the displayed gallery
    				$displayed_gallery_id = $match[3];
    				$displayed_gallery = $mapper->find($displayed_gallery_id, TRUE);
    
    				// Get the content for the displayed gallery
    				$retval = '<p>'._('Invalid Displayed Gallery').'</p>';
    				if ($displayed_gallery) {
    					$renderer = $this->get_registry()->get_utility('I_Displayed_Gallery_Renderer');
    					$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
    	 */
    	function enqueue_static_resources()
    	{
    		$router = $this->get_registry()->get_utility('I_Router');
    
    		// Enqueue resources needed at post/page level
    		if (preg_match("/\/wp-admin\/(post|post-new)\.php$/", $_SERVER['SCRIPT_NAME'])) {
    			$this->_enqueue_tinymce_resources();
    			wp_enqueue_style(
    				'ngg_attach_to_post_dialog', $router->get_static_url('photocrati-attach_to_post#attach_to_post_dialog.css')
    			);
    		}
    
    		elseif (isset($_REQUEST['attach_to_post']) OR
    		  (isset($_REQUEST['page']) && strpos($_REQUEST['page'], 'nggallery') !== FALSE)) {
    			wp_enqueue_script('iframely', $router->get_static_url('photocrati-attach_to_post#iframely.js'));
    			wp_enqueue_style('iframely',  $router->get_static_url('photocrati-attach_to_post#iframely.css'));
    		}
    	}
    
    	/**
    	 * Enqueues resources needed by the TinyMCE editor
    	 */
    	function _enqueue_tinymce_resources()
    	{
            wp_localize_script(
    			'media-editor',
    			'nextgen_gallery_attach_to_post_url',
    			C_NextGen_Settings::get_instance()->attach_to_post_url
    		);
    
    		// Registers our tinymce button and plugin for attaching galleries
            $security   = $this->get_registry()->get_utility('I_Security_Manager');
            $sec_actor  = $security->get_current_actor();
            $checks = array(
                $sec_actor->is_allowed('NextGEN Attach Interface'),
                $sec_actor->is_allowed('NextGEN Use TinyMCE')
            );
            if (!in_array(FALSE, $checks)) {
                if (get_user_option('rich_editing') == 'true') {
                    add_filter('mce_buttons', array(&$this, 'add_attach_to_post_button'));
                    add_filter('mce_external_plugins', array(&$this, 'add_attach_to_post_tinymce_plugin'));
                    add_filter('wp_mce_translation', array($this, 'add_attach_to_post_tinymce_i18n'));
                }
            }
    	}
    
    	/**
    	 * Adds a TinyMCE button for the Attach To Post plugin
    	 * @param array $buttons
    	 * @returns array
    	 */
    	function add_attach_to_post_button($buttons)
    	{
    		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
    	 */
    	function add_attach_to_post_tinymce_plugin($plugins)
    	{
            global $wp_version;
            $router = $this->get_registry()->get_utility('I_Router');
    
            if ($wp_version >= 3.9)
                $file = $router->get_static_url('photocrati-attach_to_post#ngg_attach_to_post_tinymce_plugin.js');
            else
                $file = $router->get_static_url('photocrati-attach_to_post#ngg_attach_to_post_tinymce_plugin_wp38_compat.js');
    
    		$plugins[$this->attach_to_post_tinymce_plugin] = $file;
    		return $plugins;
    	}
    
        /**
         * Adds the Attach To Post TinyMCE i18n strings
         * @param $mce_translation
         * @return mixed
         */
        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;
        }
    
    	/**
    	 * Locates the ids of displayed galleries that have been
    	 * removed from the post, and flags then for cleanup (deletion)
    	 * @global array $displayed_galleries_to_cleanup
    	 * @param int $post_id
    	 */
    	function locate_stale_displayed_galleries($post_id)
    	{
    		global $displayed_galleries_to_cleanup;
    		$displayed_galleries_to_cleanup	= array();
    		$post							= get_post($post_id);
    		$gallery_preview_url			= C_NextGen_Settings::get_instance()->get('gallery_preview_url');
    		$preview_url = preg_quote($gallery_preview_url, '#');
    		if (preg_match_all("#{$preview_url}/id--(\d+)#", html_entity_decode($post->post_content), $matches, PREG_SET_ORDER)) {
    			foreach ($matches as $match) {
    				$preview_url = preg_quote($match[0], '/');
    				// The post was edited, and the displayed gallery placeholder was removed
    				if (isset($_REQUEST['post_content']) && (!preg_match("/{$preview_url}/", $_POST['post_content']))) {
    					$displayed_galleries_to_cleanup[] = intval($match[1]);
    				}
    				// The post was deleted
    				elseif (!isset($_REQUEST['action'])) {
    					$displayed_galleries_to_cleanup[] = intval($match[1]);
    				}
    			}
    		}
    	}
    
    	/**
    	 * Deletes any displayed galleries that are no longer associated with
    	 * a post/page
    	 * @global array $displayed_galleries_to_cleanup
    	 * @param int $post_id
    	 */
    	function cleanup_displayed_galleries($post_id)
    	{
    		global $displayed_galleries_to_cleanup;
    		$mapper = $this->get_registry()->get_utility('I_Displayed_Gallery_Mapper');
    		foreach ($displayed_galleries_to_cleanup as $id) $mapper->destroy($id);
    	}
    
    	/**
    	 * Notify frames that a new gallery has been created
    	 * @param int $gallery_id
    	 */
    	function new_gallery_event($gallery_id)
    	{
            $gallery = $this->get_registry()->get_utility('I_Gallery_Mapper')->find($gallery_id);
    		if ($gallery) {
    			$this->_get_frame_event_publisher()->add_event(array(
    				'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
    	 */
    	function images_added_event($gallery_id, $image_ids=array())
    	{
            $this->_get_frame_event_publisher()->add_event(array(
    			'event'			=>	'images_added',
    			'gallery_id'		=>	intval($gallery_id)
    		));
    	}
    
        /**
         * Notifies a frame that the tags have changed
         *
         * @param array $tags
         */
        function manage_tags_event($tags = array())
        {
            $this->_get_frame_event_publisher()->add_event(array(
                'event' => 'manage_tags',
                'tags' => $tags
            ));
        }
    
    	/**
    	 * Notifies a frame that an action has been performed on a particular
    	 * NextGEN page
    	 * @param array $event
    	 */
    	function nextgen_page_event($event)
    	{
            $this->_get_frame_event_publisher()->add_event($event);
    	}
    
        function get_type_list()
        {
            return array(
                'A_Attach_To_Post_Ajax' => 'adapter.attach_to_post_ajax.php',
                'C_Attach_To_Post_Installer' => 'class.attach_to_post_installer.php',
                'A_Attach_To_Post_Routes' => 'adapter.attach_to_post_routes.php',
                'A_Gallery_Storage_Frame_Event' => 'adapter.gallery_storage_frame_event.php',
                'C_Attach_Controller' => 'class.attach_controller.php',
    			'C_Attach_To_Post_Proxy_Controller' => 'class.attach_to_post_proxy_controller.php',
                'I_Attach_To_Post_Controller' => 'interface.attach_to_post_controller.php',
                'Mixin_Attach_To_Post_Display_Tab' => 'mixin.attach_to_post_display_tab.php'
            );
        }
    }
    
    new M_Attach_To_Post();
    Plugin Contributor photocrati

    (@photocrati)

    @ltdxdtl – Thanks for your update although it is generally preferred that large code examples (such as this one) are best linked to (such as a pastebin or gist) rather than posting them to the forums themselves.

    – Cais.

Viewing 2 replies - 1 through 2 (of 2 total)
  • The topic ‘NextGen Suddenly stopped working – 1 Thumbnail Only’ is closed to new replies.