261 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			261 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | ||
| namespace ShortPixel\Controller\View;
 | ||
| 
 | ||
| if ( ! defined( 'ABSPATH' ) ) {
 | ||
|  exit; // Exit if accessed directly.
 | ||
| }
 | ||
| 
 | ||
| use ShortPixel\ShortPixelLogger\ShortPixelLogger as Log;
 | ||
| use ShortPixel\Notices\NoticeController as Notices;
 | ||
| 
 | ||
| use ShortPixel\Controller\AdminNoticesController as AdminNoticesController;
 | ||
| use ShortPixel\Controller\ApiKeyController as ApiKeyController;
 | ||
| use ShortPixel\Controller\QuotaController as QuotaController;
 | ||
| use ShortPixel\Controller\OptimizeController as OptimizeController;
 | ||
| use ShortPixel\Controller\BulkController as BulkController;
 | ||
| use ShortPixel\Controller\StatsController as StatsController;
 | ||
| use ShortPixel\Controller\OtherMediaController as OtherMediaController;
 | ||
| use ShortPixel\Helper\UiHelper as UiHelper;
 | ||
| 
 | ||
| use ShortPixel\Model\AccessModel as AccessModel;
 | ||
| 
 | ||
| 
 | ||
| class BulkViewController extends \ShortPixel\ViewController
 | ||
| {
 | ||
| 
 | ||
|   protected $form_action = 'sp-bulk';
 | ||
|   protected $template = 'view-bulk';
 | ||
| 
 | ||
|   protected $quotaData;
 | ||
|   protected $pendingMeta;
 | ||
|   protected $selected_folders = array();
 | ||
| 
 | ||
| 	protected static $instance;
 | ||
| 
 | ||
| 
 | ||
|   public function load()
 | ||
|   {
 | ||
|     $quota = QuotaController::getInstance();
 | ||
|     $optimizeController = new OptimizeController();
 | ||
| 
 | ||
|     $this->view->quotaData = $quota->getQuota();
 | ||
| 
 | ||
|     $this->view->stats = $optimizeController->getStartupData();
 | ||
|     $this->view->approx = $this->getApproxData();
 | ||
| 
 | ||
|     $this->view->logHeaders = array(__('Images', 'shortpixel_image_optimiser'), __('Errors', 'shortpixel_image_optimizer'), __('Date', 'shortpixel_image_optimizer'));
 | ||
|     $this->view->logs = $this->getLogs();
 | ||
| 
 | ||
|     $keyControl = ApiKeyController::getInstance();
 | ||
| 
 | ||
|     $this->view->error = false;
 | ||
| 
 | ||
|     if ( ! $keyControl->keyIsVerified() )
 | ||
|     {
 | ||
|         $adminNoticesController = AdminNoticesController::getInstance();
 | ||
| 
 | ||
|         $this->view->error = true;
 | ||
|         $this->view->errorTitle = __('Missing API Key', 'shortpixel_image_optimiser');
 | ||
|         $this->view->errorContent = $this->getActivationNotice();
 | ||
|         $this->view->showError = 'key';
 | ||
|     }
 | ||
|     elseif ( ! $quota->hasQuota())
 | ||
|     {
 | ||
|         $this->view->error = true;
 | ||
|         $this->view->errorTitle = __('Quota Exceeded','shortpixel-image-optimiser');
 | ||
|         $this->view->errorContent = __('Can\'t start the Bulk Process due to lack of credits.', 'shortpixel-image-optimiser');
 | ||
|         $this->view->errorText = __('Please check or add quota and refresh the page', 'shortpixel-image-optimiser');
 | ||
|         $this->view->showError = 'quota';
 | ||
| 
 | ||
|     }
 | ||
| 
 | ||
| 		$this->view->mediaErrorLog = $this->loadCurrentLog('media');
 | ||
| 		$this->view->customErrorLog = $this->loadCurrentLog('custom');
 | ||
| 
 | ||
| 		$this->view->buyMoreHref = 'https://shortpixel.com/' . ($keyControl->getKeyForDisplay() ? 'login/' . $keyControl->getKeyForDisplay() . '/spio-unlimited' : 'pricing');
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
|     $this->loadView();
 | ||
| 
 | ||
|   }
 | ||
| 
 | ||
| 	// Double with ApiNotice . @todo Fix.
 | ||
| 	protected function getActivationNotice()
 | ||
| 	{
 | ||
| 		$message = "<p>" . __('In order to start the optimization process, you need to validate your API Key in the '
 | ||
| 						. '<a href="options-general.php?page=wp-shortpixel-settings">ShortPixel Settings</a> page in your WordPress Admin.','shortpixel-image-optimiser') . "
 | ||
| 		</p>
 | ||
| 		<p>" .  __('If you don’t have an API Key, just fill out the form and a key will be created.','shortpixel-image-optimiser') . "</p>";
 | ||
| 		return $message;
 | ||
| 	}
 | ||
| 
 | ||
|   protected function getApproxData()
 | ||
|   {
 | ||
| 		$otherMediaController = OtherMediaController::getInstance();
 | ||
| 
 | ||
|     $approx = new \stdClass; // guesses on basis of the statsController SQL.
 | ||
|     $approx->media = new \stdClass;
 | ||
|     $approx->custom = new \stdClass;
 | ||
|     $approx->total = new \stdClass;
 | ||
| 
 | ||
|     $sc = StatsController::getInstance();
 | ||
|     $sc->reset(); // Get a fresh stat.
 | ||
| 
 | ||
|     $excludeSizes = \wpSPIO()->settings()->excludeSizes;
 | ||
| 
 | ||
| 
 | ||
|     $approx->media->items = $sc->find('media', 'itemsTotal') - $sc->find('media', 'items');
 | ||
| 
 | ||
|     // ThumbsTotal - Approx thumbs in installation - Approx optimized thumbs (same query)
 | ||
|     $approx->media->thumbs = $sc->find('media', 'thumbsTotal') - $sc->find('media', 'thumbs');
 | ||
| 
 | ||
|     // If sizes are excluded, remove this count from the approx.
 | ||
|     if (is_array($excludeSizes) && count($excludeSizes) > 0)
 | ||
|       $approx->media->thumbs = $approx->media->thumbs - ($approx->media->items * count($excludeSizes));
 | ||
| 
 | ||
|     // Total optimized items + Total optimized (approx) thumbnails
 | ||
|     $approx->media->total = $approx->media->items + $approx->media->thumbs;
 | ||
| 
 | ||
| 
 | ||
|     $approx->custom->images = $sc->find('custom', 'itemsTotal') - $sc->find('custom', 'items');
 | ||
| 		$approx->custom->has_custom = $otherMediaController->hasCustomImages();
 | ||
| 
 | ||
|     $approx->total->images = $approx->media->total + $approx->custom->images; // $sc->totalImagesToOptimize();
 | ||
| 
 | ||
| 		$approx->media->isLimited = $sc->find('media', 'isLimited');
 | ||
| 
 | ||
| 		// Prevent any guesses to go below zero.
 | ||
| 		foreach($approx->media as $item => $value)
 | ||
| 		{
 | ||
| 				if (is_numeric($value))
 | ||
| 			  	$approx->media->$item = max($value, 0);
 | ||
| 		}
 | ||
| 		foreach($approx->total as $item => $value)
 | ||
| 		{
 | ||
| 				if (is_numeric($value))
 | ||
| 					$approx->total->$item = max($value, 0);
 | ||
| 		}
 | ||
|     return $approx;
 | ||
| 
 | ||
|   }
 | ||
| 
 | ||
| 	/* Function to check for and load the current Log.  This can be present on load time when the bulk page is refreshed during operations.
 | ||
| 	*  Reload the past error and display them in the error box.
 | ||
| 	* @param String $type  media or custom
 | ||
| 	*/
 | ||
| 	protected function loadCurrentLog($type = 'media')
 | ||
| 	{
 | ||
| 		$bulkController = BulkController::getInstance();
 | ||
| 
 | ||
| 		$log = $bulkController->getLog('current_bulk_' . $type . '.log');
 | ||
| 
 | ||
| 		if ($log == false)
 | ||
| 			return false;
 | ||
| 
 | ||
| 		 $content = $log->getContents();
 | ||
| 		 $lines = array_filter(explode(';', $content));
 | ||
| 
 | ||
| 		 $output = '';
 | ||
| 
 | ||
| 		 foreach ($lines as $line)
 | ||
| 		 {
 | ||
| 			 	$cells = array_filter(explode('|', $line));
 | ||
| 
 | ||
| 				if (count($cells) == 1)
 | ||
| 					continue; // empty line.
 | ||
| 
 | ||
| 				$date = $filename = $message = $item_id = false;
 | ||
| 
 | ||
| 				$date = $cells[0];
 | ||
| 				$filename = isset($cells[1]) ? $cells[1] : false;
 | ||
| 				$item_id = isset($cells[2]) ? $cells[2] : false;
 | ||
| 				$message = isset($cells[3]) ? $cells[3] : false;
 | ||
| 
 | ||
| 				$kblink = UIHelper::getKBSearchLink($message);
 | ||
| 				$kbinfo = '<span class="kbinfo"><a href="' . $kblink . '" target="_blank" ><span class="dashicons dashicons-editor-help"> </span></a></span>';
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 				$output .= '<div class="fatal">';
 | ||
| 				$output .= $date . ': ';
 | ||
| 				if ($message)
 | ||
| 					$output .= $message;
 | ||
| 				if ($filename)
 | ||
| 					$output .= ' ( '. __('in file ','shortpixel-image-optimiser') . ' ' . $filename . ' ) ' . $kbinfo;
 | ||
| 
 | ||
| 				$output .= '</div>';
 | ||
| 		 }
 | ||
| 
 | ||
| 
 | ||
| 		 return $output;
 | ||
| 	}
 | ||
| 
 | ||
|   public function getLogs()
 | ||
|   {
 | ||
|       $bulkController = BulkController::getInstance();
 | ||
|       $logs = $bulkController->getLogs();
 | ||
|       $fs = \wpSPIO()->filesystem();
 | ||
|       $backupDir = $fs->getDirectory(SHORTPIXEL_BACKUP_FOLDER);
 | ||
| 
 | ||
|       $view = array();
 | ||
| 
 | ||
|       foreach($logs as $logData)
 | ||
|       {
 | ||
| 
 | ||
| 
 | ||
|           $logFile = $fs->getFile($backupDir->getPath() . 'bulk_' . $logData['type'] . '_' . $logData['date'] . '.log');
 | ||
|           $errors = $logData['fatal_errors'];
 | ||
| 
 | ||
|           if ($logFile->exists())
 | ||
| 					{
 | ||
|             $errors = '<a data-action="OpenLog" data-file="' . $logFile->getFileName() . '" href="' . $fs->pathToUrl($logFile) . '">' . $errors . '</a>';
 | ||
| 					}
 | ||
| 
 | ||
| 					$op = (isset($logData['operation'])) ? $logData['operation'] : false;
 | ||
| 
 | ||
| 					// BulkName is just to compile a user-friendly name for the operation log.
 | ||
| 					$bulkName = '';
 | ||
| 
 | ||
| 					switch($logData['type'])
 | ||
| 					{
 | ||
| 						 case 'custom':
 | ||
| 						 	$bulkName = __('Custom Media Bulk', 'shortpixel-image-optimiser');
 | ||
| 						 break;
 | ||
| 						 case 'media':
 | ||
| 						 	$bulkName = __('Media Library Bulk', 'shortpixel-image-optimiser');
 | ||
| 						 break;
 | ||
| 
 | ||
| 					}
 | ||
| 
 | ||
| 					$bulkName  .= ' '; // add a space.
 | ||
| 
 | ||
| 					switch($op)
 | ||
| 					{
 | ||
| 							 case 'bulk-restore':
 | ||
| 							 		 $bulkName .= __('Restore', 'shortpixel-image-optimiser');
 | ||
| 							 break;
 | ||
| 							 case 'migrate':
 | ||
| 							 		 $bulkName .= __('Migrate old Metadata', 'shortpixel-image-optimiser');
 | ||
| 							 break;
 | ||
| 							 case 'removeLegacy':
 | ||
| 								$bulkName = __('Remove Legacy Data', 'shortpixel-image-optimiser');
 | ||
| 							 break;
 | ||
| 							 default:
 | ||
| 							 	 	 $bulkName .= __('Optimization', 'shortpixel-image-optimiser');
 | ||
| 							 break;
 | ||
| 					}
 | ||
| 
 | ||
| 					$images = isset($logData['total_images']) ? $logData['total_images'] : $logData['processed'];
 | ||
| 
 | ||
|           $view[] = array('type' => $logData['type'], 'images' => $images, 'errors' => $errors, 'date' => UiHelper::formatTS($logData['date']), 'operation' => $op, 'bulkName' => $bulkName);
 | ||
| 
 | ||
|       }
 | ||
| 
 | ||
|       krsort($view);
 | ||
| 
 | ||
|       return $view;
 | ||
|   }
 | ||
| 
 | ||
| } // class
 |