Skip to content

Commit c1dd529

Browse files
committed
Add filter for error
1 parent d91693c commit c1dd529

File tree

9 files changed

+138
-5
lines changed

9 files changed

+138
-5
lines changed

Classes/CheckLinks/LinkTargetResponse/LinkTargetResponse.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ class LinkTargetResponse
4242

4343
protected string $urlChecker = '';
4444

45+
4546
/**
4647
* @var array<int,array{from:string, to:string}>
4748
*/

Classes/Controller/BrokenLinkListController.php

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -96,12 +96,13 @@ class BrokenLinkListController extends AbstractBrofixController
9696
// sort by error type
9797
'error' => [
9898
['check_status', 'ASC'],
99-
['link_type', 'ASC'],
100-
['url_response', 'ASC']
99+
['error_type', 'ASC'],
100+
['errno', 'ASC']
101101
],
102102
'error_reverse' => [
103-
['link_type', 'DESC'],
104-
['url_response', 'DESC']
103+
['check_status', 'DESC'],
104+
['error_type', 'DESC'],
105+
['errno', 'DESC']
105106
],
106107
];
107108

@@ -1104,6 +1105,12 @@ protected function renderTableRow($table, array $row): array
11041105
}
11051106
$variables['linktext'] = $hookObj->getBrokenLinkText($row, $linkTargetResponse->getCustom());
11061107

1108+
// error
1109+
if ($row['error_type'] ?? false && $row['errno'] ?? false) {
1110+
$variables['error'] = $row['error_type'] . ':' . $row['errno'];
1111+
}
1112+
1113+
11071114
// last check of record
11081115
// show the oldest last_check, either for the record or for the link target
11091116
$variables['lastcheck_combined'] = StringUtil::formatTimestampAsString($row['last_check'] < $row['last_check_url'] ? $row['last_check'] : $row['last_check_url']);

Classes/Controller/Filter/BrokenLinkListFilter.php

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ class BrokenLinkListFilter implements Arrayable
2828

2929
protected const KEY_HOWTOTRAVERSE = 'howtotraverse';
3030

31+
protected const KEY_ERROR = 'error';
32+
3133
/** @var string */
3234
protected const LINK_TYPE_FILTER_DEFAULT = 'all';
3335

@@ -61,6 +63,8 @@ class BrokenLinkListFilter implements Arrayable
6163
/** @var string */
6264
protected $urlFilterMatch = self::URL_MATCH_DEFAULT;
6365

66+
protected string $errorFilter = '';
67+
6468
protected int $checkStatusFilter = self::CHECK_STATUS_DEFAULT;
6569

6670
protected bool $usePagetreeCache = true;
@@ -78,6 +82,7 @@ public function __construct(
7882
string $linkType = self::LINK_TYPE_DEFAULT,
7983
string $url = '',
8084
string $urlMatch = self::URL_MATCH_DEFAULT,
85+
string $errorFilter = '',
8186
int $checkStatus = self::CHECK_STATUS_DEFAULT,
8287
bool $usePagetreeCache = true,
8388
string $howtotraverse = self::HOW_TO_TRAVERSE_DEFAULT
@@ -86,6 +91,7 @@ public function __construct(
8691
$this->linktype_filter = $linkType;
8792
$this->url_filtre = $url;
8893
$this->urlFilterMatch = $urlMatch;
94+
$this->errorFilter = $errorFilter;
8995
$this->checkStatusFilter = $checkStatus;
9096
$extensionConfiguration = GeneralUtility::makeInstance(ExtensionConfiguration::class);
9197
$this->usePagetreeCache = $usePagetreeCache;
@@ -99,6 +105,7 @@ public static function getInstanceFromModuleData(ModuleData $moduleData): Broken
99105
$moduleData->get('linktype_searchFilter', 'all'),
100106
$moduleData->get('url_searchFilter', ''),
101107
$moduleData->get('url_match_searchFilter', 'partial'),
108+
$moduleData->get('error_searchFilter', ''),
102109
(int)$moduleData->get('check_status', (string)self::CHECK_STATUS_DEFAULT),
103110
(bool)$moduleData->get('useCache', 1),
104111
$moduleData->get('howtotraverse', self::HOW_TO_TRAVERSE_DEFAULT),
@@ -112,6 +119,7 @@ public static function getInstanceFromArray(array $values): BrokenLinkListFilter
112119
$values[self::KEY_LINKTYPE] ?? self::LINK_TYPE_DEFAULT,
113120
$values[self::KEY_URL] ?? '',
114121
$values[self::KEY_URL_MATCH] ?? self::URL_MATCH_DEFAULT,
122+
$values[self::KEY_ERROR] ?? '',
115123
$values[self::KEY_CHECK_STATUS] ?? self::CHECK_STATUS_DEFAULT,
116124
$values[self::KEY_USE_CACHE] ?? 1,
117125
$values[self::KEY_HOWTOTRAVERSE] ?? self::HOW_TO_TRAVERSE_DEFAULT,
@@ -125,6 +133,7 @@ public function toArray(): array
125133
self::KEY_LINKTYPE => $this->getLinktypeFilter(),
126134
self::KEY_URL => $this->getUrlFilter(),
127135
self::KEY_URL_MATCH => $this->getUrlFilterMatch(),
136+
self::KEY_ERROR => $this->getErrorFilter(),
128137
self::KEY_CHECK_STATUS => $this->getCheckStatusFilter(),
129138
self::KEY_USE_CACHE => $this->isUsePagetreeCache(),
130139
self::KEY_HOWTOTRAVERSE => $this->getHowtotraverse(),
@@ -204,6 +213,47 @@ public function setUrlFilterMatch(string $urlFilterMatch): void
204213
$this->urlFilterMatch = $urlFilterMatch;
205214
}
206215

216+
/**
217+
* Combined eror of <errorType>:<errno> or several e.g. 'libcurlErrno:6|custom:11'
218+
*/
219+
public function getErrorFilter(): string
220+
{
221+
return $this->errorFilter;
222+
}
223+
224+
/**
225+
* @deprecated because errorFilter can contain several, e.g. ''
226+
*/
227+
public function getErrorTypeFilter(): string
228+
{
229+
$errorFilter = $this->errorFilter;
230+
if (!$errorFilter) {
231+
return '';
232+
}
233+
$parts = explode(':', $errorFilter);
234+
return $parts[0] ?? '';
235+
}
236+
237+
/**
238+
* @deprecated because errorFilter can contain several, e.g. ''
239+
*/
240+
241+
public function getErrnoFilter(): int
242+
{
243+
$errorFilter = $this->errorFilter;
244+
if (!$errorFilter) {
245+
return '';
246+
}
247+
$parts = explode(':', $errorFilter);
248+
return (int)($parts[1] ?? 0);
249+
}
250+
251+
252+
public function setErrorFilter(string $errorFilter): void
253+
{
254+
$this->errorFilter = $errorFilter;
255+
}
256+
207257
public function getCheckStatusFilter(): int
208258
{
209259
return $this->checkStatusFilter;

Classes/LinkAnalyzer.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,8 @@ public function recheckUrl(string &$message, array $record, ServerRequestInterfa
178178
$brokenLinkRecord['last_check_url'] = \time();
179179
$brokenLinkRecord['last_check'] = \time();
180180
$brokenLinkRecord['url_checker'] = $linkTargetResponse->getUrlChecker();
181+
$brokenLinkRecord['error_type'] = $linkTargetResponse->getErrorType();
182+
$brokenLinkRecord['errno'] = $linkTargetResponse->getErrno();
181183
$identifier = [
182184
'url' => $url,
183185
'link_type' => $linkType
@@ -557,6 +559,8 @@ protected function checkLinks(array $links, array $linkTypes, int $mode = 0): vo
557559
$record['last_check_url'] = $linkTargetResponse->getLastChecked() ?: \time();
558560
$record['last_check'] = \time();
559561
$record['url_checker'] = $linkTargetResponse->getUrlChecker();
562+
$brokenLinkRecord['error_type'] = $linkTargetResponse->getErrorType();
563+
$brokenLinkRecord['errno'] = $linkTargetResponse->getErrno();
560564
if ($this->brokenLinkRepository->insertOrUpdateBrokenLink($record)
561565
&& $linkTargetResponse->isError()
562566
) {
@@ -570,6 +574,8 @@ protected function checkLinks(array $links, array $linkTypes, int $mode = 0): vo
570574
$record['last_check_url'] = $linkTargetResponse->getLastChecked() ?: \time();
571575
$record['last_check'] = \time();
572576
$record['url_checker'] = $linkTargetResponse->getUrlChecker();
577+
$brokenLinkRecord['error_type'] = $linkTargetResponse->getErrorType();
578+
$brokenLinkRecord['errno'] = $linkTargetResponse->getErrno();
573579
$this->brokenLinkRepository->insertOrUpdateBrokenLink($record);
574580
}
575581
}

Classes/Repository/BrokenLinkRepository.php

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,41 @@ public function getBrokenLinks(
134134
$queryBuilder->expr()->eq(self::TABLE . '.record_uid', $queryBuilder->createNamedParameter($filter->getUidFilter(), Connection::PARAM_INT))
135135
);
136136
}
137+
138+
// errorFilter, might be 'custom:13' or 'custom:13|httpErrorCode:404' etc. Several combinations, separated
139+
// by '|', each combination with <errortype>:<errno>
140+
141+
$errorFilter = $filter->getErrorFilter();
142+
$errorConstraintsOr = [];
143+
if ($errorFilter !== '') {
144+
$errorCombinations = explode('|', $errorFilter);
145+
foreach($errorCombinations as $errorCombination) {
146+
147+
$parts = explode(':', $errorCombination);
148+
if (count($parts) === 2) {
149+
150+
$errorType = $parts[0];
151+
$errno = (int)$parts[1];
152+
$errorConstraintsOr[] = $queryBuilder->expr()->and(
153+
$queryBuilder->expr()->eq(self::TABLE . '.error_type',
154+
$queryBuilder->createNamedParameter($errorType)),
155+
$queryBuilder->expr()->eq(self::TABLE . '.errno',
156+
$queryBuilder->createNamedParameter($errno, Connection::PARAM_INT))
157+
);
158+
} else if (count($parts) === 1) {
159+
$errorType = $parts[0];
160+
$errorConstraintsOr[] = $queryBuilder->expr()->eq(self::TABLE . '.error_type',
161+
$queryBuilder->createNamedParameter($errorType));
162+
163+
}
164+
}
165+
}
166+
if ($errorConstraintsOr) {
167+
$queryBuilder->andWhere(
168+
$queryBuilder->expr()->or(...$errorConstraintsOr)
169+
);
170+
}
171+
137172
$urlFilter = $filter->getUrlFilter();
138173
if ($urlFilter != '') {
139174
switch ($filter->getUrlFilterMatch()) {

Configuration/Backend/Modules.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
'linktype_searchFilter' => 'all',
5959
'url_searchFilter' => 'all',
6060
'url_match_searchFilter' => 'partial',
61+
'error_searchFilter' => '',
6162
'check_status' => '1',
6263
'current_record_uid' => '',
6364
'current_record_table' => '',

Resources/Private/Partials/BrokenLinkList.html

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,25 @@
142142
<f:if condition="{item.status} === 2"><core:icon identifier="actions-check-circle"/></f:if>
143143
<f:if condition="{item.status} === 3"><core:icon identifier="actions-question-circle"/></f:if>
144144
<f:if condition="{item.status} === 4"><core:icon identifier="actions-ban"/></f:if>
145-
{item.linkmessage -> f:format.raw()}</td>
145+
{item.linkmessage -> f:format.raw()}
146+
<f:if condition="{item.status} == 1">
147+
<div class="inline-action">
148+
<f:if condition="{filter.errorFilter}">
149+
<f:then>
150+
<a class="btn btn-default" href="{listUri}&error_searchFilter=" title="{f:translate(key: 'LLL:EXT:brofix/Resources/Private/Language/Module/locallang.xlf:list.filter.unset.tooltip', extensionName: 'Brofix')}">
151+
<core:icon identifier="actions-close" size="medium"/>
152+
</a>
153+
</f:then>
154+
<f:else>
155+
<a class="btn btn-default" href="{listUri}&error_searchFilter={item.error}" title="{f:translate(key: 'LLL:EXT:brofix/Resources/Private/Language/Module/locallang.xlf:list.filter.element.uid.tooltip', extensionName: 'Brofix')}">
156+
<core:icon identifier="actions-filter" size="small"/>
157+
<f:translate key="filter" extensionName="Brofix">Filter</f:translate>
158+
</a>
159+
</f:else>
160+
</f:if>
161+
</div>
162+
</f:if>
163+
</td>
146164

147165
<f:comment>==== last_check_url ====</f:comment>
148166
<td class="mobile-optional" title="">

Resources/Private/Partials/BrokenLinksForm.html

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,17 @@
130130
</select>
131131
</div>
132132

133+
<f:comment>Error code</f:comment>
134+
<div class="col">
135+
<label for="error_searchFilter">
136+
<f:translate extensionName="Brofix" key="LLL:EXT:brofix/Resources/Private/Language/Module/locallang.xlf:list.tableHead.error"/>:
137+
</label>
138+
<input type="search" size="20" class="form-control t3js-clearable hasDefaultValue slug-impact t3js-charcounter-initialized"
139+
name="error_searchFilter"
140+
placeholder=""
141+
id="error_searchFilter"
142+
value="{filter.errorFilter}"/>
143+
</div>
133144

134145
<f:if condition="{configuration.showalllinks}">
135146
<div class="col">

ext_tables.sql

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ CREATE TABLE tx_brofix_broken_links (
2020
url_response text,
2121
check_status int(5) DEFAULT '4' NOT NULL,
2222
url_checker varchar(100) DEFAULT '' NOT NULL,
23+
error_type varchar(50) DEFAULT '' NOT NULL,
24+
errno int(11) unsigned DEFAULT '0' NOT NULL,
2325

2426
last_check int(11) DEFAULT '0' NOT NULL,
2527
last_check_url int(11) DEFAULT '0' NOT NULL,
@@ -40,6 +42,8 @@ CREATE TABLE tx_brofix_link_target_cache (
4042
check_status int(11) unsigned DEFAULT '0' NOT NULL,
4143
url_response text,
4244
url_checker varchar(100) DEFAULT '' NOT NULL,
45+
error_type varchar(50) DEFAULT '' NOT NULL,
46+
errno int(11) unsigned DEFAULT '0' NOT NULL,
4347

4448
PRIMARY KEY (uid)
4549
);

0 commit comments

Comments
 (0)