377 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			377 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
namespace ShortPixel;
 | 
						|
 | 
						|
if ( ! defined( 'ABSPATH' ) ) {
 | 
						|
 exit; // Exit if accessed directly.
 | 
						|
}
 | 
						|
 | 
						|
use ShortPixel\Notices\NoticeController as Notice;
 | 
						|
use ShortPixel\ShortPixelLogger\ShortPixelLogger as Log;
 | 
						|
 | 
						|
use ShortPixel\Model\File\DirectoryOtherMediaModel as DirectoryOtherMediaModel;
 | 
						|
use ShortPixel\Controller\OtherMediaController as OtherMediaController;
 | 
						|
use ShortPixel\Controller\AdminNoticesController as AdminNoticesController;
 | 
						|
 | 
						|
use ShortPixel\NextGenViewController as NextGenViewController;
 | 
						|
 | 
						|
// @integration NextGen Gallery
 | 
						|
class NextGenController
 | 
						|
{
 | 
						|
  protected static $instance;
 | 
						|
//  protected $view;
 | 
						|
	private $enableOverride = false; // when activating NG will not report active yet, but try to refresh folders. Do so.
 | 
						|
 | 
						|
// ngg_created_new_gallery
 | 
						|
  public function __construct()
 | 
						|
  {
 | 
						|
    add_filter('shortpixel/init/optimize_on_screens', array($this, 'add_screen_loads'));
 | 
						|
 | 
						|
    add_action('plugins_loaded', array($this, 'hooks'));
 | 
						|
    add_action('deactivate_nextgen-gallery/nggallery.php', array($this, 'resetNotification'));
 | 
						|
  }
 | 
						|
 | 
						|
  public function hooks()
 | 
						|
  {
 | 
						|
		$controller = new NextGenViewController();
 | 
						|
 | 
						|
    if ($this->optimizeNextGen()) // if optimization is on, hook.
 | 
						|
    {
 | 
						|
      add_action('ngg_update_addgallery_page', array( $this, 'addNextGenGalleriesToCustom'));
 | 
						|
      add_action('ngg_added_new_image', array($this,'handleImageUpload'));
 | 
						|
    }
 | 
						|
 | 
						|
    if ($this->has_nextgen())
 | 
						|
    {
 | 
						|
			add_action('ngg_delete_image', array($this, 'OnDeleteImage'),10, 2); // this works only on single images!
 | 
						|
 | 
						|
      add_action('shortpixel/othermedia/folder/load', array($this, 'loadFolder'), 10, 2);
 | 
						|
      // Off because this causes bad UX ( refresh folder but no images added)
 | 
						|
			//add_action('shortpixel/othermedia/addfiles', array($this, 'checkAddFiles'), 10, 3);
 | 
						|
 | 
						|
      add_filter( 'ngg_manage_images_columns', array( $controller, 'nggColumns' ) );
 | 
						|
      add_filter( 'ngg_manage_images_number_of_columns', array( $controller, 'nggCountColumns' ) );
 | 
						|
      add_filter( 'ngg_manage_images_column_7_header', array( $controller, 'nggColumnHeader' ) );
 | 
						|
      add_filter( 'ngg_manage_images_column_7_content', array( $this, 'loadNextGenItem' ), 10,2 );
 | 
						|
			add_filter('ngg_manage_gallery_fields', array($this, 'refreshFolderOnLoad'), 10, 2);
 | 
						|
 | 
						|
    }
 | 
						|
 | 
						|
  }
 | 
						|
 | 
						|
  // Use GetInstance, don't use the construct.
 | 
						|
  public static function getInstance()
 | 
						|
  {
 | 
						|
    if (is_null(self::$instance))
 | 
						|
      self::$instance = new NextGenController();
 | 
						|
 | 
						|
     return self::$instance;
 | 
						|
  }
 | 
						|
 | 
						|
  public function has_nextgen()
 | 
						|
  {
 | 
						|
     if (defined('NGG_PLUGIN'))
 | 
						|
      return true;
 | 
						|
     else
 | 
						|
       return false;
 | 
						|
  }
 | 
						|
 | 
						|
  public function optimizeNextGen()
 | 
						|
  {
 | 
						|
		 if (true === $this->enableOverride || \wpSPIO()->settings()->includeNextGen == 1)
 | 
						|
		 {
 | 
						|
		 	 return true;
 | 
						|
		 }
 | 
						|
 | 
						|
     return false;
 | 
						|
  }
 | 
						|
 | 
						|
  public function isNextGenScreen()
 | 
						|
  {
 | 
						|
      $screens = $this->add_screen_loads(array());
 | 
						|
			if (! is_admin())
 | 
						|
			{
 | 
						|
				 return false;
 | 
						|
			}
 | 
						|
			if (! function_exists('get_current_screen'))
 | 
						|
			{
 | 
						|
				 return false;
 | 
						|
			}
 | 
						|
			$screen_id = \wpSPIO()->env()->screen_id;
 | 
						|
 | 
						|
      if (in_array($screen_id, $screens))
 | 
						|
        return true;
 | 
						|
      else
 | 
						|
        return false;
 | 
						|
 | 
						|
  }
 | 
						|
 | 
						|
  /** called from settingController when enabling the nextGen settings */
 | 
						|
  public function enableNextGen($silent)
 | 
						|
  {
 | 
						|
		 $this->enableOverride = true;
 | 
						|
     $this->addNextGenGalleriesToCustom($silent);
 | 
						|
  }
 | 
						|
 | 
						|
 | 
						|
  public function add_screen_loads($use_screens)
 | 
						|
  {
 | 
						|
 | 
						|
    $use_screens[] = 'toplevel_page_nextgen-gallery'; // toplevel
 | 
						|
    $use_screens[] = 'nextgen-gallery_page_ngg_addgallery';  // add gallery
 | 
						|
    $use_screens[] = 'nextgen-gallery_page_nggallery-manage-album'; // manage album
 | 
						|
    $use_screens[] = 'nextgen-gallery_page_nggallery-manage-gallery'; // manage toplevel gallery
 | 
						|
    $use_screens[] = 'nggallery-manage-images'; // images in gallery overview
 | 
						|
 | 
						|
    return $use_screens;
 | 
						|
  }
 | 
						|
 | 
						|
  public function loadNextGenItem($unknown, $picture)
 | 
						|
  {
 | 
						|
       $viewController = new NextGenViewController();
 | 
						|
       $viewController->loadItem($picture);
 | 
						|
  }
 | 
						|
 | 
						|
	public function refreshFolderOnLoad($array, $gallery)
 | 
						|
	{
 | 
						|
		 $galleries = $this->getGalleries($gallery->gid);
 | 
						|
		 if (isset($galleries[0]))
 | 
						|
		 {
 | 
						|
			  $otherMedia = OtherMediaController::getInstance();
 | 
						|
			  $galleryFolder = $galleries[0];
 | 
						|
				$folder = $otherMedia->getFolderByPath($galleryFolder->getPath());
 | 
						|
				$folder->refreshFolder(true);
 | 
						|
		 }
 | 
						|
		 return $array;
 | 
						|
	}
 | 
						|
  /** Enables nextGen, add galleries to custom folders
 | 
						|
  * @param boolean $silent Throw a notice or not. This seems to be based if nextgen was already activated previously or not.
 | 
						|
  */
 | 
						|
  /*
 | 
						|
  public function nextGenEnabled($silent)
 | 
						|
  {
 | 
						|
    $this->addNextGenGalleriesToCustom($silent);
 | 
						|
  }  */
 | 
						|
 | 
						|
  /** Tries to find a nextgen gallery for a shortpixel folder.
 | 
						|
  * Purpose is to test if this folder is a nextgen gallery
 | 
						|
  * Problem is that NG stores folders in a short format, not from root while SPIO stores whole path
 | 
						|
  * Assumption: The last two directory names should lead to an unique gallery and if so, it's nextgen
 | 
						|
  * @param $id int Folder ID
 | 
						|
  * @param $directory DirectoryOtherMediaModel  Directory Object
 | 
						|
  */
 | 
						|
  public function loadFolder($id, $directory)
 | 
						|
  {
 | 
						|
      $path = $directory->getPath();
 | 
						|
			// No reason to check this?
 | 
						|
			if ($directory->get('status') == DirectoryOtherMediaModel::DIRECTORY_STATUS_NEXTGEN)
 | 
						|
			{	return;  }
 | 
						|
 | 
						|
      $path_split = array_filter(explode('/', $path));
 | 
						|
 | 
						|
      $searchPath = trailingslashit(implode('/', array_slice($path_split, -2, 2)));
 | 
						|
 | 
						|
      global $wpdb;
 | 
						|
      $sql = "SELECT gid FROM {$wpdb->prefix}ngg_gallery WHERE path LIKE %s";
 | 
						|
      $sql = $wpdb->prepare($sql, '%' . $searchPath . '');
 | 
						|
      $gid = $wpdb->get_var($sql);
 | 
						|
 | 
						|
 | 
						|
      if (! is_null($gid) && is_numeric($gid))
 | 
						|
			{
 | 
						|
        $res = $directory->set('status', DirectoryOtherMediaModel::DIRECTORY_STATUS_NEXTGEN);
 | 
						|
				$directory->save();
 | 
						|
				//echo $gid;
 | 
						|
			}
 | 
						|
  }
 | 
						|
 | 
						|
	/** Hook. If there is a refreshFolder action on a nextGen Directory, but the optimize Nextgen setting is off, it should not add those files to the custom Media */
 | 
						|
	public function checkAddFiles($bool, $files, $dirObj)
 | 
						|
	{
 | 
						|
			// Nothing nextgen.
 | 
						|
			if ($dirObj->get('is_nextgen') === false)
 | 
						|
		  {
 | 
						|
				 return $bool;
 | 
						|
			}
 | 
						|
 | 
						|
			// If it's nextgen, but the setting is not on, reject those files.
 | 
						|
			if ($this->optimizeNextGen() === false)
 | 
						|
			{
 | 
						|
				 	return false;
 | 
						|
			}
 | 
						|
 | 
						|
			return $bool;
 | 
						|
	}
 | 
						|
 | 
						|
  /* @return DirectoryModel */
 | 
						|
  public function getGalleries($id = null)
 | 
						|
  {
 | 
						|
    global $wpdb;
 | 
						|
    $fs = \wpSPIO()->filesystem();
 | 
						|
    $homepath = $fs->getWPFileBase();
 | 
						|
 | 
						|
		$sql = "SELECT path FROM {$wpdb->prefix}ngg_gallery";
 | 
						|
		if (! is_null($id))
 | 
						|
		{
 | 
						|
			 $sql .= ' WHERE gid = %d';
 | 
						|
			 $sql = $wpdb->prepare($sql, $id);
 | 
						|
		}
 | 
						|
    $result = $wpdb->get_results($sql);
 | 
						|
 | 
						|
    $galleries = array();
 | 
						|
 | 
						|
    foreach($result as $row)
 | 
						|
    {
 | 
						|
      $directory = $fs->getDirectory($homepath->getPath() . $row->path);
 | 
						|
      if ($directory->exists())
 | 
						|
        $galleries[] = $directory;
 | 
						|
    }
 | 
						|
 | 
						|
    return $galleries;
 | 
						|
  }
 | 
						|
 | 
						|
  /** Adds nextGen galleries to custom table
 | 
						|
  * Note - this function does *Not* check if nextgen is enabled, not if checks custom Tables. Use nextgenEnabled for this.
 | 
						|
  * Enabled checks are not an external class issue, so must be done before calling.
 | 
						|
  */
 | 
						|
   public function addNextGenGalleriesToCustom($silent = true) {
 | 
						|
      $fs = \wpSPIO()->filesystem();
 | 
						|
      $homepath = $fs->getWPFileBase();
 | 
						|
 | 
						|
      //add the NextGen galleries to custom folders
 | 
						|
      $ngGalleries = $this->getGalleries(); // DirectoryModel return.
 | 
						|
 | 
						|
      $otherMedia = OtherMediaController::getInstance();
 | 
						|
 | 
						|
      foreach($ngGalleries as $gallery)
 | 
						|
			{
 | 
						|
          $folder = $otherMedia->getFolderByPath($gallery->getPath());
 | 
						|
 | 
						|
          if ($folder->get('in_db') === true)
 | 
						|
          {
 | 
						|
						if ($folder->get('status') !== 1)
 | 
						|
						{
 | 
						|
							 $folder->set('status', DirectoryOtherMediaModel::DIRECTORY_STATUS_NEXTGEN);
 | 
						|
							 $folder->save();
 | 
						|
						}
 | 
						|
            continue;
 | 
						|
          }
 | 
						|
					else
 | 
						|
					{
 | 
						|
						// Try to silently fail this if directory is not allowed.
 | 
						|
						if (false === $folder->checkDirectory(true))
 | 
						|
						{
 | 
						|
							continue;
 | 
						|
						}
 | 
						|
          	$directory = $otherMedia->addDirectory($gallery->getPath());
 | 
						|
						if (! $directory)
 | 
						|
						{
 | 
						|
							Log::addWarn('Could not add this directory' . $gallery->getPath() );
 | 
						|
						}
 | 
						|
						else
 | 
						|
						{
 | 
						|
							 $directory->set('status', DirectoryOtherMediaModel::DIRECTORY_STATUS_NEXTGEN);
 | 
						|
							 $directory->save();
 | 
						|
						}
 | 
						|
					}
 | 
						|
 | 
						|
 | 
						|
      }
 | 
						|
 | 
						|
      if (count($ngGalleries) > 0)
 | 
						|
      {
 | 
						|
        // put timestamp to this setting.
 | 
						|
        $settings = \wpSPIO()->settings();
 | 
						|
        $settings->hasCustomFolders = time();
 | 
						|
      }
 | 
						|
 | 
						|
 | 
						|
  }
 | 
						|
 | 
						|
  public function handleImageUpload($image)
 | 
						|
  {
 | 
						|
    $otherMedia = OtherMediaController::getInstance();
 | 
						|
    //$fs = \wpSPIO()->filesystem();
 | 
						|
 | 
						|
    if ($this->optimizeNextGen() === true) {
 | 
						|
          $imageFsPath = $this->getImageAbspath($image);
 | 
						|
 | 
						|
          $otherMedia->addImage($imageFsPath, array('is_nextgen' => true));
 | 
						|
      }
 | 
						|
  }
 | 
						|
 | 
						|
  public function resetNotification()
 | 
						|
  {
 | 
						|
    Notice::removeNoticeByID('MSG_INTEGRATION_NGGALLERY');
 | 
						|
  }
 | 
						|
 | 
						|
  public function onDeleteImage($nggId, $size)
 | 
						|
  {
 | 
						|
 | 
						|
	  	$image = $this->getNGImageByID($nggId);
 | 
						|
 | 
						|
			$paths = array();
 | 
						|
 | 
						|
			if ($size === false)
 | 
						|
			{
 | 
						|
				$imageSizes = $this->getImageSizes($image);
 | 
						|
				foreach($imageSizes as $size)
 | 
						|
				{
 | 
						|
					$paths[] = $this->getImageAbspath($image, $size);
 | 
						|
 | 
						|
				}
 | 
						|
			}
 | 
						|
			else {
 | 
						|
				$paths = array_merge($paths, $this->getImageAbspath($image, $size));
 | 
						|
			}
 | 
						|
 | 
						|
			foreach($paths as $path)
 | 
						|
			{
 | 
						|
				$otherMediaController = OtherMediaController::getInstance();
 | 
						|
				$mediaItem = $otherMediaController->getCustomImageByPath($path);
 | 
						|
				$mediaItem->onDelete();
 | 
						|
			}
 | 
						|
  }
 | 
						|
 | 
						|
 | 
						|
 | 
						|
  public function updateImageSize($nggId, $path) {
 | 
						|
 | 
						|
      $image = $this->getNGImageByID($nggId);
 | 
						|
 | 
						|
      $dimensions = getimagesize($this->getImageAbspath($image));
 | 
						|
      $size_meta = array('width' => $dimensions[0], 'height' => $dimensions[1]);
 | 
						|
      $image->meta_data = array_merge($image->meta_data, $size_meta);
 | 
						|
      $image->meta_data['full'] = $size_meta;
 | 
						|
      $this->saveToNextGen($image);
 | 
						|
  }
 | 
						|
 | 
						|
  protected function getNGImageByID($nggId)
 | 
						|
  {
 | 
						|
    $mapper = \C_Image_Mapper::get_instance();
 | 
						|
    $image = $mapper->find($nggId);
 | 
						|
    return $image;
 | 
						|
  }
 | 
						|
 | 
						|
  /* @param NextGen Image */
 | 
						|
  protected function saveToNextGen($image)
 | 
						|
  {
 | 
						|
    $mapper = \C_Image_Mapper::get_instance();
 | 
						|
    $mapper->save($image);
 | 
						|
  }
 | 
						|
 | 
						|
  protected function getImageAbspath($image, $size = 'full') {
 | 
						|
      $storage = \C_Gallery_Storage::get_instance();
 | 
						|
      return $storage->get_image_abspath($image, $size);
 | 
						|
  }
 | 
						|
 | 
						|
  protected function getImageSizes($image)
 | 
						|
	{
 | 
						|
		 $storage = \C_Gallery_Storage::get_instance();
 | 
						|
 | 
						|
		 return $storage->get_image_sizes($image);
 | 
						|
	}
 | 
						|
 | 
						|
} // class.
 | 
						|
 | 
						|
$ng = NextGenController::getInstance();
 |