353 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			353 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| namespace ShortPixel\Controller\View;
 | |
| 
 | |
| if ( ! defined( 'ABSPATH' ) ) {
 | |
|  exit; // Exit if accessed directly.
 | |
| }
 | |
| 
 | |
| use ShortPixel\ShortPixelLogger\ShortPixelLogger as Log;
 | |
| 
 | |
| use ShortPixel\Helper\UiHelper as UiHelper;
 | |
| use ShortPixel\Helper\UtilHelper as UtilHelper;
 | |
| use ShortPixel\Controller\OptimizeController as OptimizeController;
 | |
| use ShortPixel\Controller\ErrorController as ErrorController;
 | |
| 
 | |
| use ShortPixel\Model\File\FileModel as FileModel;
 | |
| 
 | |
| use ShortPixel\Helper\DownloadHelper as DownloadHelper;
 | |
| 
 | |
| 
 | |
| // Future contoller for the edit media metabox view.
 | |
| class EditMediaViewController extends \ShortPixel\ViewController
 | |
| {
 | |
|       protected $template = 'view-edit-media';
 | |
|   //    protected $model = 'image';
 | |
| 
 | |
|       protected $post_id;
 | |
|       protected $legacyViewObj;
 | |
| 
 | |
|       protected $imageModel;
 | |
|       protected $hooked;
 | |
| 
 | |
| 			protected static $instance;
 | |
| 
 | |
| 
 | |
|       public function __construct()
 | |
|       {
 | |
|         parent::__construct();
 | |
|       }
 | |
| 
 | |
|       protected function loadHooks()
 | |
|       {
 | |
|             add_action( 'add_meta_boxes_attachment', array( $this, 'addMetaBox') );
 | |
|             $this->hooked = true;
 | |
|       }
 | |
| 
 | |
|       public function load()
 | |
|       {
 | |
|         if (! $this->hooked)
 | |
|           $this->loadHooks();
 | |
| 
 | |
| 					$fs = \wpSPIO()->filesystem();
 | |
| 					$fs->startTrustedMode();
 | |
|       }
 | |
| 
 | |
|       public function addMetaBox()
 | |
|       {
 | |
|           add_meta_box(
 | |
|               'shortpixel_info_box',          // this is HTML id of the box on edit screen
 | |
|               __('ShortPixel Info', 'shortpixel-image-optimiser'),    // title of the box
 | |
|               array( $this, 'doMetaBox'),   // function to be called to display the info
 | |
|               null,//,        // on which edit screen the box should appear
 | |
|               'side'//'normal',      // part of page where the box should appear
 | |
|               //'default'      // priority of the box
 | |
|           );
 | |
|       }
 | |
| 
 | |
|       public function dometaBox($post)
 | |
|       {
 | |
|           $this->post_id = $post->ID;
 | |
| 					$this->view->debugInfo = array();
 | |
| 					$this->view->id = $this->post_id;
 | |
| 					$this->view->list_actions = '';
 | |
| 
 | |
|           $fs = \wpSPIO()->filesystem();
 | |
|           $this->imageModel = $fs->getMediaImage($this->post_id);
 | |
| 
 | |
| 					// Asking for something non-existing.
 | |
| 					if ($this->imageModel === false)
 | |
| 					{
 | |
| 						$this->view->status_message = __('File Error. This could be not an image or the file is missing', 'shortpixel-image-optimiser');
 | |
| 
 | |
| 						$this->loadView();
 | |
| 						return false;
 | |
| 					}
 | |
| 
 | |
|           $this->view->status_message = null;
 | |
| 
 | |
|          	$this->view->text = UiHelper::getStatusText($this->imageModel);
 | |
|           $this->view->list_actions = UiHelper::getListActions($this->imageModel);
 | |
| 
 | |
|           if ( count($this->view->list_actions) > 0)
 | |
|             $this->view->list_actions = UiHelper::renderBurgerList($this->view->list_actions, $this->imageModel);
 | |
|           else
 | |
|             $this->view->list_actions = '';
 | |
| 
 | |
|           //$this->imageModel->cancelUserExclusions();
 | |
| 
 | |
|           $this->view->actions = UiHelper::getActions($this->imageModel);
 | |
|           $this->view->stats = $this->getStatistics();
 | |
| 
 | |
|           if (! $this->userIsAllowed)
 | |
|           {
 | |
|             $this->view->actions = array();
 | |
|             $this->view->list_actions = '';
 | |
|           }
 | |
| 
 | |
|           if(true === \wpSPIO()->env()->is_debug )
 | |
|           {
 | |
|             $this->view->debugInfo = $this->getDebugInfo();
 | |
|           }
 | |
| 
 | |
|           $this->loadView();
 | |
|       }
 | |
| 
 | |
|       protected function getStatusMessage()
 | |
|       {
 | |
|           return UIHelper::renderSuccessText($this->imageModel);
 | |
|       }
 | |
| 
 | |
|       protected function getStatistics()
 | |
|       {
 | |
|         //$data = $this->data;
 | |
|         $stats = array();
 | |
|         $imageObj = $this->imageModel;
 | |
|         $did_keepExif = $imageObj->getMeta('did_keepExif');
 | |
| 
 | |
| 				$did_convert = $imageObj->getMeta()->convertMeta()->isConverted();
 | |
|         $resize = $imageObj->getMeta('resize');
 | |
| 
 | |
| 				// Not optimized, not data.
 | |
| 				if (! $imageObj->isOptimized())
 | |
| 					return array();
 | |
| 
 | |
|         if ($did_keepExif)
 | |
|           $stats[] = array(__('EXIF kept', 'shortpixel-image-optimiser'), '');
 | |
|         elseif ( $did_keepExif === false) {
 | |
|           $stats[] = array(__('EXIF removed', 'shortpixel-image-optimiser'), '');
 | |
|         }
 | |
| 
 | |
|         if (true === $did_convert )
 | |
|         {
 | |
| 					$ext = $imageObj->getMeta()->convertMeta()->getFileFormat();
 | |
|           $stats[] = array(  sprintf(__('Converted from %s','shortpixel-image-optimiser'), $ext), '');
 | |
|         }
 | |
| 				elseif (false !== $imageObj->getMeta()->convertMeta()->didTry()) {
 | |
| 					$ext = $imageObj->getMeta()->convertMeta()->getFileFormat();
 | |
| 					$error = $imageObj->getMeta()->convertMeta()->getError(); // error code.
 | |
| 					$stats[] = array(UiHelper::getConvertErrorReason($error, $ext), '');
 | |
| 				}
 | |
| 
 | |
|         if ($resize == true)
 | |
|         {
 | |
|             $from = $imageObj->getMeta('originalWidth') . 'x' . $imageObj->getMeta('originalHeight');
 | |
|             $to  = $imageObj->getMeta('resizeWidth') . 'x' . $imageObj->getMeta('resizeHeight');
 | |
| 						$type = ($imageObj->getMeta('resizeType') !== null) ? '(' . $imageObj->getMeta('resizeType') . ')' : '';
 | |
|             $stats[] = array(sprintf(__('Resized %s %s to %s'), $type, $from, $to), '');
 | |
|         }
 | |
| 
 | |
|         $tsOptimized = $imageObj->getMeta('tsOptimized');
 | |
|         if ($tsOptimized !== null)
 | |
|           $stats[] = array(__("Optimized on :", 'shortpixel-image-optimiser') . "<br /> ", UiHelper::formatTS($tsOptimized) );
 | |
| 
 | |
| 				if ($imageObj->isOptimized())
 | |
| 				{
 | |
| 					$stats[] = array( sprintf(__('%s %s Read more about theses stats %s ', 'shortpixel-image-optimiser'), '
 | |
| 					<p><img alt=' . esc_html('Info Icon', 'shortpixel-image-optimiser')  . ' src=' . esc_url( wpSPIO()->plugin_url('res/img/info-icon.png' )) . ' style="margin-bottom: -4px;"/>', '<a href="https://shortpixel.com/knowledge-base/article/553-the-stats-from-the-shortpixel-column-in-the-media-library-explained" target="_blank">', '</a></p>'), '');
 | |
| 				}
 | |
| 
 | |
|         return $stats;
 | |
|       }
 | |
| 
 | |
|       protected function getDebugInfo()
 | |
|       {
 | |
|           if(! \wpSPIO()->env()->is_debug )
 | |
|           {
 | |
|             return array();
 | |
|           }
 | |
| 
 | |
|           $meta = \wp_get_attachment_metadata($this->post_id);
 | |
| 
 | |
|           $fs = \wpSPIO()->filesystem();
 | |
| 
 | |
| 					$imageObj = $this->imageModel;
 | |
| 
 | |
| 					if ($imageObj->isProcessable())
 | |
| 					{
 | |
| 						 $optimizeData = $imageObj->getOptimizeData();
 | |
| 						 $urls = $optimizeData['urls'];
 | |
| 
 | |
| 					}
 | |
| 
 | |
| 					$thumbnails = $imageObj->get('thumbnails');
 | |
| 					$processable = ($imageObj->isProcessable()) ? '<span class="green">Yes</span>' : '<span class="red">No</span> (' . $imageObj->getReason('processable') . ')';
 | |
| 					$anyFileType = ($imageObj->isProcessableAnyFileType()) ? '<span class="green">Yes</span>' : '<span class="red">No</span>';
 | |
| 					$restorable = ($imageObj->isRestorable()) ? '<span class="green">Yes</span>' : '<span class="red">No</span> (' . $imageObj->getReason('restorable') . ')';
 | |
| 
 | |
| 					$hasrecord = ($imageObj->hasDBRecord()) ? '<span class="green">Yes</span>' : '<span class="red">No</span> ';
 | |
| 
 | |
|           $debugInfo = array();
 | |
|           $debugInfo[] = array(__('URL (get attachment URL)', 'shortpixel_image_optiser'), wp_get_attachment_url($this->post_id));
 | |
|           $debugInfo[] = array(__('File (get attached)'), get_attached_file($this->post_id));
 | |
| 
 | |
| 					if ($imageObj->is_virtual())
 | |
| 					{
 | |
|             $virtual = $imageObj->get('virtual_status');
 | |
|             if($virtual == FileModel::$VIRTUAL_REMOTE)
 | |
|               $vtext = 'Remote';
 | |
|             elseif($virtual == FileModel::$VIRTUAL_STATELESS)
 | |
|               $vtext = 'Stateless';
 | |
|             else
 | |
|               $vtext = 'Not set';
 | |
| 
 | |
| 						$debugInfo[] = array(__('Is Virtual: ') . $vtext, $imageObj->getFullPath() );
 | |
| 					}
 | |
| 
 | |
|           $debugInfo[] = array(__('Size and Mime (ImageObj)'), $imageObj->get('width') . 'x' . $imageObj->get('height'). ' (' . $imageObj->get('mime') . ')');
 | |
|           $debugInfo[] = array(__('Status (ShortPixel)'), $imageObj->getMeta('status') . ' '   );
 | |
| 
 | |
| 					$debugInfo[] = array(__('Processable'), $processable);
 | |
| 					$debugInfo[] = array(__('Avif/Webp needed'), $anyFileType);
 | |
| 					$debugInfo[] = array(__('Restorable'), $restorable);
 | |
| 					$debugInfo[] = array(__('Record'), $hasrecord);
 | |
| 
 | |
| 					if ($imageObj->getMeta()->convertMeta()->didTry())
 | |
| 					{
 | |
| 						 $debugInfo[] = array(__('Converted'), ($imageObj->getMeta()->convertMeta()->isConverted() ?'<span class="green">Yes</span>' : '<span class="red">No</span> '));
 | |
| 						 $debugInfo[] = array(__('Checksum'), $imageObj->getMeta()->convertMeta()->didTry());
 | |
| 						 $debugInfo[] = array(__('Error'), $imageObj->getMeta()->convertMeta()->getError());
 | |
| 					}
 | |
| 
 | |
|           $debugInfo[] = array(__('WPML Duplicates'), json_encode($imageObj->getWPMLDuplicates()) );
 | |
| 
 | |
| 					if ($imageObj->getParent() !== false)
 | |
| 					{
 | |
| 						 $debugInfo[] = array(__('WPML duplicate - Parent: '), $imageObj->getParent());
 | |
| 					}
 | |
| 
 | |
| 					if (isset($urls))
 | |
| 					{
 | |
| 						 $debugInfo[] = array(__('To Optimize URLS'),  $urls);
 | |
| 					}
 | |
| 					if (isset($optimizeData))
 | |
| 					{
 | |
| 						 $debugInfo[] = array(__('Optimize Data'), $optimizeData);
 | |
| 
 | |
| 						 $optControl = new optimizeController();
 | |
| 						 $q = $optControl->getQueue($imageObj->get('type'));
 | |
| 
 | |
| 						 $debugInfo[] = array(__('Image to Queue'), $q->_debug_imageModelToQueue($imageObj) );
 | |
| 					}
 | |
| 
 | |
|           $debugInfo['imagemetadata'] = array(__('ImageModel Metadata (ShortPixel)'), $imageObj);
 | |
| 					$debugInfo[] = array('', '<hr>');
 | |
| 
 | |
|           $debugInfo['wpmetadata'] = array(__('WordPress Get Attachment Metadata'), $meta );
 | |
| 					$debugInfo[] = array('', '<hr>');
 | |
| 
 | |
| 
 | |
| 						if ($imageObj->hasBackup())
 | |
|             	$backupFile = $imageObj->getBackupFile();
 | |
| 						else {
 | |
| 							 $backupFile = $fs->getFile($fs->getBackupDirectory($imageObj) . $imageObj->getBackupFileName());
 | |
| 						}
 | |
| 
 | |
|             $debugInfo[] = array(__('Backup Folder'), (string) $backupFile->getFileDir() );
 | |
| 						if ($imageObj->hasBackup())
 | |
| 							$backupText = __('Backup File :');
 | |
| 						else {
 | |
| 							$backupText = __('Target Backup File after optimization (no backup) ');
 | |
| 						}
 | |
|             $debugInfo[] = array( $backupText, (string) $backupFile . '(' . UiHelper::formatBytes($backupFile->getFileSize()) . ')' );
 | |
| 
 | |
|             $debugInfo[] =  array(__("No Main File Backup Available"), '');
 | |
| 
 | |
| 
 | |
| 
 | |
| 					if ($imageObj->getMeta()->convertMeta()->isConverted())
 | |
| 					{
 | |
| 							$convertedBackup = ($imageObj->hasBackup(array('forceConverted' => true))) ? '<span class="green">Yes</span>' : '<span class="red">No</span>';
 | |
| 							$backup = $imageObj->getBackupFile(array('forceConverted' => true));
 | |
| 						 $debugInfo[] = array('Has converted backup', $convertedBackup);
 | |
| 						 if (is_object($backup))
 | |
| 						 	$debugInfo[] = array('Backup: ', $backup->getFullPath() );
 | |
| 				}
 | |
| 
 | |
|           if ($or = $imageObj->hasOriginal())
 | |
|           {
 | |
|              $original = $imageObj->getOriginalFile();
 | |
|              $debugInfo[] = array(__('Has Original File: '), $original->getFullPath()  . '(' . UiHelper::formatBytes($original->getFileSize()) . ')');
 | |
|              $orbackup = $original->getBackupFile();
 | |
|              if ($orbackup)
 | |
|               $debugInfo[] = array(__('Has Backup Original Image'), $orbackup->getFullPath() . '(' . UiHelper::formatBytes($orbackup->getFileSize()) . ')');
 | |
| 						$debugInfo[] = array('', '<hr>');
 | |
| 
 | |
|           }
 | |
| 
 | |
| 
 | |
|           if (! isset($meta['sizes']) )
 | |
|           {
 | |
|              $debugInfo[] = array('',  __('Thumbnails were not generated', 'shortpixel-image-optimiser'));
 | |
|           }
 | |
|           else
 | |
|           {
 | |
|             foreach($thumbnails as $thumbObj)
 | |
|             {
 | |
| 							$size = $thumbObj->get('size');
 | |
| 
 | |
|               $display_size = ucfirst(str_replace("_", " ", $size));
 | |
|               //$thumbObj = $imageObj->getThumbnail($size);
 | |
| 
 | |
|               if ($thumbObj === false)
 | |
|               {
 | |
|                 $debugInfo[] =  array(__('Thumbnail not found / loaded: ', 'shortpixel-image-optimiser'), $size );
 | |
|                 continue;
 | |
|               }
 | |
| 
 | |
|               $url = $thumbObj->getURL(); //$fs->pathToURL($thumbObj); //wp_get_attachment_image_src($this->post_id, $size);
 | |
|               $filename = $thumbObj->getFullPath();
 | |
| 
 | |
| 							$backupFile = $thumbObj->getBackupFile();
 | |
| 							if ($thumbObj->hasBackup())
 | |
| 							{
 | |
| 								$backup = $backupFile->getFullPath();
 | |
| 								$backupText = __('Backup File :');
 | |
| 							}
 | |
| 							else {
 | |
| 								$backupFile = $fs->getFile($fs->getBackupDirectory($thumbObj) . $thumbObj->getBackupFileName());
 | |
| 								$backup = $backupFile->getFullPath();
 | |
| 								$backupText = __('Target Backup File after optimization (no backup) ');
 | |
| 							}
 | |
| 
 | |
|               $width = $thumbObj->get('width');
 | |
|               $height = $thumbObj->get('height');
 | |
| 
 | |
| 					$processable = ($thumbObj->isProcessable()) ? '<span class="green">Yes</span>' : '<span class="red">No</span> (' . $thumbObj->getReason('processable') . ')';
 | |
| 					$restorable = ($thumbObj->isRestorable()) ? '<span class="green">Yes</span>' : '<span class="red">No</span> (' . 		$thumbObj->getReason('restorable') . ')';
 | |
| 					$hasrecord = ($thumbObj->hasDBRecord()) ? '<span class="green">Yes</span>' : '<span class="red">No</span> ';
 | |
| 
 | |
| 					$dbid = $thumbObj->getMeta('databaseID');
 | |
| 
 | |
|               $debugInfo[] = array('', "<div class='$size previewwrapper'><img src='" . $url . "'><p class='label'>
 | |
| 							<b>URL:</b> $url ( $display_size - $width X $height ) <br><b>FileName:</b>  $filename <br> <b> $backupText </b> $backup </p>
 | |
| 							<p><b>Processable: </b> $processable <br> <b>Restorable:</b>  $restorable <br> <b>Record:</b> $hasrecord ($dbid) </p>
 | |
| 							<hr></div>");
 | |
|             }
 | |
|           }
 | |
|           return $debugInfo;
 | |
|       }
 | |
| 
 | |
| 
 | |
| 
 | |
| } // controller .
 |