View source
<?php
namespace Drupal\w3c_validator;
use Drupal\Core\Access\AccessManagerInterface;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Database\Connection;
use Drupal\Core\DependencyInjection\DependencySerializationTrait;
use Drupal\Core\Session\AccountInterface;
use Drupal\Core\Session\AnonymousUserSession;
use Drupal\Core\StringTranslation\StringTranslationTrait;
use Drupal\Core\Url;
use HtmlValidator\Response;
use HtmlValidator\Validator;
use Psr\Log\LoggerInterface;
class W3CProcessor {
use StringTranslationTrait;
use DependencySerializationTrait;
protected $w3cTokenManager;
protected $connection;
protected $configFactory;
protected $accessManager;
protected $currentUser;
protected $logger;
protected $moduleSettings;
public function __construct(W3CTokenManager $w3c_token_manager, Connection $connection, ConfigFactoryInterface $config_factory, AccessManagerInterface $access_manager, AccountInterface $current_user, LoggerInterface $logger) {
$this->w3cTokenManager = $w3c_token_manager;
$this->connection = $connection;
$this->configFactory = $config_factory;
$this->accessManager = $access_manager;
$this->currentUser = $current_user;
$this->logger = $logger;
}
public function getValidatorUrl() {
$config_url = $this
->moduleSettings()
->get('validator_url');
return empty($config_url) ? Validator::DEFAULT_VALIDATOR_URL : $config_url;
}
public function findAllPages() {
$all_site_pages = [];
$site_frontpage = $this->configFactory
->get('system.site')
->get('page.front');
$all_site_pages[$site_frontpage] = [
'route' => '<front>',
'url' => $site_frontpage,
'title' => $this
->t('Frontpage'),
];
$query = $this->connection
->select('node_field_data', 'n');
$query
->fields('n', [
'nid',
'title',
]);
$query
->addExpression("CONCAT('entity.node.canonical', '')", 'route');
$query
->addExpression("CONCAT('node/', n.nid)", 'url');
$nodes = $query
->execute()
->fetchAllAssoc('url', \PDO::FETCH_ASSOC);
$all_site_pages = array_merge($all_site_pages, $nodes);
if ($this
->moduleSettings()
->get('admin_pages')) {
$query = $this->connection
->select('router', 'r');
$query
->addField('r', 'pattern_outline', 'url');
$query
->addField('r', 'name', 'title');
$query
->addField('r', 'name', 'route');
$query
->condition('pattern_outline', '%\\%%', 'NOT LIKE');
$query
->condition('pattern_outline', '%<%', 'NOT LIKE');
$paths = $query
->execute()
->fetchAllAssoc('url', \PDO::FETCH_ASSOC);
$all_site_pages = array_merge($all_site_pages, $paths);
}
return $all_site_pages;
}
public function findAllValidatedPages() {
$db_result = $this->connection
->select('w3c_validator', 'w')
->fields('w')
->execute();
return $db_result
->fetchAllAssoc('uri', \PDO::FETCH_BOTH);
}
public function validateAllPages(&$context) {
$token = NULL;
$user = NULL;
$query_options = [];
$pages_to_validate = $this
->findAllPages();
$context['message'] = $this
->t('Validating all pages ...');
$context['sandbox']['max'] = count($pages_to_validate);
$context['sandbox']['progress'] = 0;
$context['results']['failures'] = 0;
$context['results']['current_id'] = 0;
$context['results']['processed'] = 0;
if ($this
->moduleSettings()
->get('use_token')) {
$token = $this->w3cTokenManager
->createAccessToken($this->currentUser);
$query_options['query'] = [
'HTTP_W3C_VALIDATOR_TOKEN' => $token,
];
$user = $this->currentUser;
}
else {
$user = new AnonymousUserSession();
}
foreach ($pages_to_validate as $page) {
$context['message'] = $this
->t('Validation for page %title...', [
'%title' => $page['title'],
]);
if (!$this->accessManager
->checkNamedRoute($page['route'], [
'node' => isset($page['nid']) ? $page['nid'] : '',
], $user)) {
$this->logger
->debug($page['title'] . ' at ' . $page['url'] . ' is not accessible for validation.');
$context['results']['failures']++;
}
else {
$this
->validatePage($page, $query_options);
}
$context['sandbox']['progress']++;
$context['results']['current_id']++;
$context['results']['processed']++;
}
$this->w3cTokenManager
->rewokeAccessToken($token);
$context['finished'] = 1;
}
public function validatePage(array $page, array $query_options = []) {
$query_options['absolute'] = TRUE;
$uri = Url::fromUri('base:' . $page['url'], $query_options)
->toString();
$validator = new Validator($this
->getValidatorUrl());
$result = $validator
->validateUrl($uri);
$this
->saveResult($result, $page['url']);
}
public function saveResult(Response $result, $key) {
if (isset($result) && isset($key)) {
$this->connection
->merge("w3c_validator")
->key('uri', rtrim($key, "/"))
->fields([
'uri' => rtrim($key, "/"),
'error_count' => count($result
->getErrors()),
'errors' => serialize($result
->getErrors()),
'warning_count' => count($result
->getWarnings()),
'warnings' => serialize($result
->getWarnings()),
'info_count' => count($result
->getMessages()),
'infos' => serialize($result
->getMessages()),
'need_validation' => 0,
'doctype' => '',
'validity' => $result
->hasErrors() ? 0 : 1,
'charset' => '',
])
->execute();
}
else {
$this->connection
->merge("w3c_validator")
->key('uri', rtrim($key, "/"))
->fields([
'need_validation' => TRUE,
])
->execute();
}
}
protected function moduleSettings() {
if (!isset($this->moduleSettings)) {
$this->moduleSettings = $this->configFactory
->get('w3c_validator.settings');
}
return $this->moduleSettings;
}
}