diff --git a/administrator/components/com_config/src/Controller/ComponentController.php b/administrator/components/com_config/src/Controller/ComponentController.php
index a7718e366b545..247aecede26fb 100644
--- a/administrator/components/com_config/src/Controller/ComponentController.php
+++ b/administrator/components/com_config/src/Controller/ComponentController.php
@@ -161,6 +161,9 @@ public function save($key = null, $urlVar = null)
case 'save':
$this->setMessage(Text::_('COM_CONFIG_SAVE_SUCCESS'), 'message');
+
+ // No break
+
default:
$redirect = 'index.php?option=' . $option;
diff --git a/administrator/components/com_finder/src/Indexer/Query.php b/administrator/components/com_finder/src/Indexer/Query.php
index 50e97d2a4df04..262901fb2df8b 100644
--- a/administrator/components/com_finder/src/Indexer/Query.php
+++ b/administrator/components/com_finder/src/Indexer/Query.php
@@ -17,6 +17,7 @@
use Joomla\CMS\Language\Text;
use Joomla\CMS\Uri\Uri;
use Joomla\Component\Finder\Administrator\Helper\LanguageHelper;
+use Joomla\Component\Finder\Site\Helper\RouteHelper;
use Joomla\Database\DatabaseAwareTrait;
use Joomla\Database\DatabaseInterface;
use Joomla\Database\ParameterType;
@@ -24,8 +25,6 @@
use Joomla\String\StringHelper;
use Joomla\Utilities\ArrayHelper;
-\JLoader::register('FinderHelperRoute', JPATH_SITE . '/components/com_finder/helpers/route.php');
-
/**
* Query class for the Finder indexer package.
*
@@ -385,7 +384,7 @@ public function toUri($base = '')
'q' => $uri->getVar('q'),
);
- $item = \FinderHelperRoute::getItemid($query);
+ $item = RouteHelper::getItemid($query);
// Add the menu item id if present.
if ($item !== null)
@@ -845,7 +844,6 @@ protected function processString($input, $lang, $mode)
// Handle a before and after date filters.
case 'before':
case 'after':
- {
// Get the time offset.
$offset = Factory::getApplication()->get('offset');
@@ -870,11 +868,9 @@ protected function processString($input, $lang, $mode)
}
break;
- }
// Handle a taxonomy branch filter.
default:
- {
// Try to find the node id.
$return = Taxonomy::getNodeByTitle($modifier, $value);
@@ -896,7 +892,6 @@ protected function processString($input, $lang, $mode)
}
break;
- }
}
// Clean up the input string again.
diff --git a/administrator/components/com_users/src/Model/UsersModel.php b/administrator/components/com_users/src/Model/UsersModel.php
index 7ec7fd620a985..2cd6c20c56b6e 100644
--- a/administrator/components/com_users/src/Model/UsersModel.php
+++ b/administrator/components/com_users/src/Model/UsersModel.php
@@ -611,6 +611,9 @@ private function buildDateRange($range)
case 'post_year':
$dNow = false;
+
+ // No break
+
case 'past_year':
$dStart->modify('-1 year');
break;
diff --git a/build/psr12/.editorconfig b/build/psr12/.editorconfig
new file mode 100644
index 0000000000000..6ff9778775236
--- /dev/null
+++ b/build/psr12/.editorconfig
@@ -0,0 +1,16 @@
+# EditorConfig is awesome: https://EditorConfig.org
+
+# top-most EditorConfig file
+root = true
+
+# Unix-style newlines with a newline ending every file
+[*]
+indent_style = space
+indent_size = 4
+end_of_line = lf
+charset = utf-8
+trim_trailing_whitespace = true
+insert_final_newline = true
+
+[*.{js,json,scss,css,vue}]
+indent_size = 2
diff --git a/build/psr12/clean_errors.php b/build/psr12/clean_errors.php
new file mode 100644
index 0000000000000..257cd183d49f8
--- /dev/null
+++ b/build/psr12/clean_errors.php
@@ -0,0 +1,174 @@
+
+ * @license GNU General Public License version 2 or later; see LICENSE.txt
+ */
+
+$tmpDir = dirname(__DIR__) . '/tmp/psr12';
+
+$cleaned = [];
+
+$json = file_get_contents($tmpDir . '/cleanup.json');
+
+$data = json_decode($json, JSON_OBJECT_AS_ARRAY);
+
+// Fixing the later issues in a file first should allow us to preserve the line value per error
+$data = array_reverse($data);
+
+foreach ($data as $error) {
+ $file = file_get_contents($error['file']);
+ switch ($error['cleanup']) {
+ // Remove defined JEXEC statement, PSR-12 doesn't allow functional and symbol code in the same file
+ case 'definedJEXEC':
+ $file = str_replace([
+ /**
+ * I know this looks silly but makes it more clear what's happening
+ * We remove the different types of execution check from files which
+ * only defines symbols (like classes).
+ *
+ * The order is important.
+ */
+ "\defined('_JEXEC') || die();",
+ "defined('_JEXEC') || die();",
+ "\defined('_JEXEC') || die;",
+ "defined('_JEXEC') || die;",
+ "\defined('_JEXEC') or die();",
+ "defined('_JEXEC') or die();",
+ "\defined('_JEXEC') or die;",
+ "defined('_JEXEC') or die;",
+ "\defined('JPATH_PLATFORM') or die();",
+ "defined('JPATH_PLATFORM') or die();",
+ "\defined('JPATH_PLATFORM') or die;",
+ "defined('JPATH_PLATFORM') or die;",
+ "\defined('JPATH_BASE') or die();",
+ "defined('JPATH_BASE') or die();",
+ "\defined('JPATH_BASE') or die;",
+ "defined('JPATH_BASE') or die;",
+ /**
+ * We have variants of comments in front of the 'defined die' statement
+ * which we would like to remove too.
+ *
+ * The order is important.
+ */
+ "// No direct access.",
+ "// No direct access",
+ "// no direct access",
+ "// Restrict direct access",
+ "// Protect from unauthorized access",
+ ], '', $file);
+ break;
+
+ // Not all files need a namespace
+ case 'MissingNamespace':
+ // We search for the end of the first doc block and add the exception for this file
+ $pos = strpos($file, ' */');
+ $file = substr_replace(
+ $file,
+ "\n * @phpcs:disable PSR1.Classes.ClassDeclaration.MissingNamespace\n",
+ $pos,
+ 0
+ );
+
+ break;
+ // Not all classes have to be camelcase
+ case 'ValidClassNameNotCamelCaps':
+ // We search for the end of the first doc block and add the exception for this file
+ $pos = strpos($file, ' */');
+ $file = substr_replace(
+ $file,
+ "\n * @phpcs:disable Squiz.Classes.ValidClassName.NotCamelCaps\n",
+ $pos,
+ 0
+ );
+
+ break;
+
+ case 'ConstantVisibility':
+ // add public to const declaration if defined in a class
+ $fileContent = file($error['file']);
+ $fileContent[$error['line'] - 1] = substr_replace($fileContent[$error['line'] - 1], 'public ', $error['column'] - 1, 0);
+ $file = implode('', $fileContent);
+
+ break;
+
+ case 'SpaceAfterCloseBrace':
+ // We only move single comments (starting with //) to the next line
+
+ $fileContent = file($error['file']);
+
+ $lineNo = $error['line'];
+
+ // We skip blank lines
+ do {
+ $nextLine = ltrim($fileContent[$lineNo]);
+ if (empty($nextLine)) {
+ $lineNo = $lineNo + 1;
+ $nextLine = ltrim($fileContent[$lineNo]);
+ }
+ } while (empty($nextLine));
+
+ $sourceLineStartNo = $lineNo;
+ $sourceLineEndNo = $lineNo;
+ $found = false;
+
+ while (substr(ltrim($fileContent[$sourceLineEndNo]), 0, 2) === '//') {
+ $sourceLineEndNo++;
+ $found = true;
+ }
+
+ if ($sourceLineStartNo === $sourceLineEndNo) {
+ if (substr(ltrim($fileContent[$sourceLineStartNo]), 0, 2) === '/*') {
+ while (substr(ltrim($fileContent[$sourceLineEndNo]), 0, 2) !== '*/') {
+ $sourceLineEndNo++;
+ }
+ $sourceLineEndNo++;
+ $found = true;
+ }
+ }
+
+ if (!$found) {
+ echo "Unrecoverable error while running SpaceAfterCloseBrace cleanup";
+ var_dump($error['file'], $sourceLineStartNo, $sourceLineEndNo);
+ die(1);
+ }
+ $targetLineNo = $sourceLineEndNo + 1;
+
+ // Adjust the indentation to match the next line of code
+ for ($indent = 0; $indent <= strlen($fileContent[$targetLineNo]); $indent++) {
+ if ($fileContent[$targetLineNo][$indent] !== ' ') {
+ break;
+ }
+ }
+
+ $replace = [];
+ for ($i = $sourceLineStartNo; $i < $sourceLineEndNo; $i++) {
+ $newLine = ltrim($fileContent[$i]);
+ // Fix codeblocks not starting with /**
+ if (substr($newLine, 0, 2) === '/*') {
+ $newLine = "/**\n";
+ }
+
+ $localIndent = $indent;
+ if ($newLine[0] === '*') {
+ $localIndent++;
+ }
+ $replace[] = str_repeat(' ', $localIndent) . $newLine;
+ }
+ array_unshift($replace, $fileContent[$sourceLineEndNo]);
+
+ array_splice($fileContent, $sourceLineStartNo, count($replace), $replace);
+
+ $file = implode('', $fileContent);
+
+ break;
+ }
+
+ file_put_contents($error['file'], $file);
+ $cleaned[] = $error['file'] . ' ' . $error['cleanup'];
+}
+
+file_put_contents($tmpDir . '/cleaned.log', implode("\n", $cleaned));
diff --git a/build/psr12/phpcs.joomla.report.php b/build/psr12/phpcs.joomla.report.php
new file mode 100644
index 0000000000000..3707baf9a8168
--- /dev/null
+++ b/build/psr12/phpcs.joomla.report.php
@@ -0,0 +1,316 @@
+
+ * @license GNU General Public License version 2 or later; see LICENSE.txt
+ */
+
+namespace Joomla\Reports;
+
+use PHP_CodeSniffer\Config;
+use PHP_CodeSniffer\Files\File;
+
+use function array_keys;
+use function array_merge;
+use function array_values;
+use function file_exists;
+use function file_get_contents;
+use function file_put_contents;
+use function json_encode;
+use function str_replace;
+
+use const JSON_OBJECT_AS_ARRAY;
+use const JSON_PRETTY_PRINT;
+
+
+class Joomla implements \PHP_CodeSniffer\Reports\Report
+{
+ private $tmpDir = __DIR__ . '/../tmp/psr12';
+
+ private $html = '';
+
+ private $preProcessing = [];
+
+ /**
+ * Generate a partial report for a single processed file.
+ *
+ * Function should return TRUE if it printed or stored data about the file
+ * and FALSE if it ignored the file. Returning TRUE indicates that the file and
+ * its data should be counted in the grand totals.
+ *
+ * @param array $report Prepared report data.
+ * @param \PHP_CodeSniffer\File $phpcsFile The file being reported on.
+ * @param bool $showSources Show sources?
+ * @param int $width Maximum allowed line width.
+ *
+ * @return bool
+ */
+ public function generateFileReport($report, File $phpcsFile, $showSources = false, $width = 80)
+ {
+ if ($report['errors'] === 0 && $report['warnings'] === 0) {
+ return false;
+ }
+
+ $template = [
+ 'headline' => $report['filename'],
+ 'text' => 'Errors: ' . $report['errors'] . ' Warnings: ' . $report['warnings'] . ' Fixable: ' . $report['fixable'],
+ ];
+
+ $this->html = <<
+
{$template['headline']}
+ {$template['text']}
+ HTML;
+
+ foreach ($report['messages'] as $line => $lineErrors) {
+ foreach ($lineErrors as $column => $colErrors) {
+ foreach ($colErrors as $error) {
+ $error['type'] = strtolower($error['type']);
+ if ($phpcsFile->config->encoding !== 'utf-8') {
+ $error['message'] = iconv($phpcsFile->config->encoding, 'utf-8', $error['message']);
+ }
+
+ $error['fixable'] = $error['fixable'] === true ? 'Yes' : 'No';
+
+ $this->html .= <<
+ Line: $line
+ Column: $column
+ Fixable: {$error['fixable']}
+ Severity: {$error['severity']}
+ Rule: {$error['source']}
+ {$error['message']}
+
+ HTML;
+ $this->prepareProcessing($report['filename'],$phpcsFile, $line, $column, $error);
+ }
+ }
+ }
+
+ $this->html .= <<
+ HTML;
+
+ $this->writeFile();
+
+ return true;
+ }
+
+ private function prepareProcessing($file, $phpcsFile, $line, $column, $error) {
+
+ switch ($error['source']) {
+ case 'PSR1.Files.SideEffects.FoundWithSymbols':
+ $fileContent = file_get_contents($file);
+
+ if (
+ strpos($fileContent, "defined('_JEXEC')") !== false
+ || strpos($fileContent, "defined('JPATH_PLATFORM')") !== false
+ || strpos($fileContent, "defined('JPATH_BASE')") !== false
+ ) {
+ $this->preProcessing[] = [
+ 'file' => $file,
+ 'line' => $line,
+ 'column' => $column,
+ 'cleanup' => 'definedJEXEC'
+ ];
+ } else {
+ $targetFile = $this->tmpDir . '/' . $error['source'] . '.txt';
+ $fileContent = '';
+ if (file_exists($targetFile)) {
+ $fileContent = file_get_contents($targetFile);
+ }
+
+ static $replace = null;
+
+ if ($replace === null) {
+ $replace = [
+ "\\" => '/',
+ dirname(dirname(__DIR__)) . '/' => '',
+ '.' => '\.',
+ ];
+ }
+
+ $fileContent .= " " . str_replace(array_keys($replace), $replace, $file) . "\n";
+ file_put_contents($targetFile, $fileContent);
+ }
+ break;
+
+ case 'PSR1.Classes.ClassDeclaration.MissingNamespace':
+ $this->preProcessing[] = [
+ 'file' => $file,
+ 'line' => $line,
+ 'column' => $column,
+ 'cleanup' => 'MissingNamespace'
+ ];
+ break;
+
+ case 'Squiz.Classes.ValidClassName.NotCamelCaps':
+ if (
+ strpos($file, 'localise') !== false
+ || strpos($file, 'recaptcha_invisible') !== false
+ ) {
+ $this->preProcessing[] = [
+ 'file' => $file,
+ 'line' => $line,
+ 'column' => $column,
+ 'cleanup' => 'ValidClassNameNotCamelCaps'
+ ];
+ }
+ break;
+
+ case 'Squiz.ControlStructures.ControlSignature.SpaceAfterCloseBrace':
+ $this->preProcessing[] = [
+ 'file' => $file,
+ 'line' => $line,
+ 'column' => $column,
+ 'cleanup' => 'SpaceAfterCloseBrace'
+ ];
+ break;
+
+ case 'PSR12.Properties.ConstantVisibility.NotFound':
+ $this->preProcessing[] = [
+ 'file' => $file,
+ 'line' => $line,
+ 'column' => $column,
+ 'cleanup' => 'ConstantVisibility'
+ ];
+ break;
+
+ case 'PSR2.Classes.PropertyDeclaration.Underscore':
+ case 'PSR2.Methods.MethodDeclaration.Underscore':
+ case 'PSR1.Classes.ClassDeclaration.MultipleClasses':
+ case 'PSR1.Methods.CamelCapsMethodName.NotCamelCaps':
+
+ $targetFile = $this->tmpDir . '/' . $error['source'] . '.txt';
+ $fileContent = '';
+ if (file_exists($targetFile)) {
+ $fileContent = file_get_contents($targetFile);
+ }
+
+ static $replace = null;
+
+ if ($replace === null) {
+ $replace = [
+ "\\" => '/',
+ dirname(dirname(__DIR__)) . '/' => '',
+ '.' => '\.',
+ ];
+ }
+
+ $fileContent .= " " . str_replace(array_keys($replace), $replace, $file) . "\n";
+ file_put_contents($targetFile, $fileContent);
+ break;
+ }
+ }
+
+ /**
+ * Prints all violations for processed files, in a proprietary XML format.
+ *
+ * @param string $cachedData Any partial report data that was returned from
+ * generateFileReport during the run.
+ * @param int $totalFiles Total number of files processed during the run.
+ * @param int $totalErrors Total number of errors found during the run.
+ * @param int $totalWarnings Total number of warnings found during the run.
+ * @param int $totalFixable Total number of problems that can be fixed.
+ * @param bool $showSources Show sources?
+ * @param int $width Maximum allowed line width.
+ * @param bool $interactive Are we running in interactive mode?
+ * @param bool $toScreen Is the report being printed to screen?
+ *
+ * @return void
+ */
+ public function generate(
+ $cachedData,
+ $totalFiles,
+ $totalErrors,
+ $totalWarnings,
+ $totalFixable,
+ $showSources = false,
+ $width = 80,
+ $interactive = false,
+ $toScreen = true
+ ) {
+
+ $preprocessing = [];
+ if (file_exists($this->tmpDir .'/cleanup.json')) {
+ $preprocessing = json_decode(file_get_contents($this->tmpDir .'/cleanup.json'), JSON_OBJECT_AS_ARRAY);
+ }
+
+ $preprocessing = array_merge($this->preProcessing, $preprocessing);
+ file_put_contents($this->tmpDir .'/cleanup.json', json_encode($preprocessing, JSON_PRETTY_PRINT));
+ }
+
+ private function getTemplate($section)
+ {
+ $sections = [
+ 'header' => <<
+
+ Report
+
+
+
+
+
+
+
+
+
Check
+ HTML,
+ 'footer' => <<
+
+
+
+
+ HTML,
+ 'line' => <<
+
%HEADLINE%
+
%TEXT%
+
+
+ HTML
+ ];
+
+ return $sections[$section];
+ }
+
+ private function htmlAddBlock($headline, $text, $error)
+ {
+ $line = $this->getTemplate('line');
+
+ $replace = [
+ '%HEADLINE%' => $headline,
+ '%TEXT%' => $text,
+ '%ERROR%' => $error,
+ ];
+
+ $this->html .= str_replace(array_keys($replace), $replace, $line);
+ }
+
+ private function writeFile()
+ {
+ $file = $this->tmpDir . '/result.html';
+
+ if (file_exists($file)) {
+ $html = file_get_contents($file);
+ } else {
+ $html = $this->getTemplate('header');
+ $html .= '%PHPCS_NEXT_BLOCK%';
+ $html .= $this->getTemplate('footer');
+ }
+
+ $html = str_replace('%PHPCS_NEXT_BLOCK%', $this->html . '%PHPCS_NEXT_BLOCK%', $html);
+
+ file_put_contents($this->tmpDir . '/result.html', $html);
+ }
+}
diff --git a/build/psr12/psr12_converter.php b/build/psr12/psr12_converter.php
new file mode 100644
index 0000000000000..2e29c1d9e8556
--- /dev/null
+++ b/build/psr12/psr12_converter.php
@@ -0,0 +1,281 @@
+
+ * @license GNU General Public License version 2 or later; see LICENSE.txt
+ */
+
+// Set defaults
+$root = dirname(dirname(__DIR__));
+$php = 'php';
+$git = 'git';
+$tmpDir = $root . '/build/tmp/psr12';
+$checkPath = false;
+$tasks = [
+ 'CBF' => false,
+ 'CS' => false,
+ 'CLEAN' => false,
+ 'CMS' => false,
+ 'BRANCH' => false,
+];
+
+$script = array_shift($argv);
+
+if (empty($argv)) {
+ echo << [path]
+
+ Description:
+ The converter has several tasks which can be run separately.
+ You can combine them seperated by a comma (,).
+
+ Tasks:
+ * CBF
+ This task executes the PHP Code Beautifier and Fixer. It
+ does the heavy lifting making the code PSR-12 compatible.
+ (beware this tasks modifies many files)
+ * CS
+ This task executes the PHP Code Sniffer. It collects all
+ issues and generates a HTML report in build/tmp/psr12.
+ Also it generates a collection of issues which can't be
+ fixed by CBF. This information is saved as json in
+ build/tmp/psr12/cleanup.json. If this option is activated
+ the tmp directory is cleaned before running.
+ * CLEAN
+ This tasks loads the cleanup.json generated by the CS task
+ and changes the cms specific files. After completing this
+ task it re-runs the CBF and CS task.
+ * CMS
+ This tasks activates all other tasks and automatically
+ commits the changes after both CBF runs. Usually only
+ needed for the first cms conversion.
+ * BRANCH
+ This tasks updates all files changed by the current
+ branch compared to the psr12anchor tag. This allows
+ to update a create pull request.
+
+ Path:
+ Providing a path will only check the directories or files
+ specified. It's possible to add multiple files and folder
+ seperated by a comma (,).
+
+
+ TEXT;
+ die(1);
+}
+
+foreach ($argv as $arg) {
+ if (substr($arg, 0, 2) === '--') {
+ $argi = explode('=', $arg, 2);
+ switch ($argi[0]) {
+ case '--task':
+ foreach ($tasks as $task => $value) {
+ if (stripos($argi[1], $task) !== false) {
+ $tasks[$task] = true;
+ }
+ }
+ break;
+ }
+ } else {
+ $checkPath = $arg;
+ break;
+ }
+}
+
+if ($tasks['CMS']) {
+ $tasks['CBF'] = true;
+ $tasks['CS'] = true;
+ $tasks['CLEAN'] = true;
+}
+
+if ($tasks['BRANCH']) {
+ $tasks['CMS'] = true;
+ $tasks['CBF'] = true;
+ $tasks['CS'] = true;
+ $tasks['CLEAN'] = true;
+
+ $cmd = $git . ' --no-pager diff --name-only psr12anchor..HEAD';
+ exec($cmd, $output, $result);
+ if ($result !== 0) {
+ die('Unable to find changes for this branch');
+ }
+ foreach($output as $k => $line) {
+ if (substr($line, -4) !== '.php') {
+ unset($output[$k]);
+ }
+ }
+
+ $checkPath = implode(',', $output);
+}
+
+$items = [];
+if ($checkPath) {
+ $items = explode(',', $checkPath);
+} else {
+ $items[] = 'index.php';
+ $items[] = 'administrator/index.php';
+
+ $baseFolders = [
+ 'administrator/components',
+ 'administrator/includes',
+ 'administrator/language',
+ 'administrator/modules',
+ 'administrator/templates',
+ 'api',
+ 'cli',
+ 'components',
+ 'includes',
+ 'installation',
+ 'language',
+ 'layouts',
+ 'libraries',
+ 'modules',
+ 'plugins',
+ 'templates',
+ ];
+
+ foreach ($baseFolders as $folder) {
+ $dir = dir($root . '/' . $folder);
+ while (false !== ($entry = $dir->read())) {
+ if (($entry === ".") || ($entry === "..")) {
+ continue;
+ }
+ if (!is_dir($dir->path . '/' . $entry)) {
+ if (substr($entry, -4) !== '.php') {
+ continue;
+ }
+ }
+ if (
+ $folder === 'libraries'
+ && (
+ $entry === 'php-encryption'
+ || $entry === 'phpass'
+ || $entry === 'vendor'
+ )
+ ) {
+ continue;
+ }
+ $items[] = str_replace($root . '/', '', $dir->path) . '/' . $entry;
+ }
+ $dir->close();
+ }
+}
+$executedTasks = implode(
+ ',',
+ array_keys(
+ array_filter($tasks, function ($task) {
+ return $task;
+ })
+ )
+);
+$executedPaths = implode("\n", $items);
+
+echo <<
+
+ The Joomla CMS PSR-12 exceptions.
+
+
+ build/*
+ cache/*
+ docs/*
+ logs/*
+ media/*
+ node_modules/*
+ tmp/*
+ tests/*
+
+
+ libraries/php-encryption/*
+ libraries/phpass/*
+ libraries/vendor/*
+
+ stubs.php
+ configuration.php
+
+
+
+
+
+
+
+
+
+
+
+
+
+ administrator/components/com_banners/src/Controller/BannersController\.php
+
+
+
+ administrator/components/com_banners/src/Model/DownloadModel\.php
+ administrator/components/com_banners/src/Table/BannerTable\.php
+ administrator/components/com_banners/src/Table/ClientTable\.php
+ administrator/components/com_cache/src/Model/CacheModel\.php
+ administrator/components/com_contact/src/Table/ContactTable\.php
+ administrator/components/com_fields/src/Table/FieldTable\.php
+ administrator/components/com_fields/src/Table/GroupTable\.php
+ administrator/components/com_finder/src/Table/FilterTable\.php
+ administrator/components/com_finder/src/Table/LinkTable\.php
+ administrator/components/com_installer/src/Model/DatabaseModel\.php
+ administrator/components/com_installer/src/Model/InstallModel\.php
+ administrator/components/com_installer/src/Table/UpdatesiteTable\.php
+ administrator/components/com_mails/src/Table/TemplateTable\.php
+ administrator/components/com_menus/src/Helper/MenusHelper\.php
+ administrator/components/com_menus/src/Model/MenuModel\.php
+ administrator/components/com_newsfeeds/src/Table/NewsfeedTable\.php
+ administrator/components/com_plugins/src/Model/PluginModel\.php
+ administrator/components/com_privacy/src/Table/RequestTable\.php
+ administrator/components/com_scheduler/src/Table/TaskTable\.php
+ administrator/components/com_tags/src/Table/TagTable\.php
+ administrator/components/com_templates/src/Model/StyleModel\.php
+ administrator/components/com_users/src/Model/UserModel\.php
+ administrator/components/com_users/src/Table/NoteTable\.php
+ administrator/components/com_workflow/src/Table/StageTable\.php
+ administrator/components/com_workflow/src/Table/TransitionTable\.php
+ administrator/components/com_workflow/src/Table/WorkflowTable\.php
+ components/com_banners/src/Model/BannerModel\.php
+ components/com_contact/src/Model/CategoriesModel\.php
+ components/com_contact/src/Model/CategoryModel\.php
+ components/com_contact/src/Model/ContactModel\.php
+ components/com_content/src/Model/ArchiveModel\.php
+ components/com_content/src/Model/ArticleModel\.php
+ components/com_content/src/Model/CategoriesModel\.php
+ components/com_content/src/Model/CategoryModel\.php
+ components/com_content/src/Model/FeaturedModel\.php
+ components/com_newsfeeds/src/Model/CategoriesModel\.php
+ components/com_newsfeeds/src/Model/CategoryModel\.php
+ components/com_newsfeeds/src/Model/NewsfeedModel\.php
+ components/com_tags/src/Model/TagsModel\.php
+ installation/src/View/Preinstall/HtmlView\.php
+ libraries/src/Adapter/Adapter\.php
+ libraries/src/Application/ApplicationHelper\.php
+ libraries/src/Cache/Cache\.php
+ libraries/src/Cache/CacheStorage\.php
+ libraries/src/Cache/Controller/OutputController\.php
+ libraries/src/Cache/Controller/PageController\.php
+ libraries/src/Cache/Storage/FileStorage\.php
+ libraries/src/Cache/Storage/MemcachedStorage\.php
+ libraries/src/Cache/Storage/RedisStorage\.php
+ libraries/src/Categories/Categories\.php
+ libraries/src/Categories/CategoryNode\.php
+ libraries/src/Client/FtpClient\.php
+ libraries/src/Document/Document\.php
+ libraries/src/Document/DocumentRenderer\.php
+ libraries/src/Document/ErrorDocument\.php
+ libraries/src/Document/HtmlDocument\.php
+ libraries/src/Document/JsonDocument\.php
+ libraries/src/Document/OpensearchDocument\.php
+ libraries/src/Document/Renderer/Feed/AtomRenderer\.php
+ libraries/src/Document/Renderer/Feed/RssRenderer\.php
+ libraries/src/Editor/Editor\.php
+ libraries/src/Encrypt/Totp\.php
+ libraries/src/Form/Field/CaptchaField\.php
+ libraries/src/Input/Json\.php
+ libraries/src/MVC/Model/DatabaseAwareTrait\.php
+ libraries/src/MVC/Model/FormBehaviorTrait\.php
+ libraries/src/MVC/Model/ItemModel\.php
+ libraries/src/MVC/Model/StateBehaviorTrait\.php
+ libraries/src/MVC/View/AbstractView\.php
+ libraries/src/MVC/View/HtmlView\.php
+ libraries/src/MVC/View/JsonView\.php
+ libraries/src/Object/CMSObject\.php
+ libraries/src/Plugin/CMSPlugin\.php
+ libraries/src/Router/Route\.php
+ libraries/src/Table/Category\.php
+ libraries/src/Table/Content\.php
+ libraries/src/Table/CoreContent\.php
+ libraries/src/Table/Extension\.php
+ libraries/src/Table/Menu\.php
+ libraries/src/Table/Module\.php
+ libraries/src/Table/Nested\.php
+ libraries/src/Table/Table\.php
+ libraries/src/Table/Update\.php
+ libraries/src/Table/User\.php
+ libraries/src/Toolbar/Toolbar\.php
+ libraries/src/Tree/ImmutableNodeTrait\.php
+ libraries/src/Updater/UpdateAdapter\.php
+ libraries/src/User/User\.php
+ plugins/editors/tinymce/tinymce\.php
+ plugins/system/cache/cache\.php
+
+
+
+ administrator/components/com_content/src/Service/HTML/Icon\.php
+ administrator/components/com_installer/src/Controller/InstallController\.php
+ administrator/components/com_installer/src/Model/DiscoverModel\.php
+ administrator/components/com_installer/src/Model/WarningsModel\.php
+ administrator/components/com_users/src/Service/HTML/Users\.php
+ components/com_content/helpers/icon\.php
+ components/com_content/helpers/icon\.php
+ libraries/src/Filesystem/Stream\.php
+ libraries/src/Filesystem/Streams/StreamString\.php
+ libraries/src/Installer/Adapter/ComponentAdapter\.php
+ libraries/src/Installer/Adapter/LanguageAdapter\.php
+ libraries/src/Installer/Adapter/ModuleAdapter\.php
+ libraries/src/Installer/Installer\.php
+ libraries/src/Installer/InstallerAdapter\.php
+ libraries/src/Language/Transliterate\.php
+ libraries/src/Mail/Mail\.php
+ libraries/src/Pagination/Pagination\.php
+ libraries/src/Toolbar/ToolbarHelper\.php
+ libraries/src/Utility/BufferStreamHandler\.php
+
+
+
+
+ libraries/cms\.php
+ libraries/loader\.php
+
+
+ administrator/components/com_fields/src/Model/FieldsModel\.php
+ administrator/components/com_fields/src/Model/GroupsModel\.php
+ administrator/components/com_fields/src/Table/FieldTable\.php
+ administrator/components/com_fields/src/Table/GroupTable\.php
+ administrator/components/com_finder/src/Model/MapsModel\.php
+ administrator/components/com_installer/src/Model/InstallerModel\.php
+ administrator/components/com_installer/src/Model/InstallModel\.php
+ administrator/components/com_installer/src/Model/LanguagesModel\.php
+ administrator/components/com_installer/src/Model/UpdateModel\.php
+ administrator/components/com_login/src/Model/LoginModel\.php
+ administrator/components/com_modules/src/Model/ModulesModel\.php
+ administrator/components/com_plugins/src/Model/PluginsModel\.php
+ administrator/components/com_scheduler/src/Model/TasksModel\.php
+ administrator/components/com_scheduler/src/Table/TaskTable\.php
+ administrator/components/com_users/src/Model/UsersModel\.php
+ administrator/components/com_workflow/src/Table/StageTable\.php
+ administrator/components/com_workflow/src/Table/TransitionTable\.php
+ administrator/components/com_workflow/src/Table/WorkflowTable\.php
+ api/components/com_contact/src/Controller/ContactController\.php
+ components/com_config/src/View/Config/HtmlView\.php
+ components/com_config/src/View/Modules/HtmlView\.php
+ components/com_config/src/View/Templates/HtmlView\.php
+ components/com_contact/src/Controller/ContactController\.php
+ components/com_contact/src/View/Contact/HtmlView\.php
+ components/com_contact/src/View/Featured/HtmlView\.php
+ components/com_contact/src/View/Form/HtmlView\.php
+ components/com_content/src/Model/CategoryModel\.php
+ components/com_content/src/View/Archive/HtmlView\.php
+ components/com_content/src/View/Article/HtmlView\.php
+ components/com_content/src/View/Featured/HtmlView\.php
+ components/com_content/src/View/Form/HtmlView\.php
+ components/com_newsfeeds/src/View/Newsfeed/HtmlView\.php
+ components/com_tags/src/Helper/RouteHelper\.php
+ components/com_tags/src/View/Tag/HtmlView\.php
+ components/com_tags/src/View/Tags/HtmlView\.php
+ installation/src/Form/Field/Installation/LanguageField\.php
+ libraries/src/Cache/Cache\.php
+ libraries/src/Cache/CacheStorage\.php
+ libraries/src/Cache/Controller/CallbackController\.php
+ libraries/src/Cache/Controller/PageController\.php
+ libraries/src/Cache/Controller/ViewController\.php
+ libraries/src/Cache/Storage/FileStorage\.php
+ libraries/src/Cache/Storage/MemcachedStorage\.php
+ libraries/src/Captcha/Captcha\.php
+ libraries/src/Categories/Categories\.php
+ libraries/src/Client/FtpClient\.php
+ libraries/src/Document/Document\.php
+ libraries/src/Document/DocumentRenderer\.php
+ libraries/src/Document/HtmlDocument\.php
+ libraries/src/Editor/Editor\.php
+ libraries/src/Encrypt/Base32\.php
+ libraries/src/Environment/Browser\.php
+ libraries/src/Feed/FeedFactory\.php
+ libraries/src/Filesystem/Folder\.php
+ libraries/src/Filesystem/Stream\.php
+ libraries/src/Filesystem/Support/StringController\.php
+ libraries/src/HTML/Helpers/Grid\.php
+ libraries/src/Installer/Adapter/ComponentAdapter\.php
+ libraries/src/Installer/Adapter/LanguageAdapter\.php
+ libraries/src/Installer/Adapter/ModuleAdapter\.php
+ libraries/src/Installer/Adapter/PackageAdapter\.php
+ libraries/src/MVC/Model/BaseDatabaseModel\.php
+ libraries/src/MVC/Model/LegacyModelLoaderTrait\.php
+ libraries/src/MVC/Model/ListModel\.php
+ libraries/src/MVC/View/HtmlView\.php
+ libraries/src/Pagination/Pagination\.php
+ libraries/src/Table/Category\.php
+ libraries/src/Table/Category\.php
+ libraries/src/Table/Content\.php
+ libraries/src/Table/Language\.php
+ libraries/src/Table/MenuType\.php
+ libraries/src/Table/Module\.php
+ libraries/src/Table/Nested\.php
+ libraries/src/Table/Table\.php
+ libraries/src/Toolbar/Button/ConfirmButton\.php
+ libraries/src/Toolbar/Button/HelpButton\.php
+ libraries/src/Toolbar/Button/PopupButton\.php
+ libraries/src/Toolbar/Button/StandardButton\.php
+ libraries/src/Updater/Adapter/CollectionAdapter\.php
+ libraries/src/Updater/Adapter/ExtensionAdapter\.php
+ libraries/src/Updater/Update\.php
+ libraries/src/Updater/UpdateAdapter\.php
+ modules/mod_articles_category/src/Helper/ArticlesCategoryHelper\.php
+ plugins/content/emailcloak/emailcloak\.php
+ plugins/content/joomla/joomla\.php
+ plugins/content/loadmodule/loadmodule\.php
+ plugins/content/pagebreak/pagebreak\.php
+ plugins/editors/none/none\.php
+ plugins/user/joomla/joomla\.php
+
+
+
+
+ administrator/components/com_joomlaupdate/finalisation\.php
+
+
+
+
+ administrator/components/com_installer/src/Model/DatabaseModel\.php
+ libraries/src/Client/FtpClient\.php
+ libraries/src/Filesystem/Path\.php
+ libraries/src/Filesystem/Streams/StreamString\.php
+
+
+ index\.php
+ administrator/index\.php
+ administrator/components/com_joomlaupdate/extract\.php
+ administrator/components/com_joomlaupdate/restore_finalisation\.php
+ administrator/includes/app\.php
+ administrator/includes/defines\.php
+ administrator/includes/framework\.php
+ api/includes/app\.php
+ api/includes/defines\.php
+ api/includes/framework\.php
+ api/index\.php
+ cli/joomla\.php
+ includes/app\.php
+ includes/defines\.php
+ includes/framework\.php
+ installation/includes/app\.php
+ installation/includes/defines\.php
+ installation/index\.php
+ libraries/cms\.php
+ libraries/bootstrap\.php
+ libraries/import\.php
+ libraries/import\.legacy\.php
+ libraries/loader\.php
+
+
diff --git a/layouts/joomla/content/blog_style_default_item_title.php b/layouts/joomla/content/blog_style_default_item_title.php
index b2a5ec482e854..24a594496a065 100644
--- a/layouts/joomla/content/blog_style_default_item_title.php
+++ b/layouts/joomla/content/blog_style_default_item_title.php
@@ -19,15 +19,14 @@
$canEdit = $displayData->params->get('access-edit');
$currentDate = Factory::getDate()->format('Y-m-d H:i:s');
+$link = RouteHelper::getArticleRoute($displayData->slug, $displayData->catid, $displayData->language);
?>
state == 0 || $params->get('show_title') || ($params->get('show_author') && !empty($displayData->author ))) : ?>