146 $GLOBALS[
'LANG']->includeLLFile(
'EXT:linkvalidator/Resources/Private/Language/Module/locallang.xlf');
148 if (isset($this->pObj->id)) {
150 $this->modTS = $this->modTS[
'properties'];
154 if (!empty($update)) {
158 $this->pObj->handleExternalFunctionValue();
159 if (isset($this->searchLevel)) {
162 $this->searchLevel = $this->pObj->MOD_SETTINGS[
'searchlevel'];
164 if (is_array(
$GLOBALS[
'TYPO3_CONF_VARS'][
'EXTCONF'][
'linkvalidator'][
'checkLinks'])) {
165 foreach (
$GLOBALS[
'TYPO3_CONF_VARS'][
'EXTCONF'][
'linkvalidator'][
'checkLinks'] as $linkType => $value) {
167 if (strpos($this->modTS[
'linktypes'], $linkType) !== FALSE) {
168 $this->availableOptions[$linkType] = 1;
171 if ($this->pObj->MOD_SETTINGS[$linkType] && empty($set) || $set[$linkType]) {
172 $this->checkOpt[$linkType] = 1;
173 $this->pObj->MOD_SETTINGS[$linkType] = 1;
175 $this->pObj->MOD_SETTINGS[$linkType] = 0;
176 unset($this->checkOpt[$linkType]);
180 $GLOBALS[
'BE_USER']->pushModuleData(
'web_info', $this->pObj->MOD_SETTINGS);
184 $this->pageRenderer->addInlineLanguageLabelFile(
185 \
TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extPath(
'linkvalidator',
'Resources/Private/Language/Module/locallang.xlf')
187 $this->pageRenderer->addJsInlineCode(
'linkvalidator',
'function toggleActionButton(prefix) { 188 var buttonDisable = true; 189 Ext.select(\'.\' + prefix ,false).each(function(checkBox,i){ 190 checkDom = checkBox.dom; 191 if (checkDom.checked){ 192 buttonDisable = false; 196 if (prefix == \'check\'){ 197 checkSub = document.getElementById(\'updateLinkList\'); 199 checkSub = document.getElementById(\'refreshLinkList\'); 201 checkSub.disabled = buttonDisable; 204 $this->pageRenderer->addJsFile($this->doc->backPath .
'js/extjs/ux/Ext.ux.FitToParent.js');
205 $this->pageRenderer->addJsFile($this->doc->backPath .
'sysext/backend/Resources/Public/JavaScript/flashmessages.js');
206 $this->pageRenderer->addJsFile($this->doc->backPath .
'sysext/backend/Resources/Public/JavaScript/iframepanel.js');
207 if ($this->modTS[
'showCheckLinkTab'] == 1) {
208 $this->updateListHtml =
'<input type="submit" name="updateLinkList" id="updateLinkList" value="' .
$GLOBALS[
'LANG']->getLL(
'label_update') .
'"/>';
210 $this->refreshListHtml =
'<input type="submit" name="refreshLinkList" id="refreshLinkList" value="' .
$GLOBALS[
'LANG']->getLL(
'label_refresh') .
'"/>';
213 $brokenLinkOverView = $this->processor->getLinkCounts($this->pObj->id);
215 $this->checkOptHtmlCheck = $this->
getCheckOptions($brokenLinkOverView,
'check');
217 return '<div id="linkvalidator-modfuncreport"></div>';
227 if ($this->modTS[
'showCheckLinkTab'] == 1) {
230 title: TYPO3.l10n.localize(\'CheckLink\'), 231 html: ' . json_encode($this->
flush()) .
', 235 $js =
'var panel = new Ext.TabPanel( { 236 renderTo: \'linkvalidator-modfuncreport\', 237 id: \'linkvalidator-main\', 240 bodyStyle: \'padding:10px;\', 244 title: TYPO3.l10n.localize(\'Report\'), 245 html: ' . json_encode($this->
flush(TRUE)) .
' 251 $this->pageRenderer->addExtOnReadyCode($js);
263 if (is_array(
$GLOBALS[
'TYPO3_CONF_VARS'][
'EXTCONF'][
'linkvalidator'][
'checkLinks'])) {
264 foreach (
$GLOBALS[
'TYPO3_CONF_VARS'][
'EXTCONF'][
'linkvalidator'][
'checkLinks'] as $linkType => $value) {
265 $modMenu[$linkType] = 1;
277 if (is_array(
$GLOBALS[
'TYPO3_CONF_VARS'][
'EXTCONF'][
'linkvalidator'][
'checkLinks'])) {
278 foreach (
$GLOBALS[
'TYPO3_CONF_VARS'][
'EXTCONF'][
'linkvalidator'][
'checkLinks'] as $linkType => $classRef) {
283 $this->doc->backPath =
$GLOBALS[
'BACK_PATH'];
284 $this->doc->setModuleTemplate(\
TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extPath(
'linkvalidator') .
'Resources/Private/Templates/mod_template.html');
287 $this->pageRenderer = $this->doc->getPageRenderer();
288 $this->isAccessibleForCurrentUser = FALSE;
289 if ($this->pObj->id && is_array($this->pageRecord) || !$this->pObj->id && $this->isCurrentUserAdmin()) {
290 $this->isAccessibleForCurrentUser = TRUE;
294 if (
$GLOBALS[
'BE_USER']->workspace !== 0) {
295 $this->isAccessibleForCurrentUser = FALSE;
305 $searchFields = array();
307 foreach ($this->modTS[
'searchFields.'] as $table => $fieldList) {
309 foreach ($fields as $field) {
310 if (!$searchFields || !is_array($searchFields[$table]) || array_search($field, $searchFields[$table]) == FALSE) {
311 $searchFields[$table][] = $field;
315 $rootLineHidden = $this->processor->getRootLineIsHidden($this->pObj->pageinfo);
316 if (!$rootLineHidden || $this->modTS[
'checkhidden'] == 1) {
318 $pageList = $this->processor->extGetTreeList($this->pObj->id, $this->searchLevel, 0,
$GLOBALS[
'BE_USER']->getPagePermsClause(1), $this->modTS[
'checkhidden']);
319 if ($this->pObj->pageinfo[
'hidden'] == 0 || $this->modTS[
'checkhidden'] == 1) {
320 $pageList .= $this->pObj->id;
322 $this->processor->init($searchFields, $pageList);
325 if (!empty($update)) {
326 $this->processor->getLinkStatistics($this->checkOpt, $this->modTS[
'checkhidden']);
336 protected function render() {
337 if ($this->isAccessibleForCurrentUser) {
343 'TYPO3\\CMS\\Core\\Messaging\\FlashMessage',
344 $GLOBALS[
'LANG']->getLL(
'no.access'),
345 $GLOBALS[
'LANG']->getLL(
'no.access.title'),
346 \
TYPO3\CMS\Core\Messaging\FlashMessage::ERROR
348 $this->content .= $message->render();
358 protected function flush($form = FALSE) {
376 0 =>
$GLOBALS[
'LANG']->sL(
'LLL:EXT:lang/locallang_core.xlf:labels.depth_0'),
377 1 =>
$GLOBALS[
'LANG']->sL(
'LLL:EXT:lang/locallang_core.xlf:labels.depth_1'),
378 2 =>
$GLOBALS[
'LANG']->sL(
'LLL:EXT:lang/locallang_core.xlf:labels.depth_2'),
379 3 =>
$GLOBALS[
'LANG']->sL(
'LLL:EXT:lang/locallang_core.xlf:labels.depth_3'),
380 999 =>
$GLOBALS[
'LANG']->sL(
'LLL:EXT:lang/locallang_core.xlf:labels.depth_infi')
382 foreach ($parts as $kv => $label) {
383 $opt[] =
'<option value="' . $kv .
'"' . ($kv == (int)$this->searchLevel ?
' selected="selected"' :
'') .
'>' . htmlspecialchars($label) .
'</option>';
385 $lMenu =
'<select name="search_levels">' . implode(
'', $opt) .
'</select>';
395 $items = ($brokenLinksMarker = array());
396 $brokenLinkItems =
'';
399 if (is_array($this->checkOpt)) {
400 $keyOpt = array_keys($this->checkOpt);
402 $rootLineHidden = $this->processor->getRootLineIsHidden($this->pObj->pageinfo);
403 if (!$rootLineHidden || $this->modTS[
'checkhidden'] == 1) {
404 $pageList = $this->processor->extGetTreeList(
408 $GLOBALS[
'BE_USER']->getPagePermsClause(1),
409 $this->modTS[
'checkhidden']
412 $pageList .= $this->pObj->id;
413 if (($res =
$GLOBALS[
'TYPO3_DB']->exec_SELECTquery(
415 'tx_linkvalidator_link',
416 'record_pid in (' . $pageList .
') and link_type in (\'' . implode(
'\',\
'', $keyOpt) .
'\')
', 418 'record_uid ASC, uid ASC
') 420 // Display table with broken links 421 if ($GLOBALS['TYPO3_DB
']->sql_num_rows($res) > 0) { 422 $brokenLinksTemplate = \TYPO3\CMS\Core\Html\HtmlParser::getSubpart($this->doc->moduleTemplate, '###BROKENLINKS_CONTENT###
'); 423 $brokenLinksItemTemplate = \TYPO3\CMS\Core\Html\HtmlParser::getSubpart($this->doc->moduleTemplate, '###BROKENLINKS_ITEM###
'); 425 $brokenLinksMarker = $this->startTable(); 426 // Table rows containing the broken links 427 while (($row = $GLOBALS['TYPO3_DB
']->sql_fetch_assoc($res)) !== FALSE) { 428 $items[] = $this->renderTableRow($row['table_name
'], $row, $brokenLinksItemTemplate); 430 $brokenLinkItems = implode(chr(10), $items); 432 $brokenLinksMarker = $this->getNoBrokenLinkMessage($brokenLinksMarker); 434 $GLOBALS['TYPO3_DB
']->sql_free_result($res); 437 $brokenLinksMarker = $this->getNoBrokenLinkMessage($brokenLinksMarker); 439 $brokenLinksTemplate = \TYPO3\CMS\Core\Html\HtmlParser::substituteMarkerArray( 440 $brokenLinksTemplate, 441 $brokenLinksMarker, '###|###
', 444 $content = \TYPO3\CMS\Core\Html\HtmlParser::substituteSubpart($brokenLinksTemplate, '###BROKENLINKS_ITEM
', $brokenLinkItems); 454 protected function getNoBrokenLinkMessage(array $brokenLinksMarker) { 455 $brokenLinksMarker['LIST_HEADER
'] = $this->doc->sectionHeader($GLOBALS['LANG
']->getLL('list.header
')); 457 $message = GeneralUtility::makeInstance( 458 'TYPO3\\CMS\\Core\\Messaging\\FlashMessage
', 459 $GLOBALS['LANG
']->getLL('list.no.broken.links
'), 460 $GLOBALS['LANG
']->getLL('list.no.broken.links.title
'), 461 \TYPO3\CMS\Core\Messaging\FlashMessage::OK 463 $brokenLinksMarker['NO_BROKEN_LINKS
'] = $message->render(); 464 return $brokenLinksMarker; 472 protected function startTable() { 474 $makerTableHead = array(); 475 $makerTableHead['tablehead_path
'] = $GLOBALS['LANG
']->getLL('list.tableHead.path
'); 476 $makerTableHead['tablehead_element
'] = $GLOBALS['LANG
']->getLL('list.tableHead.element
'); 477 $makerTableHead['tablehead_headlink
'] = $GLOBALS['LANG
']->getLL('list.tableHead.headlink
'); 478 $makerTableHead['tablehead_linktarget
'] = $GLOBALS['LANG
']->getLL('list.tableHead.linktarget
'); 479 $makerTableHead['tablehead_linkmessage
'] = $GLOBALS['LANG
']->getLL('list.tableHead.linkmessage
'); 480 $makerTableHead['tablehead_lastcheck
'] = $GLOBALS['LANG
']->getLL('list.tableHead.lastCheck
'); 481 // Add CSH to the header of each column 482 foreach ($makerTableHead as $column => $label) { 483 $label = BackendUtility::wrapInHelp('linkvalidator
', $column, $label); 484 $makerTableHead[$column] = $label; 486 // Add section header 487 $makerTableHead['list_header
'] = $this->doc->sectionHeader($GLOBALS['LANG
']->getLL('list.header
')); 488 return $makerTableHead; 499 protected function renderTableRow($table, array $row, $brokenLinksItemTemplate) { 500 $markerArray = array(); 502 // Restore the linktype object 503 $hookObj = $this->hookObjectsArr[$row['link_type
']]; 504 $brokenUrl = $hookObj->getBrokenUrl($row); 505 // Construct link to edit the content element 506 $params = '&edit[
' . $table . '][
' . $row['record_uid
'] . ']=edit
'; 507 $requestUri = GeneralUtility::getIndpEnv('REQUEST_URI
') . 508 '&
id=
' . $this->pObj->id . 509 '&search_levels=
' . $this->searchLevel; 510 $actionLink = '<a href=
"#" onclick=
"'; 511 $actionLink .= htmlspecialchars(BackendUtility::editOnClick( 513 $GLOBALS['BACK_PATH'], 516 $actionLink .= '" title=
"' . htmlspecialchars($GLOBALS['LANG']->getLL('list.edit')) . '">
'; 517 $actionLink .= \TYPO3\CMS\Backend\Utility\IconUtility::getSpriteIcon('actions-document-open
'); 518 $actionLink .= '</a>
'; 519 $elementHeadline = $row['headline
']; 520 // Get the language label for the field from TCA 521 if ($GLOBALS['TCA
'][$table]['columns
'][$row['field
']]['label
']) { 522 $fieldName = $GLOBALS['TCA
'][$table]['columns
'][$row['field
']]['label
']; 523 $fieldName = $GLOBALS['LANG
']->sL($fieldName); 524 // Crop colon from end if present 525 if (substr($fieldName, '-1
', '1
') === ':
') { 526 $fieldName = substr($fieldName, '0
', strlen($fieldName) - 1); 529 // Fallback, if there is no label 530 $fieldName = !empty($fieldName) ? $fieldName : $row['field
']; 532 $element = \TYPO3\CMS\Backend\Utility\IconUtility::getSpriteIconForRecord( 535 array('title
' => $table . ':
' . $row['record_uid
']) 537 if (empty($elementHeadline)) { 538 $element .= '<i>
' . htmlspecialchars($GLOBALS['LANG
']->getLL('list.no.headline
')) . '</i>
'; 540 $element .= htmlspecialchars($elementHeadline); 542 $element .= ' ' . htmlspecialchars(sprintf($GLOBALS['LANG
']->getLL('list.field
'), $fieldName)); 543 $markerArray['actionlink
'] = $actionLink; 544 $markerArray['path
'] = BackendUtility::getRecordPath($row['record_pid
'], '', 0, 0); 545 $markerArray['element
'] = $element; 546 $markerArray['headlink
'] = htmlspecialchars($row['link_title
']); 547 $markerArray['linktarget
'] = htmlspecialchars($brokenUrl); 548 $response = unserialize($row['url_response
']); 549 if ($response['valid
']) { 550 $linkMessage = '<span style=
"color: green;">
' . htmlspecialchars($GLOBALS['LANG
']->getLL('list.msg.ok
')) . '</span>
'; 552 $linkMessage = '<span style=
"color: red;">
' 556 $hookObj->getErrorMessage($response['errorParams
']), 564 $markerArray['linkmessage
'] = $linkMessage; 565 $lastRunDate = date($GLOBALS['TYPO3_CONF_VARS
']['SYS
']['ddmmyy
'], $row['last_check
']); 566 $lastRunTime = date($GLOBALS['TYPO3_CONF_VARS
']['SYS
']['hhmm
'], $row['last_check
']); 567 $message = sprintf($GLOBALS['LANG
']->getLL('list.msg.lastRun
'), $lastRunDate, $lastRunTime); 568 $markerArray['lastcheck
'] = htmlspecialchars($message); 569 // Return the table html code as string 570 return \TYPO3\CMS\Core\Html\HtmlParser::substituteMarkerArray($brokenLinksItemTemplate, $markerArray, '###|###
', TRUE, TRUE); 580 protected function getCheckOptions(array $brokenLinkOverView, $prefix = '') { 581 $markerArray = array(); 582 $additionalAttr = ''; 583 if (!empty($prefix)) { 584 $additionalAttr = ' onclick=
"toggleActionButton(\'' . $prefix . '\');" class=
"' . $prefix . '" '; 586 $additionalAttr = ' onclick=
"toggleActionButton(\'refresh\');" class=
"refresh" '; 588 $checkOptionsTemplate = \TYPO3\CMS\Core\Html\HtmlParser::getSubpart($this->doc->moduleTemplate, '###CHECKOPTIONS_SECTION###
'); 589 $hookSectionTemplate = \TYPO3\CMS\Core\Html\HtmlParser::getSubpart($checkOptionsTemplate, '###HOOK_SECTION###
'); 590 $markerArray['statistics_header
'] = $this->doc->sectionHeader($GLOBALS['LANG
']->getLL('report.statistics.header
')); 591 $totalCountLabel = $GLOBALS['LANG
']->getLL('overviews.nbtotal
'); 592 $totalCountLabel = BackendUtility::wrapInHelp('linkvalidator
', 'checkboxes
', $totalCountLabel); 593 $markerArray['total_count_label
'] = $totalCountLabel; 594 if (empty($brokenLinkOverView['brokenlinkCount
'])) { 595 $markerArray['total_count
'] = '0
'; 597 $markerArray['total_count
'] = $brokenLinkOverView['brokenlinkCount
']; 599 $linktypes = GeneralUtility::trimExplode(',
', $this->modTS['linktypes
'], TRUE); 600 $hookSectionContent = ''; 601 if (is_array($linktypes)) { 602 if (!empty($GLOBALS['TYPO3_CONF_VARS
']['EXTCONF
']['linkvalidator
']['checkLinks
']) 603 && is_array($GLOBALS['TYPO3_CONF_VARS
']['EXTCONF
']['linkvalidator
']['checkLinks
'])) { 604 foreach ($GLOBALS['TYPO3_CONF_VARS
']['EXTCONF
']['linkvalidator
']['checkLinks
'] as $type => $value) { 605 if (in_array($type, $linktypes)) { 606 $hookSectionMarker = array(); 607 if (empty($brokenLinkOverView[$type])) { 608 $hookSectionMarker['count
'] = '0
'; 610 $hookSectionMarker['count
'] = $brokenLinkOverView[$type]; 612 $translation = $GLOBALS['LANG
']->getLL('hooks.
' . $type); 613 $translation = $translation ? $translation : $type; 614 $option = '<input type=
"checkbox" ' . $additionalAttr . ' id=
"' . $prefix . 'SET_' . $type . '" name=
"' . $prefix . 'SET[' . $type . ']" value=
"1"' . ($this->pObj->MOD_SETTINGS[$type] ? ' checked=
"checked"' : '') . '/>
' . '<label
for=
"' . $prefix . 'SET_' . $type . '">
' . htmlspecialchars($translation) . '</label>
'; 615 $hookSectionMarker['option
'] = $option; 616 $hookSectionContent .= \TYPO3\CMS\Core\Html\HtmlParser::substituteMarkerArray( 617 $hookSectionTemplate, 618 $hookSectionMarker, '###|###
', 626 $checkOptionsTemplate = \TYPO3\CMS\Core\Html\HtmlParser::substituteSubpart( 627 $checkOptionsTemplate, 628 '###HOOK_SECTION###
', $hookSectionContent 630 return \TYPO3\CMS\Core\Html\HtmlParser::substituteMarkerArray($checkOptionsTemplate, $markerArray, '###|###
', TRUE, TRUE); 638 protected function loadHeaderData() { 639 $this->doc->addStyleSheet('linkvalidator
', $this->relativePath . 'Resources/Public/Css/linkvalidator.css
', 'linkvalidator
'); 640 $this->pageRenderer->addJsFile($this->doc->backPath . 'js/extjs/ux/Ext.ux.FitToParent.js
'); 648 protected function getDocHeaderButtons() { 650 'csh
' => BackendUtility::cshItem('_MOD_web_func
', '', $GLOBALS['BACK_PATH
']), 651 'shortcut
' => $this->getShortcutButton(), 662 protected function getShortcutButton() { 664 if ($GLOBALS['BE_USER
']->mayMakeShortcut()) { 665 $result = $this->doc->makeShortcutIcon('', 'function', $this->MCONF['name
']); 675 protected function getTemplateMarkers() { 677 'FUNC_TITLE
' => $GLOBALS['LANG
']->getLL('report.func.title
'), 678 'CHECKOPTIONS_TITLE
' => $GLOBALS['LANG
']->getLL('report.statistics.header
'), 679 'FUNC_MENU
' => $this->getLevelSelector(), 680 'CONTENT
' => $this->content, 681 'CHECKALLLINK
' => $this->checkAllHtml, 682 'CHECKOPTIONS
' => $this->checkOptHtml, 683 'ID
' => '<input type=
"hidden" name=
"id" value=
"' . $this->pObj->id . '" />
', 684 'REFRESH
' => $this->refreshListHtml, 695 protected function getTemplateMarkersCheck() { 697 'FUNC_TITLE
' => $GLOBALS['LANG
']->getLL('checklinks.func.title
'), 698 'CHECKOPTIONS_TITLE
' => $GLOBALS['LANG
']->getLL('checklinks.statistics.header
'), 699 'FUNC_MENU
' => $this->getLevelSelector(), 701 'CHECKALLLINK
' => $this->checkAllHtml, 702 'CHECKOPTIONS
' => $this->checkOptHtmlCheck, 703 'ID
' => '<input type=
"hidden" name=
"id" value=
"' . $this->pObj->id . '" />
', 705 'UPDATE
' => $this->updateListHtml 715 protected function isCurrentUserAdmin() { 716 return (bool) $GLOBALS['BE_USER
']->user['admin
'];
static readPageAccess($id, $perms_clause)
static getModTSconfig($id, $TSref)
static getUserObj($classRef, $checkPrefix='', $silent=FALSE)
static makeInstance($className)
$isAccessibleForCurrentUser
static trimExplode($delim, $string, $removeEmptyValues=FALSE, $limit=0)
getCheckOptions(array $brokenLinkOverView, $prefix='')
static getSubpart($content, $marker)
getTemplateMarkersCheck()
if(!defined('TYPO3_MODE')) $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_userauth.php']['logoff_pre_processing'][]