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 = "

" . __('In order to start the optimization process, you need to validate your API Key in the ' . 'ShortPixel Settings page in your WordPress Admin.','shortpixel-image-optimiser') . "

" . __('If you don’t have an API Key, just fill out the form and a key will be created.','shortpixel-image-optimiser') . "

"; 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 = ' '; $output .= '
'; $output .= $date . ': '; if ($message) $output .= $message; if ($filename) $output .= ' ( '. __('in file ','shortpixel-image-optimiser') . ' ' . $filename . ' ) ' . $kbinfo; $output .= '
'; } 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 = '' . $errors . ''; } $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