PluginProbe
404 Solution / 4.3.0
404 Solution v4.3.0
4.3.5 4.3.4 4.3.3 4.3.2 4.3.1 4.3.0 4.2.0 4.1.19 4.1.18 4.1.17 4.1.16 4.1.15 4.1.13 4.1.12 4.1.11 4.1.10 4.1.9 4.1.8 4.1.7 4.1.6 4.1.5 4.1.4 4.1.3 trunk 2.30.0 All 109 releases
404-solution / includes / admin / RedirectsTablePagePresenter.php

RedirectsTablePagePresenter.php in 404 Solution 4.3.0, at includes/admin/RedirectsTablePagePresenter.php

175 lines 8.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 if (!defined('ABSPATH')) {
4 exit;
5 }
6
7 /**
8 * Presents the Page Redirects admin page wrapper and table controls.
9 */
10 class ABJ_404_Solution_RedirectsTablePagePresenter {
11
12 /** @var ABJ_404_Solution_Functions */
13 private $functions;
14
15 /** @var ABJ_404_Solution_PluginLogic */
16 private $logic;
17
18 /** @var ABJ_404_Solution_View_ListTableChrome */
19 private $listTableChrome;
20
21 /** @var ABJ_404_Solution_RedirectAddModalPresenter */
22 private $addModalPresenter;
23
24 public function __construct(ABJ_404_Solution_Functions $functions, ABJ_404_Solution_PluginLogic $logic,
25 ABJ_404_Solution_View_ListTableChrome $listTableChrome,
26 ABJ_404_Solution_RedirectAddModalPresenter $addModalPresenter) {
27 $this->functions = $functions;
28 $this->logic = $logic;
29 $this->listTableChrome = $listTableChrome;
30 $this->addModalPresenter = $addModalPresenter;
31 }
32
33 /**
34 * @return string
35 */
36 public function render(): string {
37 $sub = 'abj404_redirects';
38 $tableOptions = $this->logic->settingsUpdate()->sanitizePostData(
39 $this->logic->settingsUpdate()->getTableOptions($sub)
40 );
41 $currentFilter = $this->currentFilter($tableOptions);
42 $paginationState = $this->paginationState($tableOptions);
43 $refresh = $this->listTableChrome->paginationRefreshStrings();
44
45 $html = $this->fillTpl('viewRedirectsTableRedirectsPageWrapper.html', array(
46 '{data-health-bar-ajax-url}' => esc_attr(admin_url('admin-ajax.php')),
47 '{data-health-bar-nonce}' => esc_attr(wp_create_nonce('abj404_refreshHealthBar')),
48 '{loading_status_text}' => esc_html__('Loading status...', '404-solution'),
49 '{redirects_title}' => esc_html__('Page Redirects', '404-solution'),
50 '{subtitle}' => $this->subtitleHtml(),
51 '{add_redirect_button}' => $this->addRedirectButtonHtml($currentFilter),
52 '{subsubsub}' => $this->subsubsubHtml($sub, $tableOptions),
53 '{data-pagination-ajax-url}' => esc_attr(admin_url('admin-ajax.php')),
54 '{data-lazy-backfill-ajax-url}' => esc_attr(admin_url('admin-ajax.php')),
55 '{data-lazy-backfill-nonce}' => esc_attr(wp_create_nonce('abj404_runLazyBackfill')),
56 '{data-pagination-ajax-subpage}' => esc_attr($sub),
57 '{data-pagination-ajax-nonce}' => esc_attr(wp_create_nonce('abj404_updatePaginationLink')),
58 '{data-pagination-inflight-nonce}' => esc_attr(wp_create_nonce('abj404_fetchInflightStage')),
59 '{data-pagination-current-orderby}' => esc_attr($paginationState['orderby']),
60 '{data-pagination-current-order}' => esc_attr($paginationState['order']),
61 '{data-pagination-current-filter}' => esc_attr((string)$currentFilter),
62 '{data-pagination-current-paged}' => esc_attr((string)$paginationState['paged']),
63 '{data-pagination-current-score-range}' => esc_attr($paginationState['scoreRange']),
64 '{data-pagination-auto-refresh}' => esc_attr('1'),
65 '{data-pagination-refresh-available-text}' => esc_attr($refresh['available']),
66 '{search_placeholder}' => esc_attr__('Type to filter redirects... (press Enter)', '404-solution'),
67 '{filter_text}' => esc_attr($this->filterText($tableOptions)),
68 '{rows_per_page_label}' => esc_html__('Rows per page:', '404-solution'),
69 '{perpage_options}' => $this->listTableChrome->buildPerpageOptions($this->perPage($tableOptions)),
70 '{confidence_label}' => esc_html__('Confidence:', '404-solution'),
71 '{score_range_base_url_js}' => esc_js(esc_url($this->scoreRangeBaseUrl($currentFilter))),
72 '{score_range_options}' => $this->listTableChrome->buildScoreRangeOptions($paginationState['scoreRange']),
73 '{form_action}' => esc_url($this->listTableChrome->getBulkOperationsFormURL($sub, $tableOptions)),
74 '{selected_label}' => esc_html__('redirects selected', '404-solution'),
75 '{bulk_actions_label}' => esc_html__('Bulk Actions', '404-solution'),
76 '{bulk_action_options}' => $this->listTableChrome->buildRedirectsBulkActionOptions($currentFilter),
77 '{apply_label}' => esc_html__('Apply', '404-solution'),
78 '{clear_selection_label}' => esc_html__('Clear Selection', '404-solution'),
79 '{warmup_placeholder}' => ABJ_404_Solution_FileSystemService::readFileContents(dirname(__DIR__) . '/html/tableWarmupPlaceholder.html'),
80 '{loading_badge_text}' => esc_html__('Loading...', '404-solution'),
81 '{empty_trash_form}' => $currentFilter == ABJ404_TRASH_FILTER ? $this->listTableChrome->buildEmptyTrashForm($sub) : '',
82 ));
83
84 if ($currentFilter != ABJ404_TRASH_FILTER) {
85 $html .= $this->addModalPresenter->render($tableOptions);
86 }
87 return $html;
88 }
89
90 /** @param array<string, mixed> $tableOptions */
91 private function currentFilter(array $tableOptions): int {
92 $rawFilter = $tableOptions['filter'] ?? 0;
93 return is_scalar($rawFilter) ? (int)$rawFilter : 0;
94 }
95
96 /**
97 * @param array<string, mixed> $tableOptions
98 * @return array{orderby: string, order: string, paged: int, scoreRange: string}
99 */
100 private function paginationState(array $tableOptions): array {
101 $rawPaged = $tableOptions['paged'] ?? 1;
102 $paged = is_scalar($rawPaged) ? intval($rawPaged) : 1;
103 $rawOrderby = $tableOptions['orderby'] ?? '';
104 $rawOrder = $tableOptions['order'] ?? '';
105 $rawScoreRange = $tableOptions['score_range'] ?? '';
106
107 return array(
108 'orderby' => is_string($rawOrderby) ? $rawOrderby : 'url',
109 'order' => is_string($rawOrder) ? $rawOrder : 'ASC',
110 'paged' => max(1, $paged),
111 'scoreRange' => is_string($rawScoreRange) && $rawScoreRange !== '' ? $rawScoreRange : 'all',
112 );
113 }
114
115 private function subtitleHtml(): string {
116 if (abj_service('settings_mode_preference')->getMode() !== 'simple') {
117 return '';
118 }
119 return $this->functions->str_replace(
120 '{text}',
121 esc_html__('The plugin creates these automatically. You only need to act when the status bar above says so.', '404-solution'),
122 $this->tpl('viewRedirectsTableSubtitle.html')
123 ) . "\n";
124 }
125
126 private function addRedirectButtonHtml(int $currentFilter): string {
127 if ($currentFilter == ABJ404_TRASH_FILTER) {
128 return '';
129 }
130 return $this->functions->str_replace(
131 '{label}',
132 esc_html__('Add Redirect', '404-solution'),
133 $this->tpl('viewRedirectsTableAddRedirectButton.html')
134 );
135 }
136
137 /** @param array<string, mixed> $tableOptions */
138 private function subsubsubHtml(string $sub, array $tableOptions): string {
139 return $this->listTableChrome->buildSubsubsubFilters($sub, array(
140 array(0, __('All', '404-solution')),
141 array(ABJ404_STATUS_MANUAL, __('Manual', '404-solution')),
142 array(ABJ404_STATUS_AUTO, __('Automatic', '404-solution')),
143 array(ABJ404_TRASH_FILTER, __('Trash', '404-solution')),
144 ), $tableOptions);
145 }
146
147 /** @param array<string, mixed> $tableOptions */
148 private function filterText(array $tableOptions): string {
149 return is_string($tableOptions['filterText'] ?? '') ? (string)($tableOptions['filterText'] ?? '') : '';
150 }
151
152 /**
153 * @param array<string, mixed> $tableOptions
154 * @return int|string
155 */
156 private function perPage(array $tableOptions) {
157 $perPage = $tableOptions['perpage'] ?? 25;
158 return (is_int($perPage) || is_string($perPage)) ? $perPage : 25;
159 }
160
161 private function scoreRangeBaseUrl(int $currentFilter): string {
162 return '?page=' . ABJ404_PP . '&subpage=abj404_redirects&filter=' . $currentFilter;
163 }
164
165 /** @param array<string, string> $vars */
166 private function fillTpl(string $name, array $vars): string {
167 return (string)$this->functions->str_replace(array_keys($vars), array_values($vars), $this->tpl($name));
168 }
169
170 private function tpl(string $name): string {
171 $raw = ABJ_404_Solution_FileSystemService::readFileContents(dirname(__DIR__) . '/html/' . $name, false);
172 return rtrim((string)$raw, "\n");
173 }
174 }
175