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');
+ });
+ });
+});