filesystem(); $this->controller = OtherMediaController::getInstance(); // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- This is not a form $this->currentPage = isset($_GET['paged']) ? intval($_GET['paged']) : 1; // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- This is not a form $this->orderby = ( ! empty( $_GET['orderby'] ) ) ? $this->filterAllowedOrderBy(sanitize_text_field(wp_unslash($_GET['orderby']))) : 'id'; // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- This is not a form $this->order = ( ! empty($_GET['order'] ) ) ? sanitize_text_field( wp_unslash($_GET['order'])) : 'desc'; // If no order, default to asc // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- This is not a form $this->search = (isset($_GET["s"]) && strlen($_GET["s"]) > 0) ? sanitize_text_field( wp_unslash($_GET['s'])) : false; // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- This is not a form $this->show_hidden = isset($_GET['show_hidden']) ? sanitize_text_field(wp_unslash($_GET['show_hidden'])) : false; $customFolderBase = $fs->getWPFileBase(); $this->customFolderBase = $customFolderBase->getPath(); $this->loadSettings(); } /** Controller default action - overview */ public function load() { // $this->process_actions(); // $this->view->items = $this->getItems(); // $this->view->folders = $this->getItemFolders($this->view->items); $this->view->headings = $this->getHeadings(); $this->view->pagination = $this->getPagination(); $this->view->filter = $this->getFilter(); // $this->checkQueue(); $this->loadView(); } public function singleItemView($folderObj) { ob_start(); $this->view->current_item = $folderObj; $this->loadView('custom/part-single-folder', false); $result = ob_get_contents(); ob_end_clean(); return $result; } protected function loadSettings() { $settings = \wpSPIO()->settings(); $this->view->settings = new \stdclass; $this->view->settings->includeNextGen = $settings->includeNextGen; $this->view->title = __('Shortpixel Custom Folders', 'shortpixel-image-optimiser'); $this->view->show_search = true; $this->view->has_filters = true; } protected function getRowActions($item) { $actions = array(); $removeAction = array('remove' => array( 'function' => 'window.ShortPixelProcessor.screen.StopMonitoringFolder(' . intval($item->get('id')) . ')', 'type' => 'js', 'text' => __('Stop Monitoring', 'shortpixel-image-optimiser'), 'display' => 'inline', )); $refreshAction = array('refresh' => array( 'function' => 'window.ShortPixelProcessor.screen.RefreshFolder(' . intval($item->get('id')) . ')', 'type' => 'js', 'text' => __('Refresh Folder', 'shortpixel-image-optimiser'), 'display' => 'inline', )); // @todo Get path of last one/two subdirectories and link to files page (?) or add a query for folder_id options. $url = add_query_arg('part', 'files', $this->url); $url = add_query_arg('folder_id', $item->get('id'), $url); $showFilesAction = array('showfiles' => array( 'function' => esc_url($url), 'type' => 'link', 'text' => __('Show all Files', 'shortpixel-image-optimiser'), 'display' => 'inline', )); $actions = array_merge($actions, $refreshAction, $removeAction, $showFilesAction); // $actions = array_merge($actions, ); return $actions; } private function getItems($args = array()) { $results = $this->queryItems($args); $items = array(); foreach($results as $index => $databaseObj) { $db_id = $databaseObj->id; $folderObj = $this->controller->getFolderByID($db_id); $items[$db_id] = $folderObj; } $this->total_items = $this->queryItems(array('limit' => -1, 'only_count' => true)); return $items; } private function queryItems($args = array()) { global $wpdb; $page = $this->currentPage; if ($page <= 0) $page = 1; $defaults = array( 'id' => false, // Get folder by Id 'remove_hidden' => true, // Query only active folders 'path' => false, 'only_count' => false, 'limit' => $this->items_per_page, 'offset' => ($page - 1) * $this->items_per_page, ); $filters = $this->getFilter(); $args = wp_parse_args($args, $defaults); if (! $this->hasFoldersTable()) { if ($args['only_count']) return 0; else return array(); } $fs = \wpSPIO()->fileSystem(); if ($args['only_count']) $selector = 'count(id) as id'; else $selector = '*'; $sql = "SELECT " . $selector . " FROM " . $wpdb->prefix . "shortpixel_folders WHERE 1=1 "; $prepare = array(); // $mask = array(); if ($args['id'] !== false && $args['id'] > 0) { $sql .= ' AND id = %d'; $prepare[] = $args['id']; } elseif($args['path'] !== false && strlen($args['path']) > 0) { $sql .= ' AND path = %s'; $prepare[] = $args['path']; } if ($args['remove_hidden']) { $sql .= " AND status <> -1"; } $sql .= ($this->orderby ? " ORDER BY " . $this->orderby . " " . $this->order . " " : ""); if ($args['limit'] > 0) { $sql .= " LIMIT " . intval($args['limit']) . " OFFSET " . intval($args['offset']); } if (count($prepare) > 0) $sql = $wpdb->prepare($sql, $prepare); if ($args['only_count']) $results = intval($wpdb->get_var($sql)); else $results = $wpdb->get_results($sql); return $results; } protected function getHeadings() { $headings = array( 'checkbox' => array('title' => '', 'sortable' => false, 'orderby' => 'id', // placeholder to allow sort on this. ), 'name' => array('title' => __('Folder Name', 'shortpixel-image-optimiser'), 'sortable' => true, 'orderby' => 'name', ), 'type' => array('title' => __('Type', 'shortpixel-image-optimiser'), 'sortable' => false, 'orderby' => 'path', ), 'files' => array('title' => __('Files', 'shortpixel-image-optimiser'), 'sortable' => false, 'orderby' => 'files', 'title_context' => __('Images in folder - optimized / unoptimized ','shortpixel-image-optimiser'), ), 'date' => array('title' => __('Last change', 'shortpixel-image-optimiser'), 'sortable' => true, 'orderby' => 'ts_updated', ), /* Status is only yes, or nextgen. Already in the Type string. Status use for messages */ 'status' => array('title' => __('Message', 'shortpixel-image-optimiser'), 'sortable' => false, 'orderby' => 'status', ), /* 'actions' => array('title' => __('Actions', 'shortpixel-image-optimiser'), 'sortable' => false, ), */ ); return $headings; } private function getPageArgs($args = array()) { $defaults = array( 'orderby' => $this->orderby, 'order' => $this->order, 's' => $this->search, 'paged' => $this->currentPage, 'part' => 'folders', ); $page_args = array_filter(wp_parse_args($args, $defaults)); return $page_args; // has url } // @todo duplicate of OtherMediaViewController which is not nice. protected function getDisplayHeading($heading) { $output = ''; $defaults = array('title' => '', 'sortable' => false); $heading = wp_parse_args($heading, $defaults); $title = $heading['title']; if ($heading['sortable']) { //$current_order = isset($_GET['order']) ? $current_order : false; //$current_orderby = isset($_GET['orderby']) ? $current_orderby : false; $sorturl = add_query_arg('orderby', $heading['orderby'] ); $sorted = ''; if ($this->orderby == $heading['orderby']) { if ($this->order == 'desc') { $sorturl = add_query_arg('order', 'asc', $sorturl); $sorted = 'sorted desc'; } else { $sorturl = add_query_arg('order', 'desc', $sorturl); $sorted = 'sorted asc'; } } else { $sorturl = add_query_arg('order', 'asc', $sorturl); } $output = '' . esc_html($title) . ' '; } else { $output = $title; } return $output; } protected function filterAllowedOrderBy($orderby) { $headings = $this->getHeadings() ; $filters = array(); foreach ($headings as $heading) { if (isset($heading['orderby'])) { $filters[]= $heading['orderby']; } } if (! in_array($orderby, $filters)) return ''; return $orderby; } protected function getPagination() { $parray = array(); $current = $this->currentPage; $total = $this->total_items; $per_page = $this->items_per_page; $pages = ceil($total / $per_page); if ($pages <= 1) return false; // no pages. $disable_first = $disable_last = $disable_prev = $disable_next = false; $page_links = array(); if ( $current == 1 ) { $disable_first = true; $disable_prev = true; } if ( $current == 2 ) { $disable_first = true; } if ( $current == $pages ) { $disable_last = true; $disable_next = true; } if ( $current == $pages - 1 ) { $disable_last = true; } $total_pages_before = ''; $total_pages_after = ''; $page_args =$this->getPageArgs(); // has url if (isset($page_args['paged'])) unset($page_args['paged']); // Try with controller URL, if not present, try with upload URL and page param. $admin_url = admin_url('upload.php'); $url = (is_null($this->url)) ? add_query_arg('page','wp-short-pixel-custom', $admin_url) : $this->url; // has url $current_url = add_query_arg($page_args, $url); $url = remove_query_arg('page', $url); $page_args['page'] = 'wp-short-pixel-custom'; $output = '
'; foreach($page_args as $arg => $val) { $output .= sprintf('', $arg, $val); } $output .= ''. sprintf(esc_html__('%d Images', 'shortpixel-image-optimiser'), $this->total_items) . ''; if ( $disable_first ) { $page_links[] = ''; } else { $page_links[] = sprintf( "%s", esc_url( $current_url ), esc_html__( 'First page' ), '«' ); } if ( $disable_prev ) { $page_links[] = ''; } else { $page_links[] = sprintf( "%s", esc_url( add_query_arg( 'paged', max( 1, $current - 1 ), $current_url ) ), esc_html__( 'Previous page' ), '‹' ); } $html_current_page = sprintf( "%s", '', $current, strlen( $pages ) ); $html_total_pages = sprintf( "%s", number_format_i18n( $pages ) ); $page_links[] = $total_pages_before . sprintf( /* translators: 1: Current page, 2: Total pages. */ _x( '%1$s of %2$s', 'paging' ), $html_current_page, $html_total_pages ) . $total_pages_after; if ( $disable_next ) { $page_links[] = ''; } else { $page_links[] = sprintf( "%s", esc_url( add_query_arg( 'paged', min( $pages, $current + 1 ), $current_url ) ), __( 'Next page' ), '›' ); } if ( $disable_last ) { $page_links[] = ''; } else { $page_links[] = sprintf( "%s", esc_url( add_query_arg( 'paged', $pages, $current_url ) ), __( 'Last page' ), '»' ); } $output .= "\n" . join( "\n", $page_links ) . ''; $output .= ""; return $output; } protected function getFilter() { $filter = array(); // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- This is not a form $search = (isset($_GET['s'])) ? sanitize_text_field(wp_unslash($_GET['s'])) : ''; if(strlen($search) > 0) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- This is not a form $filter['path'] = (object)array("operator" => "like", "value" =>"'%" . esc_sql($search) . "%'"); } return $filter; } private function hasFoldersTable() { return InstallHelper::checkTableExists('shortpixel_folders'); } } // class