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 .
 |