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%

+
+
%ERROR%
+
+ + 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 .= ''; + $html .= $this->getTemplate('footer'); + } + + $html = str_replace('', $this->html . '', $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 ))) : ?>