summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGreg Roach <fisharebest@webtrees.net>2019-01-24 12:44:02 +0000
committerGreg Roach <fisharebest@webtrees.net>2019-01-24 12:49:45 +0000
commit63276d8f3b702807b282100a6302f3d6329b2617 (patch)
tree030510a7a29942cf403429f938dd6f15c5c8ebfb
parent6a83cfe82cf72deb988ef6a54a7440e72b1b45e5 (diff)
downloadwebtrees-63276d8f3b702807b282100a6302f3d6329b2617.tar.gz
webtrees-63276d8f3b702807b282100a6302f3d6329b2617.tar.bz2
webtrees-63276d8f3b702807b282100a6302f3d6329b2617.zip
Refactoring module API
-rw-r--r--app/Functions/FunctionsEdit.php2
-rw-r--r--app/Http/Controllers/AbstractBaseController.php24
-rw-r--r--app/Http/Controllers/AdminController.php7
-rw-r--r--app/Http/Controllers/AdminModuleController.php2
-rw-r--r--app/Http/Controllers/EditGedcomRecordController.php2
-rw-r--r--app/Http/Controllers/HomePageController.php59
-rw-r--r--app/Http/Controllers/IndividualController.php10
-rw-r--r--app/Http/Controllers/ModuleController.php2
-rw-r--r--app/Http/Controllers/ReportEngineController.php2
-rw-r--r--app/Http/Middleware/DebugBarData.php2
-rw-r--r--app/Module.php158
-rw-r--r--app/Module/ChartsBlockModule.php10
-rw-r--r--app/Module/ChartsMenuModule.php2
-rw-r--r--app/Module/FamilyTreeFavoritesModule.php2
-rw-r--r--app/Module/FamilyTreeNewsModule.php2
-rw-r--r--app/Module/FamilyTreeStatisticsModule.php2
-rw-r--r--app/Module/HtmlBlockModule.php2
-rw-r--r--app/Module/IndividualFactsTabModule.php3
-rw-r--r--app/Module/LoggedInUsersModule.php2
-rw-r--r--app/Module/LoginBlockModule.php2
-rw-r--r--app/Module/ModuleBlockInterface.php2
-rw-r--r--app/Module/OnThisDayModule.php2
-rw-r--r--app/Module/RecentChangesModule.php2
-rw-r--r--app/Module/ReportsMenuModule.php2
-rw-r--r--app/Module/ResearchTaskModule.php2
-rw-r--r--app/Module/ReviewChangesModule.php2
-rw-r--r--app/Module/SlideShowModule.php2
-rw-r--r--app/Module/ThemeSelectModule.php2
-rw-r--r--app/Module/TopGivenNamesModule.php2
-rw-r--r--app/Module/TopPageViewsModule.php2
-rw-r--r--app/Module/TopSurnamesModule.php2
-rw-r--r--app/Module/UpcomingAnniversariesModule.php2
-rw-r--r--app/Module/UserFavoritesModule.php2
-rw-r--r--app/Module/UserJournalModule.php2
-rw-r--r--app/Module/UserMessagesModule.php2
-rw-r--r--app/Module/UserWelcomeModule.php4
-rw-r--r--app/Module/WelcomeBlockModule.php4
-rw-r--r--app/Module/YahrzeitModule.php2
-rw-r--r--app/Stats.php29
-rw-r--r--app/Theme/AbstractTheme.php10
-rw-r--r--resources/views/media-page-menu.phtml2
-rw-r--r--resources/views/modules/ckeditor/ckeditor-js.phtml2
42 files changed, 127 insertions, 253 deletions
diff --git a/app/Functions/FunctionsEdit.php b/app/Functions/FunctionsEdit.php
index 05cc5cfc18..c29f7b5ad6 100644
--- a/app/Functions/FunctionsEdit.php
+++ b/app/Functions/FunctionsEdit.php
@@ -583,7 +583,7 @@ class FunctionsEdit
'census_places' => Census::censusPlaces(WT_LOCALE),
]);
- $census_assistant = Module::getModuleByClassName(CensusAssistantModule::class);
+ $census_assistant = Module::findByClass(CensusAssistantModule::class);
$record = Individual::getInstance($xref, $tree);
if ($census_assistant instanceof CensusAssistantModule && $record instanceof Individual) {
diff --git a/app/Http/Controllers/AbstractBaseController.php b/app/Http/Controllers/AbstractBaseController.php
index 3fb1c05e31..8a3e3b2ece 100644
--- a/app/Http/Controllers/AbstractBaseController.php
+++ b/app/Http/Controllers/AbstractBaseController.php
@@ -54,30 +54,6 @@ abstract class AbstractBaseController
protected $layout = 'layouts/default';
/**
- * Check that a module is enabled for a tree.
- *
- * @param Tree $tree
- * @param string $class_name
- *
- * @throws NotFoundHttpException
- * @return ModuleChartInterface
- */
- protected function checkModuleIsActive(Tree $tree, string $class_name): ModuleChartInterface
- {
- $module = Module::activeCharts($tree)
- ->filter(function (ModuleChartInterface $module) use ($class_name): bool {
- return $module instanceof $class_name;
- })
- ->first();
-
- if (!$module instanceof $class_name) {
- throw new NotFoundHttpException(I18N::translate('The module ā€œ%sā€ has been disabled.', $module));
- }
-
- return $module;
- }
-
- /**
* Create a response object from a view.
*
* @param string $view_name
diff --git a/app/Http/Controllers/AdminController.php b/app/Http/Controllers/AdminController.php
index 1e3f46dc1f..2fda694bb2 100644
--- a/app/Http/Controllers/AdminController.php
+++ b/app/Http/Controllers/AdminController.php
@@ -34,6 +34,7 @@ use Fisharebest\Webtrees\Media;
use Fisharebest\Webtrees\Module;
use Fisharebest\Webtrees\Module\ModuleBlockInterface;
use Fisharebest\Webtrees\Module\ModuleChartInterface;
+use Fisharebest\Webtrees\Module\ModuleConfigInterface;
use Fisharebest\Webtrees\Module\ModuleInterface;
use Fisharebest\Webtrees\Module\ModuleMenuInterface;
use Fisharebest\Webtrees\Module\ModuleReportInterface;
@@ -127,7 +128,7 @@ class AdminController extends AbstractBaseController
'files_to_delete' => $files_to_delete,
'all_modules' => Module::all(),
'deleted_modules' => $this->deletedModuleNames(),
- 'config_modules' => Module::configurableModules(),
+ 'config_modules' => Module::findByInterface(ModuleConfigInterface::class),
]);
}
@@ -1039,7 +1040,7 @@ class AdminController extends AbstractBaseController
{
$component = $request->get('component');
$interface = $request->get('interface');
- $modules = Module::getAllModulesByInterface($interface);
+ $modules = Module::findByInterface($interface);
foreach ($modules as $module) {
foreach (Tree::getAll() as $tree) {
@@ -1194,7 +1195,7 @@ class AdminController extends AbstractBaseController
'component' => $component,
'component_title' => $component_title,
'interface' => $interface,
- 'modules' => Module::getAllModulesByInterface($interface),
+ 'modules' => Module::findByInterface($interface),
'title' => $title,
'route' => $route,
]);
diff --git a/app/Http/Controllers/AdminModuleController.php b/app/Http/Controllers/AdminModuleController.php
index d2f5ac2a19..13d0052b27 100644
--- a/app/Http/Controllers/AdminModuleController.php
+++ b/app/Http/Controllers/AdminModuleController.php
@@ -44,7 +44,7 @@ class AdminModuleController extends AdminController
// Check that the module is enabled.
// The module itself will need to check any tree-level access,
// which may be different for each component (tab, menu, etc.) of the module.
- $module = Module::getModuleByName($module_name);
+ $module = Module::findByName($module_name);
// We'll call a function such as Module::getFooBarAction()
$verb = strtolower($request->getMethod());
diff --git a/app/Http/Controllers/EditGedcomRecordController.php b/app/Http/Controllers/EditGedcomRecordController.php
index 6e616d20b1..6b52df27fe 100644
--- a/app/Http/Controllers/EditGedcomRecordController.php
+++ b/app/Http/Controllers/EditGedcomRecordController.php
@@ -428,7 +428,7 @@ class EditGedcomRecordController extends AbstractEditController
$newged = substr($newged, 1); // Remove leading newline
- $census_assistant = Module::getModuleByClassName(CensusAssistantModule::class);
+ $census_assistant = Module::findByClass(CensusAssistantModule::class);
if ($census_assistant instanceof CensusAssistantModule && $record instanceof Individual) {
$newged = $census_assistant->updateCensusAssistant($request, $record, $fact_id, $newged, $keep_chan);
}
diff --git a/app/Http/Controllers/HomePageController.php b/app/Http/Controllers/HomePageController.php
index 16a73c6391..ff2194b6ec 100644
--- a/app/Http/Controllers/HomePageController.php
+++ b/app/Http/Controllers/HomePageController.php
@@ -18,7 +18,6 @@ declare(strict_types=1);
namespace Fisharebest\Webtrees\Http\Controllers;
use Fisharebest\Webtrees\Auth;
-use Fisharebest\Webtrees\DebugBar;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Module;
use Fisharebest\Webtrees\Module\ModuleBlockInterface;
@@ -104,7 +103,7 @@ class HomePageController extends AbstractBaseController
throw new NotFoundHttpException();
}
- $module = Module::getModuleByName($block->module_name);
+ $module = Module::findByName($block->module_name);
if (!$module instanceof ModuleBlockInterface) {
throw new NotFoundHttpException();
@@ -182,7 +181,7 @@ class HomePageController extends AbstractBaseController
throw new NotFoundHttpException('This block does not exist');
}
- $module = Module::getModuleByName($block->module_name);
+ $module = Module::findByName($block->module_name);
if (!$module instanceof ModuleBlockInterface) {
throw new NotFoundHttpException($block->module_name . ' is not a block');
@@ -230,27 +229,20 @@ class HomePageController extends AbstractBaseController
*/
public function treePageBlock(Request $request, Tree $tree): Response
{
- $block_id = (int) $request->get('block_id');
+ $block_id = $request->get('block_id');
- $block = DB::table('block')
+ $block_id = (int) DB::table('block')
->where('block_id', '=', $block_id)
->where('gedcom_id', '=', $tree->id())
- ->whereNull('user_id')
- ->first();
+ ->value('block_id');
- $module = $this->getBlockModule($tree, $block_id);
- if ($block === null || $module === null) {
- return new Response('', Response::HTTP_NOT_FOUND);
- }
+ $module = $this->getBlockModule($tree, $block_id);
$html = view('layouts/ajax', [
'content' => $module->getBlock($tree, $block_id, 'gedcom'),
]);
- // Use HTTP headers and some jQuery to add debug to the current page.
- DebugBar::sendDataInHeaders();
-
return new Response($html);
}
@@ -383,27 +375,19 @@ class HomePageController extends AbstractBaseController
*/
public function userPageBlock(Request $request, Tree $tree, User $user): Response
{
- $block_id = (int) $request->get('block_id');
+ $block_id = $request->get('block_id');
- $block = DB::table('block')
+ $block_id = (int) DB::table('block')
->where('block_id', '=', $block_id)
->where('user_id', '=', $user->id())
- ->whereNull('gedcom_id')
- ->first();
+ ->value('block_id');
$module = $this->getBlockModule($tree, $block_id);
- if ($block === null || $module === null) {
- return new Response('Block not found', Response::HTTP_NOT_FOUND);
- }
-
$html = view('layouts/ajax', [
'content' => $module->getBlock($tree, $block_id, 'user'),
]);
- // Use HTTP headers and some jQuery to add debug to the current page.
- DebugBar::sendDataInHeaders();
-
return new Response($html);
}
@@ -556,21 +540,26 @@ class HomePageController extends AbstractBaseController
* @param Tree $tree
* @param int $block_id
*
- * @return ModuleBlockInterface|null
+ * @return ModuleBlockInterface
+ * @throws NotFoundHttpException
*/
- private function getBlockModule(Tree $tree, int $block_id)
+ private function getBlockModule(Tree $tree, int $block_id): ModuleBlockInterface
{
- $active_blocks = Module::activeBlocks($tree);
+ $active_blocks = Module::findByComponent('block', $tree, Auth::user());
$module_name = DB::table('block')
- ->join('module', 'block.module_name', '=', 'module.module_name')
->where('block_id', '=', $block_id)
- ->where('status', '=', 'enabled')
- ->value('module.module_name');
+ ->value('module_name');
- return $active_blocks->filter(function (ModuleInterface $module) use ($module_name): bool {
+ $block = $active_blocks->filter(function (ModuleInterface $module) use ($module_name): bool {
return $module->name() === $module_name;
})->first();
+
+ if ($block === null) {
+ throw new NotFoundHttpException('Block not found');
+ }
+
+ return $block;
}
/**
@@ -580,9 +569,9 @@ class HomePageController extends AbstractBaseController
*/
private function getAvailableTreeBlocks(): Collection
{
- return Module::getAllModulesByInterface(ModuleBlockInterface::class)
+ return Module::findByInterface(ModuleBlockInterface::class)
->filter(function (ModuleBlockInterface $block): bool {
- return $block->isGedcomBlock();
+ return $block->isTreeBlock();
})
->mapWithKeys(function (ModuleInterface $block): array {
return [$block->name() => $block];
@@ -596,7 +585,7 @@ class HomePageController extends AbstractBaseController
*/
private function getAvailableUserBlocks(): Collection
{
- return Module::getAllModulesByInterface(ModuleBlockInterface::class)
+ return Module::findByInterface(ModuleBlockInterface::class)
->filter(function (ModuleBlockInterface $block): bool {
return $block->isUserBlock();
})
diff --git a/app/Http/Controllers/IndividualController.php b/app/Http/Controllers/IndividualController.php
index 22d252a1f5..fae94deffa 100644
--- a/app/Http/Controllers/IndividualController.php
+++ b/app/Http/Controllers/IndividualController.php
@@ -162,7 +162,7 @@ class IndividualController extends AbstractBaseController
$xref = $request->get('xref', '');
$record = Individual::getInstance($xref, $tree);
$tab = $request->get('module');
- $tabs = Module::activeTabs($tree);
+ $tabs = Module::findByComponent('tab', $tree, Auth::user());
if ($record === null || !array_key_exists($tab, $tabs)) {
return new Response('', Response::HTTP_NOT_FOUND);
@@ -407,7 +407,7 @@ class IndividualController extends AbstractBaseController
*/
public function getSidebars(Individual $individual): Collection
{
- return Module::activeSidebars($individual->tree())
+ return Module::findByComponent('sidebar', $individual->tree(), Auth::user())
->filter(function (ModuleSidebarInterface $sidebar) use ($individual): bool {
return $sidebar->hasSidebarContent($individual);
});
@@ -423,9 +423,9 @@ class IndividualController extends AbstractBaseController
*/
public function getTabs(Individual $individual): Collection
{
- return Module::activeTabs($individual->tree())
- ->filter(function (ModuleTabInterface $sidebar) use ($individual): bool {
- return $sidebar->hasTabContent($individual);
+ return Module::findByComponent('tab', $individual->tree(), Auth::user())
+ ->filter(function (ModuleTabInterface $tab) use ($individual): bool {
+ return $tab->hasTabContent($individual);
});
}
diff --git a/app/Http/Controllers/ModuleController.php b/app/Http/Controllers/ModuleController.php
index 41e50719f2..ac4048b7f7 100644
--- a/app/Http/Controllers/ModuleController.php
+++ b/app/Http/Controllers/ModuleController.php
@@ -48,7 +48,7 @@ class ModuleController extends AbstractBaseController
// Check that the module is enabled.
// The module itself will need to check any tree-level access,
// which may be different for each component (tab, menu, etc.) of the module.
- $module = Module::getModuleByName($module_name);
+ $module = Module::findByName($module_name);
// We'll call a function such as Module::getFooBarAction()
$verb = strtolower($request->getMethod());
diff --git a/app/Http/Controllers/ReportEngineController.php b/app/Http/Controllers/ReportEngineController.php
index 41c294e27e..af73b1cd0d 100644
--- a/app/Http/Controllers/ReportEngineController.php
+++ b/app/Http/Controllers/ReportEngineController.php
@@ -288,7 +288,7 @@ class ReportEngineController extends AbstractBaseController
{
$reports = [];
- foreach (Module::activeReports($tree) as $report) {
+ foreach (Module::findByComponent('report', $tree, Auth::user()) as $report) {
$reports[$report->name()] = $report->title();
}
diff --git a/app/Http/Middleware/DebugBarData.php b/app/Http/Middleware/DebugBarData.php
index 30e2aca489..92bce128c1 100644
--- a/app/Http/Middleware/DebugBarData.php
+++ b/app/Http/Middleware/DebugBarData.php
@@ -42,7 +42,7 @@ class DebugBarData implements MiddlewareInterface
if ($response instanceof RedirectResponse) {
// Show the debug data on the next page
DebugBar::stackData();
- } elseif ($response instanceof JsonResponse) {
+ } elseif ($request->isXmlHttpRequest()) {
// Use HTTP headers and some jQuery to add debug to the current page.
DebugBar::sendDataInHeaders();
}
diff --git a/app/Module.php b/app/Module.php
index b6ee9848e0..a72273c0a4 100644
--- a/app/Module.php
+++ b/app/Module.php
@@ -20,13 +20,11 @@ namespace Fisharebest\Webtrees;
use Closure;
use Fisharebest\Webtrees\Module\ModuleBlockInterface;
use Fisharebest\Webtrees\Module\ModuleChartInterface;
-use Fisharebest\Webtrees\Module\ModuleConfigInterface;
use Fisharebest\Webtrees\Module\ModuleInterface;
use Fisharebest\Webtrees\Module\ModuleMenuInterface;
use Fisharebest\Webtrees\Module\ModuleReportInterface;
use Fisharebest\Webtrees\Module\ModuleSidebarInterface;
use Fisharebest\Webtrees\Module\ModuleTabInterface;
-use Fisharebest\Webtrees\Module\ModuleThemeInterface;
use Illuminate\Database\Capsule\Manager as DB;
use Illuminate\Support\Collection;
use Illuminate\Support\Str;
@@ -117,6 +115,16 @@ class Module
'yahrzeit',
];
+ // Some types of module have different access levels in different trees.
+ private const COMPONENTS = [
+ 'block' => ModuleBlockInterface::class,
+ 'chart' => ModuleChartInterface::class,
+ 'menu' => ModuleMenuInterface::class,
+ 'report' => ModuleReportInterface::class,
+ 'sidebar' => ModuleSidebarInterface::class,
+ 'tab' => ModuleTabInterface::class,
+ ];
+
/**
* All modules.
*
@@ -144,7 +152,7 @@ class Module
->map(function (string $filename) use ($module_info): ?ModuleInterface {
try {
$module_name = basename(dirname($filename));
- $module = self::loadModule($filename);
+ $module = self::load($filename);
if ($module instanceof ModuleInterface) {
$module->setName($module_name);
@@ -178,7 +186,8 @@ class Module
return null;
}
})
- ->filter();
+ ->filter()
+ ->sort(self::moduleSorter());
});
}
@@ -189,7 +198,7 @@ class Module
*
* @return mixed
*/
- private static function loadModule(string $filename)
+ private static function load(string $filename)
{
return include $filename;
}
@@ -243,33 +252,32 @@ class Module
}
/**
- * Get a list of modules which (a) provide a specific function and (b) we have permission to see.
+ * Modules which (a) provide a specific function and (b) we have permission to see.
*
- * @param Tree $tree
- * @param string $interface
* @param string $component
+ * @param Tree $tree
+ * @param User $user
*
- * @return Collection|ModuleBlockInterface[]|ModuleChartInterface[]|ModuleMenuInterface[]|ModuleReportInterface[]|ModuleSidebarInterface[]|ModuleTabInterface[]|ModuleThemeInterface[]
+ * @return Collection|ModuleBlockInterface[]|ModuleChartInterface[]|ModuleMenuInterface[]|ModuleReportInterface[]|ModuleSidebarInterface[]|ModuleTabInterface[]
*/
- private static function getActiveModulesByComponent(Tree $tree, string $interface, string $component): Collection
+ public static function findByComponent(string $component, Tree $tree, User $user): Collection
{
- return self::all()
- ->filter(function (ModuleInterface $module) use ($interface, $component, $tree): bool {
- return
- $module->isEnabled() &&
- $module instanceof $interface &&
- $module->accessLevel($tree, $component) >= Auth::accessLevel($tree);
+ $interface = self::COMPONENTS[$component];
+
+ return self::findByInterface($interface)
+ ->filter(function (ModuleInterface $module) use ($component, $tree, $user): bool {
+ return $module->accessLevel($tree, $component) >= Auth::accessLevel($tree, $user);
});
- }
+ }
/**
- * Get a list of all modules, enabled or not, which provide a specific function.
+ * All modules which provide a specific function.
*
* @param string $interface
*
* @return Collection|ModuleInterface[]
*/
- public static function getAllModulesByInterface(string $interface): Collection
+ public static function findByInterface(string $interface): Collection
{
$modules = self::all()
->filter(function (ModuleInterface $module) use ($interface): bool {
@@ -285,115 +293,9 @@ class Module
case ModuleTabInterface::class:
return $modules->sort(self::tabSorter());
-
- default:
- return $modules->sort(self::moduleSorter());
}
- }
-
- /**
- * Get a list of modules which (a) provide a block and (b) we have permission to see.
- *
- * @param Tree $tree
- *
- * @return Collection|ModuleBlockInterface[]
- */
- public static function activeBlocks(Tree $tree): Collection
- {
- return self::getActiveModulesByComponent($tree, ModuleBlockInterface::class, 'block')
- ->sort(self::moduleSorter());
- }
-
- /**
- * Get a list of modules which (a) provide a chart and (b) we have permission to see.
- *
- * @param Tree $tree
- *
- * @return Collection|ModuleChartInterface[]
- */
- public static function activeCharts(Tree $tree): Collection
- {
- return self::getActiveModulesByComponent($tree, ModuleChartInterface::class, 'chart')
- ->sort(self::moduleSorter());
- }
-
- /**
- * Get a list of module names which have configuration options.
- *
- * @return Collection|ModuleConfigInterface[]
- */
- public static function configurableModules(): Collection
- {
- return self::all()
- ->filter(function (ModuleInterface $module): bool {
- return $module->isEnabled() && $module instanceof ModuleConfigInterface;
- })
- ->sort(self::moduleSorter());
- }
-
- /**
- * Get a list of modules which (a) provide a menu and (b) we have permission to see.
- *
- * @param Tree $tree
- *
- * @return Collection|ModuleMenuInterface[]
- */
- public static function activeMenus(Tree $tree): Collection
- {
- return self::getActiveModulesByComponent($tree, ModuleMenuInterface::class, 'menu')
- ->sort(self::menuSorter());
- }
-
- /**
- * Get a list of modules which (a) provide a report and (b) we have permission to see.
- *
- * @param Tree $tree
- *
- * @return Collection|ModuleReportInterface[]
- */
- public static function activeReports(Tree $tree): Collection
- {
- return self::getActiveModulesByComponent($tree, ModuleReportInterface::class, 'report')
- ->sort(self::moduleSorter());
- }
-
- /**
- * Get a list of modules which (a) provide a sidebar and (b) we have permission to see.
- *
- * @param Tree $tree
- *
- * @return Collection|ModuleSidebarInterface[]
- */
- public static function activeSidebars(Tree $tree): Collection
- {
- return self::getActiveModulesByComponent($tree, ModuleSidebarInterface::class, 'sidebar')
- ->sort(self::sidebarSorter());
- }
-
- /**
- * Get a list of modules which (a) provide a tab and (b) we have permission to see.
- *
- * @param Tree $tree
- *
- * @return Collection|ModuleTabInterface[]
- */
- public static function activeTabs(Tree $tree): Collection
- {
- return self::getActiveModulesByComponent($tree, ModuleTabInterface::class, 'tab')
- ->sort(self::tabSorter());
- }
- /**
- * Get a list of modules which (a) provide a theme and (b) we have permission to see.
- *
- * @param Tree $tree
- *
- * @return Collection|ModuleThemeInterface[]
- */
- public static function activeThemes(Tree $tree): Collection
- {
- return self::getActiveModulesByComponent($tree, ModuleThemeInterface::class, 'theme')
- ->sort(self::moduleSorter());
+ return $modules;
}
/**
@@ -403,7 +305,7 @@ class Module
*
* @return ModuleInterface|null
*/
- public static function getModuleByName(string $module_name): ?ModuleInterface
+ public static function findByName(string $module_name): ?ModuleInterface
{
return self::all()
->filter(function (ModuleInterface $module) use ($module_name): bool {
@@ -419,7 +321,7 @@ class Module
*
* @return ModuleInterface|null
*/
- public static function getModuleByClassName(string $class_name): ?ModuleInterface
+ public static function findByClass(string $class_name): ?ModuleInterface
{
return self::all()
->filter(function (ModuleInterface $module) use ($class_name): bool {
diff --git a/app/Module/ChartsBlockModule.php b/app/Module/ChartsBlockModule.php
index d1a0d145d5..e28c4c482c 100644
--- a/app/Module/ChartsBlockModule.php
+++ b/app/Module/ChartsBlockModule.php
@@ -88,7 +88,7 @@ class ChartsBlockModule extends AbstractModule implements ModuleInterface, Modul
default:
case 'pedigree':
/** @var PedigreeChartModule $module */
- $module = Module::getModuleByClassName(PedigreeChartModule::class);
+ $module = Module::findByClass(PedigreeChartModule::class);
$title = $module->chartTitle($person);
$chart_url = $module->chartUrl($person, [
'ajax' => true,
@@ -103,7 +103,7 @@ class ChartsBlockModule extends AbstractModule implements ModuleInterface, Modul
case 'descendants':
/** @var DescendancyChartModule $module */
- $module = Module::getModuleByClassName(DescendancyChartModule::class);
+ $module = Module::findByClass(DescendancyChartModule::class);
$title = $module->chartTitle($person);
$chart_url = $module->chartUrl($person, [
'ajax' => true,
@@ -118,7 +118,7 @@ class ChartsBlockModule extends AbstractModule implements ModuleInterface, Modul
case 'hourglass':
/** @var HourglassChartModule $module */
- $module = Module::getModuleByClassName(HourglassChartModule::class);
+ $module = Module::findByClass(HourglassChartModule::class);
$title = $module->chartTitle($person);
$chart_url = $module->chartUrl($person, [
'ajax' => true,
@@ -132,7 +132,7 @@ class ChartsBlockModule extends AbstractModule implements ModuleInterface, Modul
case 'treenav':
/** @var InteractiveTreeModule $module */
- $module = Module::getModuleByClassName(InteractiveTreeModule::class);
+ $module = Module::findByClass(InteractiveTreeModule::class);
$title = I18N::translate('Interactive tree of %s', $person->getFullName());
$tv = new TreeView();
$content = '<script>$("head").append(\'<link rel="stylesheet" href="' . $module->css() . '" type="text/css" />\');</script>';
@@ -185,7 +185,7 @@ class ChartsBlockModule extends AbstractModule implements ModuleInterface, Modul
}
/** {@inheritdoc} */
- public function isGedcomBlock(): bool
+ public function isTreeBlock(): bool
{
return true;
}
diff --git a/app/Module/ChartsMenuModule.php b/app/Module/ChartsMenuModule.php
index 8e41dbaf04..a6d459b5e1 100644
--- a/app/Module/ChartsMenuModule.php
+++ b/app/Module/ChartsMenuModule.php
@@ -76,7 +76,7 @@ class ChartsMenuModule extends AbstractModule implements ModuleInterface, Module
$request = Request::createFromGlobals();
$xref = $request->get('xref', '');
$individual = Individual::getInstance($xref, $tree) ?? $tree->significantIndividual(Auth::user());
- $submenus = Module::activeCharts($tree)
+ $submenus = Module::findByComponent('chart', $tree, Auth::user())
->map(function (ModuleChartInterface $module) use ($individual): Menu {
return $module->chartMenu($individual);
});
diff --git a/app/Module/FamilyTreeFavoritesModule.php b/app/Module/FamilyTreeFavoritesModule.php
index 3cebbddf73..53404c8455 100644
--- a/app/Module/FamilyTreeFavoritesModule.php
+++ b/app/Module/FamilyTreeFavoritesModule.php
@@ -116,7 +116,7 @@ class FamilyTreeFavoritesModule extends AbstractModule implements ModuleInterfac
*
* @return bool
*/
- public function isGedcomBlock(): bool
+ public function isTreeBlock(): bool
{
return true;
}
diff --git a/app/Module/FamilyTreeNewsModule.php b/app/Module/FamilyTreeNewsModule.php
index 02aef58f4e..8e610a833e 100644
--- a/app/Module/FamilyTreeNewsModule.php
+++ b/app/Module/FamilyTreeNewsModule.php
@@ -105,7 +105,7 @@ class FamilyTreeNewsModule extends AbstractModule implements ModuleInterface, Mo
}
/** {@inheritdoc} */
- public function isGedcomBlock(): bool
+ public function isTreeBlock(): bool
{
return true;
}
diff --git a/app/Module/FamilyTreeStatisticsModule.php b/app/Module/FamilyTreeStatisticsModule.php
index 0e4e9afd5f..61bef1b007 100644
--- a/app/Module/FamilyTreeStatisticsModule.php
+++ b/app/Module/FamilyTreeStatisticsModule.php
@@ -187,7 +187,7 @@ class FamilyTreeStatisticsModule extends AbstractModule implements ModuleInterfa
}
/** {@inheritdoc} */
- public function isGedcomBlock(): bool
+ public function isTreeBlock(): bool
{
return true;
}
diff --git a/app/Module/HtmlBlockModule.php b/app/Module/HtmlBlockModule.php
index 96c9194cb5..3ff4c727a2 100644
--- a/app/Module/HtmlBlockModule.php
+++ b/app/Module/HtmlBlockModule.php
@@ -127,7 +127,7 @@ class HtmlBlockModule extends AbstractModule implements ModuleInterface, ModuleB
}
/** {@inheritdoc} */
- public function isGedcomBlock(): bool
+ public function isTreeBlock(): bool
{
return true;
}
diff --git a/app/Module/IndividualFactsTabModule.php b/app/Module/IndividualFactsTabModule.php
index c0abf84d37..74ab353f50 100644
--- a/app/Module/IndividualFactsTabModule.php
+++ b/app/Module/IndividualFactsTabModule.php
@@ -17,6 +17,7 @@ declare(strict_types=1);
namespace Fisharebest\Webtrees\Module;
+use Fisharebest\Webtrees\Auth;
use Fisharebest\Webtrees\Date;
use Fisharebest\Webtrees\Fact;
use Fisharebest\Webtrees\Family;
@@ -93,7 +94,7 @@ class IndividualFactsTabModule extends AbstractModule implements ModuleInterface
break;
default:
- $use_extra_info_module = Module::activeSidebars($individual->tree())
+ $use_extra_info_module = Module::findByComponent('sidebar', $individual->tree(), Auth::user())
->filter(function (ModuleInterface $module): bool {
return $module instanceof ExtraInformationModule;
})->isNotEmpty();
diff --git a/app/Module/LoggedInUsersModule.php b/app/Module/LoggedInUsersModule.php
index eb9c19da07..c0b6c6938f 100644
--- a/app/Module/LoggedInUsersModule.php
+++ b/app/Module/LoggedInUsersModule.php
@@ -137,7 +137,7 @@ class LoggedInUsersModule extends AbstractModule implements ModuleInterface, Mod
}
/** {@inheritdoc} */
- public function isGedcomBlock(): bool
+ public function isTreeBlock(): bool
{
return true;
}
diff --git a/app/Module/LoginBlockModule.php b/app/Module/LoginBlockModule.php
index 011b0d3868..2ead102e5a 100644
--- a/app/Module/LoginBlockModule.php
+++ b/app/Module/LoginBlockModule.php
@@ -102,7 +102,7 @@ class LoginBlockModule extends AbstractModule implements ModuleInterface, Module
}
/** {@inheritdoc} */
- public function isGedcomBlock(): bool
+ public function isTreeBlock(): bool
{
return true;
}
diff --git a/app/Module/ModuleBlockInterface.php b/app/Module/ModuleBlockInterface.php
index 9493d4cba8..773264ca18 100644
--- a/app/Module/ModuleBlockInterface.php
+++ b/app/Module/ModuleBlockInterface.php
@@ -59,7 +59,7 @@ interface ModuleBlockInterface
*
* @return bool
*/
- public function isGedcomBlock(): bool;
+ public function isTreeBlock(): bool;
/**
* An HTML form to edit block settings
diff --git a/app/Module/OnThisDayModule.php b/app/Module/OnThisDayModule.php
index da899a2c16..2fa940d90c 100644
--- a/app/Module/OnThisDayModule.php
+++ b/app/Module/OnThisDayModule.php
@@ -183,7 +183,7 @@ class OnThisDayModule extends AbstractModule implements ModuleInterface, ModuleB
}
/** {@inheritdoc} */
- public function isGedcomBlock(): bool
+ public function isTreeBlock(): bool
{
return true;
}
diff --git a/app/Module/RecentChangesModule.php b/app/Module/RecentChangesModule.php
index bd9c95d787..794061ed38 100644
--- a/app/Module/RecentChangesModule.php
+++ b/app/Module/RecentChangesModule.php
@@ -139,7 +139,7 @@ class RecentChangesModule extends AbstractModule implements ModuleInterface, Mod
}
/** {@inheritdoc} */
- public function isGedcomBlock(): bool
+ public function isTreeBlock(): bool
{
return true;
}
diff --git a/app/Module/ReportsMenuModule.php b/app/Module/ReportsMenuModule.php
index 0e2d34bfff..b8c34f0fc5 100644
--- a/app/Module/ReportsMenuModule.php
+++ b/app/Module/ReportsMenuModule.php
@@ -77,7 +77,7 @@ class ReportsMenuModule extends AbstractModule implements ModuleInterface, Modul
$request = Request::createFromGlobals();
$xref = $request->get('xref', '');
$individual = Individual::getInstance($xref, $tree) ?? $tree->significantIndividual(Auth::user());
- $submenus = Module::activeReports($tree)
+ $submenus = Module::findByComponent('report', $tree, Auth::user())
->map(function (ModuleReportInterface $module) use ($individual): Menu {
return $module->getReportMenu($individual);
});
diff --git a/app/Module/ResearchTaskModule.php b/app/Module/ResearchTaskModule.php
index 6a9b0e09cd..70f53e270c 100644
--- a/app/Module/ResearchTaskModule.php
+++ b/app/Module/ResearchTaskModule.php
@@ -145,7 +145,7 @@ class ResearchTaskModule extends AbstractModule implements ModuleInterface, Modu
}
/** {@inheritdoc} */
- public function isGedcomBlock(): bool
+ public function isTreeBlock(): bool
{
return true;
}
diff --git a/app/Module/ReviewChangesModule.php b/app/Module/ReviewChangesModule.php
index cd0338a8c4..ac83ee5e58 100644
--- a/app/Module/ReviewChangesModule.php
+++ b/app/Module/ReviewChangesModule.php
@@ -178,7 +178,7 @@ class ReviewChangesModule extends AbstractModule implements ModuleInterface, Mod
}
/** {@inheritdoc} */
- public function isGedcomBlock(): bool
+ public function isTreeBlock(): bool
{
return true;
}
diff --git a/app/Module/SlideShowModule.php b/app/Module/SlideShowModule.php
index 79b51c7d31..ea13e01325 100644
--- a/app/Module/SlideShowModule.php
+++ b/app/Module/SlideShowModule.php
@@ -185,7 +185,7 @@ class SlideShowModule extends AbstractModule implements ModuleInterface, ModuleB
}
/** {@inheritdoc} */
- public function isGedcomBlock(): bool
+ public function isTreeBlock(): bool
{
return true;
}
diff --git a/app/Module/ThemeSelectModule.php b/app/Module/ThemeSelectModule.php
index 5e63469cdb..3973d27d04 100644
--- a/app/Module/ThemeSelectModule.php
+++ b/app/Module/ThemeSelectModule.php
@@ -97,7 +97,7 @@ class ThemeSelectModule extends AbstractModule implements ModuleInterface, Modul
}
/** {@inheritdoc} */
- public function isGedcomBlock(): bool
+ public function isTreeBlock(): bool
{
return true;
}
diff --git a/app/Module/TopGivenNamesModule.php b/app/Module/TopGivenNamesModule.php
index 8849d67a54..d2e8f93d5a 100644
--- a/app/Module/TopGivenNamesModule.php
+++ b/app/Module/TopGivenNamesModule.php
@@ -141,7 +141,7 @@ class TopGivenNamesModule extends AbstractModule implements ModuleInterface, Mod
}
/** {@inheritdoc} */
- public function isGedcomBlock(): bool
+ public function isTreeBlock(): bool
{
return true;
}
diff --git a/app/Module/TopPageViewsModule.php b/app/Module/TopPageViewsModule.php
index f35237a6ef..918847f1bf 100644
--- a/app/Module/TopPageViewsModule.php
+++ b/app/Module/TopPageViewsModule.php
@@ -149,7 +149,7 @@ class TopPageViewsModule extends AbstractModule implements ModuleInterface, Modu
*
* @return bool
*/
- public function isGedcomBlock(): bool
+ public function isTreeBlock(): bool
{
return true;
}
diff --git a/app/Module/TopSurnamesModule.php b/app/Module/TopSurnamesModule.php
index 5e16768320..fcf1acf8cc 100644
--- a/app/Module/TopSurnamesModule.php
+++ b/app/Module/TopSurnamesModule.php
@@ -170,7 +170,7 @@ class TopSurnamesModule extends AbstractModule implements ModuleInterface, Modul
}
/** {@inheritdoc} */
- public function isGedcomBlock(): bool
+ public function isTreeBlock(): bool
{
return true;
}
diff --git a/app/Module/UpcomingAnniversariesModule.php b/app/Module/UpcomingAnniversariesModule.php
index d34f3e2566..e7529e314f 100644
--- a/app/Module/UpcomingAnniversariesModule.php
+++ b/app/Module/UpcomingAnniversariesModule.php
@@ -202,7 +202,7 @@ class UpcomingAnniversariesModule extends AbstractModule implements ModuleInterf
}
/** {@inheritdoc} */
- public function isGedcomBlock(): bool
+ public function isTreeBlock(): bool
{
return true;
}
diff --git a/app/Module/UserFavoritesModule.php b/app/Module/UserFavoritesModule.php
index 771300b949..c670427e59 100644
--- a/app/Module/UserFavoritesModule.php
+++ b/app/Module/UserFavoritesModule.php
@@ -115,7 +115,7 @@ class UserFavoritesModule extends AbstractModule implements ModuleInterface, Mod
*
* @return bool
*/
- public function isGedcomBlock(): bool
+ public function isTreeBlock(): bool
{
return false;
}
diff --git a/app/Module/UserJournalModule.php b/app/Module/UserJournalModule.php
index 7cf8eb5a62..2b22ad8eaf 100644
--- a/app/Module/UserJournalModule.php
+++ b/app/Module/UserJournalModule.php
@@ -105,7 +105,7 @@ class UserJournalModule extends AbstractModule implements ModuleInterface, Modul
}
/** {@inheritdoc} */
- public function isGedcomBlock(): bool
+ public function isTreeBlock(): bool
{
return false;
}
diff --git a/app/Module/UserMessagesModule.php b/app/Module/UserMessagesModule.php
index aea940f690..88d747aad3 100644
--- a/app/Module/UserMessagesModule.php
+++ b/app/Module/UserMessagesModule.php
@@ -215,7 +215,7 @@ class UserMessagesModule extends AbstractModule implements ModuleInterface, Modu
}
/** {@inheritdoc} */
- public function isGedcomBlock(): bool
+ public function isTreeBlock(): bool
{
return false;
}
diff --git a/app/Module/UserWelcomeModule.php b/app/Module/UserWelcomeModule.php
index 27006dc080..b9a0ebb392 100644
--- a/app/Module/UserWelcomeModule.php
+++ b/app/Module/UserWelcomeModule.php
@@ -69,7 +69,7 @@ class UserWelcomeModule extends AbstractModule implements ModuleInterface, Modul
$individual = Individual::getInstance($gedcomid, $tree);
$links = [];
- $pedigree_chart = Module::activeCharts($tree)
+ $pedigree_chart = Module::findByComponent('chart', $tree, Auth::user())
->filter(function (ModuleInterface $module): bool {
return $module instanceof PedigreeChartModule;
});
@@ -131,7 +131,7 @@ class UserWelcomeModule extends AbstractModule implements ModuleInterface, Modul
}
/** {@inheritdoc} */
- public function isGedcomBlock(): bool
+ public function isTreeBlock(): bool
{
return false;
}
diff --git a/app/Module/WelcomeBlockModule.php b/app/Module/WelcomeBlockModule.php
index f52556b7f5..e83aeda920 100644
--- a/app/Module/WelcomeBlockModule.php
+++ b/app/Module/WelcomeBlockModule.php
@@ -69,7 +69,7 @@ class WelcomeBlockModule extends AbstractModule implements ModuleInterface, Modu
$links = [];
- $pedigree_chart = Module::activeCharts($tree)
+ $pedigree_chart = Module::findByComponent('chart', $tree, Auth::user())
->filter(function (ModuleInterface $module): bool {
return $module instanceof PedigreeChartModule;
});
@@ -127,7 +127,7 @@ class WelcomeBlockModule extends AbstractModule implements ModuleInterface, Modu
}
/** {@inheritdoc} */
- public function isGedcomBlock(): bool
+ public function isTreeBlock(): bool
{
return true;
}
diff --git a/app/Module/YahrzeitModule.php b/app/Module/YahrzeitModule.php
index b3a8fee406..9777aa9a8d 100644
--- a/app/Module/YahrzeitModule.php
+++ b/app/Module/YahrzeitModule.php
@@ -198,7 +198,7 @@ class YahrzeitModule extends AbstractModule implements ModuleInterface, ModuleBl
}
/** {@inheritdoc} */
- public function isGedcomBlock(): bool
+ public function isTreeBlock(): bool
{
return true;
}
diff --git a/app/Stats.php b/app/Stats.php
index ccf50a0369..395fe41300 100644
--- a/app/Stats.php
+++ b/app/Stats.php
@@ -22,6 +22,8 @@ use Fisharebest\Webtrees\Functions\FunctionsPrint;
use Fisharebest\Webtrees\Functions\FunctionsPrintLists;
use Fisharebest\Webtrees\Http\Middleware\PageHitCounter;
use Fisharebest\Webtrees\Module\FamilyTreeFavoritesModule;
+use Fisharebest\Webtrees\Module\ModuleBlockInterface;
+use Fisharebest\Webtrees\Module\ModuleInterface;
use Fisharebest\Webtrees\Module\UserFavoritesModule;
use PDOException;
use stdClass;
@@ -6626,12 +6628,10 @@ class Stats
*/
public function gedcomFavorites(): string
{
- $module = Module::getModuleByName('gedcom_favorites');
+ $module = Module::findByClass(FamilyTreeFavoritesModule::class);
if ($module instanceof FamilyTreeFavoritesModule) {
- $block = new FamilyTreeFavoritesModule(Webtrees::MODULES_PATH . 'gedcom_favorites');
-
- return $block->getBlock($this->tree, 0, '');
+ return $module->getBlock($this->tree, 0, '');
}
return '';
@@ -6644,10 +6644,10 @@ class Stats
*/
public function userFavorites(): string
{
- if (Auth::check() && Module::getModuleByName('user_favorites')) {
- $block = new UserFavoritesModule(Webtrees::MODULES_PATH . 'gedcom_favorites');
+ $module = Module::findByClass(UserFavoritesModule::class);
- return $block->getBlock($this->tree, 0, '');
+ if ($module instanceof UserFavoritesModule) {
+ return $module->getBlock($this->tree, 0, '');
}
return '';
@@ -6662,7 +6662,7 @@ class Stats
{
$count = 0;
- $module = Module::getModuleByName('gedcom_favorites');
+ $module = Module::findByClass(FamilyTreeFavoritesModule::class);
if ($module instanceof FamilyTreeFavoritesModule) {
$count = count($module->getFavorites($this->tree));
@@ -6680,7 +6680,7 @@ class Stats
{
$count = 0;
- $module = Module::getModuleByName('user_favorites');
+ $module = Module::findByClass(UserFavoritesModule::class);
if ($module instanceof UserFavoritesModule) {
$count = count($module->getFavorites($this->tree, Auth::user()));
@@ -6700,9 +6700,14 @@ class Stats
*/
public function callBlock(string $block = '', ...$params): string
{
- $all_blocks = Module::activeBlocks($this->tree);
+ /** @var ModuleBlockInterface $block */
+ $block = Module::findByComponent('block', $this->tree, Auth::user())
+ ->filter(function (ModuleInterface $block): bool {
+ return $block->name() === $block && $block->name() !== 'html';
+ })
+ ->first;
- if (!array_key_exists($block, $all_blocks) || $block == 'html') {
+ if ($block === null) {
return '';
}
// Build the config array
@@ -6715,7 +6720,7 @@ class Stats
$v = array_shift($bits);
$cfg[$v] = implode('=', $bits);
}
- $block = $all_blocks[$block];
+
$content = $block->getBlock($this->tree, 0, '', $cfg);
return $content;
diff --git a/app/Theme/AbstractTheme.php b/app/Theme/AbstractTheme.php
index 82d1930eb2..de71a0e7c3 100644
--- a/app/Theme/AbstractTheme.php
+++ b/app/Theme/AbstractTheme.php
@@ -740,7 +740,7 @@ abstract class AbstractTheme
public function individualBoxMenuCharts(Individual $individual): array
{
$menus = [];
- foreach (Module::activeCharts($this->tree) as $chart) {
+ foreach (Module::findByComponent('chart', $this->tree, Auth::user()) as $chart) {
$menu = $chart->chartBoxMenu($individual);
if ($menu) {
$menus[] = $menu;
@@ -853,8 +853,8 @@ abstract class AbstractTheme
{
global $controller;
- $user_favorites_module = Module::getModuleByClassName(UserFavoritesModule::class);
- $tree_favorites_module = Module::getModuleByClassName(FamilyTreeFavoritesModule::class);
+ $user_favorites_module = Module::findByClass(UserFavoritesModule::class);
+ $tree_favorites_module = Module::findByClass(FamilyTreeFavoritesModule::class);
$user_favorites = [];
if ($this->tree instanceof Tree && $user_favorites_module instanceof UserFavoritesModule && Auth::check()) {
@@ -1036,7 +1036,7 @@ abstract class AbstractTheme
{
$gedcomid = $this->tree->getUserPreference(Auth::user(), 'gedcomid');
- $pedigree_chart = Module::activeCharts($this->tree)
+ $pedigree_chart = Module::findByComponent('chart', $this->tree, Auth::user())
->filter(function (ModuleInterface $module): bool {
return $module instanceof PedigreeChartModule;
});
@@ -1191,7 +1191,7 @@ abstract class AbstractTheme
*/
public function primaryMenu(Individual $individual): array
{
- return Module::activeMenus($this->tree)
+ return Module::findByComponent('menu', $this->tree, Auth::user())
->map(function (ModuleMenuInterface $menu): ?Menu {
return $menu->getMenu($this->tree);
})
diff --git a/resources/views/media-page-menu.phtml b/resources/views/media-page-menu.phtml
index df9ecb98de..86a8d4a085 100644
--- a/resources/views/media-page-menu.phtml
+++ b/resources/views/media-page-menu.phtml
@@ -10,7 +10,7 @@
</button>
<div class="dropdown-menu dropdown-menu-right wt-page-menu-items" aria-labelledby="page-menu">
- <?php if (false && Module::getModuleByClassName(CensusAssistantModule::class)) : ?>
+ <?php if (false && Module::findByClass(CensusAssistantModule::class)) : ?>
<a class="dropdown-item menu-obje-link" href="#" onclick="return ilinkitem('<?= e($record->xref()) ?>','manage','<?= e($record->tree()->name()) ?>');">
<?= I18N::translate('Manage the links') ?>
</a>
diff --git a/resources/views/modules/ckeditor/ckeditor-js.phtml b/resources/views/modules/ckeditor/ckeditor-js.phtml
index 5261aa949c..c7feadcc3b 100644
--- a/resources/views/modules/ckeditor/ckeditor-js.phtml
+++ b/resources/views/modules/ckeditor/ckeditor-js.phtml
@@ -2,7 +2,7 @@
<?php use Fisharebest\Webtrees\Module\CkeditorModule; ?>
<?php use Fisharebest\Webtrees\View; ?>
-<?php if (Module::getModuleByClassName(CkeditorModule::class)): ?>
+<?php if (Module::findByClass(CkeditorModule::class)): ?>
<?php View::push('javascript') ?>
<script src="<?= e(CkeditorModule::CKEDITOR_PATH) ?>ckeditor.js"></script>
<script src="<?= e(CkeditorModule::CKEDITOR_PATH) ?>adapters/jquery.js"></script>