diff --git a/modules/mod_articles_archive/mod_articles_archive.php b/modules/mod_articles_archive/mod_articles_archive.php deleted file mode 100644 index 8dcbb077f60ea..0000000000000 --- a/modules/mod_articles_archive/mod_articles_archive.php +++ /dev/null @@ -1,19 +0,0 @@ - - * @license GNU General Public License version 2 or later; see LICENSE.txt - */ - -defined('_JEXEC') or die; - -use Joomla\CMS\Helper\ModuleHelper; -use Joomla\Module\ArticlesArchive\Site\Helper\ArticlesArchiveHelper; - -$params->def('count', 10); -$list = ArticlesArchiveHelper::getList($params); - -require ModuleHelper::getLayoutPath('mod_articles_archive', $params->get('layout', 'default')); diff --git a/modules/mod_articles_archive/mod_articles_archive.xml b/modules/mod_articles_archive/mod_articles_archive.xml index c901862bfeb36..cb86243aaafb2 100644 --- a/modules/mod_articles_archive/mod_articles_archive.xml +++ b/modules/mod_articles_archive/mod_articles_archive.xml @@ -11,7 +11,7 @@ MOD_ARTICLES_ARCHIVE_XML_DESCRIPTION Joomla\Module\ArticlesArchive - mod_articles_archive.php + services src tmpl diff --git a/modules/mod_articles_archive/services/provider.php b/modules/mod_articles_archive/services/provider.php new file mode 100644 index 0000000000000..1a248c7e243d7 --- /dev/null +++ b/modules/mod_articles_archive/services/provider.php @@ -0,0 +1,41 @@ + + * @license GNU General Public License version 2 or later; see LICENSE.txt + */ + +defined('_JEXEC') or die; + +use Joomla\CMS\Extension\Service\Provider\HelperFactory; +use Joomla\CMS\Extension\Service\Provider\Module; +use Joomla\CMS\Extension\Service\Provider\ModuleDispatcherFactory; +use Joomla\DI\Container; +use Joomla\DI\ServiceProviderInterface; + +/** + * The articles archive module service provider. + * + * @since __DEPLOY_VERSION__ + */ +return new class () implements ServiceProviderInterface { + /** + * Registers the service provider with a DI container. + * + * @param Container $container The DI container. + * + * @return void + * + * @since __DEPLOY_VERSION__ + */ + public function register(Container $container): void + { + $container->registerServiceProvider(new ModuleDispatcherFactory('\\Joomla\\Module\\ArticlesArchive')); + $container->registerServiceProvider(new HelperFactory('\\Joomla\\Module\\ArticlesArchive\\Site\\Helper')); + + $container->registerServiceProvider(new Module()); + } +}; diff --git a/modules/mod_articles_archive/src/Dispatcher/Dispatcher.php b/modules/mod_articles_archive/src/Dispatcher/Dispatcher.php new file mode 100644 index 0000000000000..4c7ae5784b37a --- /dev/null +++ b/modules/mod_articles_archive/src/Dispatcher/Dispatcher.php @@ -0,0 +1,45 @@ + + * @license GNU General Public License version 2 or later; see LICENSE.txt + */ + +namespace Joomla\Module\ArticlesArchive\Site\Dispatcher; + +use Joomla\CMS\Dispatcher\AbstractModuleDispatcher; +use Joomla\CMS\Helper\HelperFactoryAwareInterface; +use Joomla\CMS\Helper\HelperFactoryAwareTrait; + +// phpcs:disable PSR1.Files.SideEffects +\defined('JPATH_PLATFORM') or die; +// phpcs:enable PSR1.Files.SideEffects + +/** + * Dispatcher class for mod_articles_archive + * + * @since __DEPLOY_VERSION__ + */ +class Dispatcher extends AbstractModuleDispatcher implements HelperFactoryAwareInterface +{ + use HelperFactoryAwareTrait; + + /** + * Returns the layout data. + * + * @return array + * + * @since __DEPLOY_VERSION__ + */ + protected function getLayoutData(): array + { + $data = parent::getLayoutData(); + + $data['list'] = $this->getHelperFactory()->getHelper('ArticlesArchiveHelper')->getArticlesByMonths($data['params'], $data['app']); + + return $data; + } +} diff --git a/modules/mod_articles_archive/src/Helper/ArticlesArchiveHelper.php b/modules/mod_articles_archive/src/Helper/ArticlesArchiveHelper.php index 1ba223d884165..6501488a302b2 100644 --- a/modules/mod_articles_archive/src/Helper/ArticlesArchiveHelper.php +++ b/modules/mod_articles_archive/src/Helper/ArticlesArchiveHelper.php @@ -10,12 +10,16 @@ namespace Joomla\Module\ArticlesArchive\Site\Helper; +use Joomla\CMS\Application\SiteApplication; use Joomla\CMS\Factory; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; use Joomla\Component\Content\Administrator\Extension\ContentComponent; +use Joomla\Database\DatabaseAwareInterface; +use Joomla\Database\DatabaseAwareTrait; use Joomla\Database\ParameterType; +use Joomla\Registry\Registry; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; @@ -26,21 +30,23 @@ * * @since 1.5 */ -class ArticlesArchiveHelper +class ArticlesArchiveHelper implements DatabaseAwareInterface { + use DatabaseAwareTrait; + /** - * Retrieve list of archived articles + * Retrieve a list of months with archived articles * - * @param \Joomla\Registry\Registry &$params module parameters + * @param Registry $moduleParams The module parameters. + * @param SiteApplication $app The current application. * - * @return array + * @return \stdClass[] * - * @since 1.5 + * @since __DEPLOY_VERSION__ */ - public static function getList(&$params) + public function getArticlesByMonths(Registry $moduleParams, SiteApplication $app): array { - $app = Factory::getApplication(); - $db = Factory::getDbo(); + $db = $this->getDatabase(); $query = $db->getQuery(true); $query->select($query->month($db->quoteName('created')) . ' AS created_month') @@ -53,10 +59,10 @@ public static function getList(&$params) // Filter by language if ($app->getLanguageFilter()) { - $query->whereIn($db->quoteName('language'), [Factory::getLanguage()->getTag(), '*'], ParameterType::STRING); + $query->whereIn($db->quoteName('language'), [$app->getLanguage()->getTag(), '*'], ParameterType::STRING); } - $query->setLimit((int) $params->get('count')); + $query->setLimit((int) $moduleParams->get('count')); $db->setQuery($query); try { @@ -93,4 +99,27 @@ public static function getList(&$params) return $lists; } + + /** + * Retrieve list of archived articles + * + * @param Registry &$params module parameters + * + * @return \stdClass[] + * + * @since 1.5 + * + * @deprecated __DEPLOY_VERSION__ will be removed in 6.0 + * Use the non-static method getArticlesByMonths + * Example: Factory::getApplication()->bootModule('mod_articles_archive', 'site') + * ->getHelper('ArticlesArchiveHelper') + * ->getArticlesByMonths($params, Factory::getApplication()) + */ + public static function getList(&$params) + { + /** @var SiteApplication $app */ + $app = Factory::getApplication(); + + return (new self())->getArticlesByMonths($params, $app); + } } diff --git a/tests/System/integration/site/modules/mod_articles_archive/Default.cy.js b/tests/System/integration/site/modules/mod_articles_archive/Default.cy.js new file mode 100644 index 0000000000000..8054afed4a961 --- /dev/null +++ b/tests/System/integration/site/modules/mod_articles_archive/Default.cy.js @@ -0,0 +1,11 @@ +describe('Test the articles archive module', () => { + it('can load in frontend and showing a list of months with archived articles', () => { + cy.db_createArticle({ state: 2, created: '2022-09-09 20:00:00', modified: '2022-09-09 20:00:00' }) + .then(() => cy.db_createModule({ module: 'mod_articles_archive' })) + .then(() => { + cy.visit('/'); + + cy.contains('li', 'September, 2022'); + }); + }); +});