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();
|