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