Passed
Push — main ( 00c5b4...fe37d7 )
by Jonathan
03:49
created
app/Module/Hooks/Hooks/IndividualDatatablesExtenderCollector.php 1 patch
Indentation   +37 added lines, -37 removed lines patch added patch discarded remove patch
@@ -25,45 +25,45 @@
 block discarded – undo
25 25
  * @extends AbstractHookCollector<IndividualDatatablesExtenderInterface>
26 26
  */
27 27
 class IndividualDatatablesExtenderCollector extends AbstractHookCollector implements
28
-    IndividualDatatablesExtenderInterface
28
+	IndividualDatatablesExtenderInterface
29 29
 {
30
-    /**
31
-     * {@inheritDoc}
32
-     * @see \MyArtJaub\Webtrees\Common\Hooks\AbstractHookCollector::title()
33
-     */
34
-    public function title(): string
35
-    {
36
-        return I18N::translate('Columns extender for tables of individuals');
37
-    }
30
+	/**
31
+	 * {@inheritDoc}
32
+	 * @see \MyArtJaub\Webtrees\Common\Hooks\AbstractHookCollector::title()
33
+	 */
34
+	public function title(): string
35
+	{
36
+		return I18N::translate('Columns extender for tables of individuals');
37
+	}
38 38
 
39
-    /**
40
-     * {@inheritDoc}
41
-     * @see \MyArtJaub\Webtrees\Common\Hooks\AbstractHookCollector::description()
42
-     */
43
-    public function description(): string
44
-    {
45
-        return I18N::translate('Add additional columns to tables of individuals');
46
-    }
39
+	/**
40
+	 * {@inheritDoc}
41
+	 * @see \MyArtJaub\Webtrees\Common\Hooks\AbstractHookCollector::description()
42
+	 */
43
+	public function description(): string
44
+	{
45
+		return I18N::translate('Add additional columns to tables of individuals');
46
+	}
47 47
 
48
-    /**
49
-     * {@inheritDoc}
50
-     * @see \MyArtJaub\Webtrees\Common\Hooks\AbstractHookCollector::hookInterface()
51
-     */
52
-    public function hookInterface(): string
53
-    {
54
-        return IndividualDatatablesExtenderInterface::class;
55
-    }
48
+	/**
49
+	 * {@inheritDoc}
50
+	 * @see \MyArtJaub\Webtrees\Common\Hooks\AbstractHookCollector::hookInterface()
51
+	 */
52
+	public function hookInterface(): string
53
+	{
54
+		return IndividualDatatablesExtenderInterface::class;
55
+	}
56 56
 
57
-    /**
58
-     * {@inheritDoc}
59
-     * @see \MyArtJaub\Webtrees\Contracts\Hooks\IndividualDatatablesExtenderInterface::individualColumns()
60
-     */
61
-    public function individualColumns(iterable $records): array
62
-    {
63
-        $result = [];
64
-        foreach ($this->hooks() as $hook) {
65
-            $result += $hook->individualColumns($records);
66
-        }
67
-        return $result;
68
-    }
57
+	/**
58
+	 * {@inheritDoc}
59
+	 * @see \MyArtJaub\Webtrees\Contracts\Hooks\IndividualDatatablesExtenderInterface::individualColumns()
60
+	 */
61
+	public function individualColumns(iterable $records): array
62
+	{
63
+		$result = [];
64
+		foreach ($this->hooks() as $hook) {
65
+			$result += $hook->individualColumns($records);
66
+		}
67
+		return $result;
68
+	}
69 69
 }
Please login to merge, or discard this patch.
app/Module/Hooks/HooksModule.php 1 patch
Indentation   +101 added lines, -101 removed lines patch added patch discarded remove patch
@@ -42,106 +42,106 @@
 block discarded – undo
42 42
  * Provide entry points to extend core webtrees code.
43 43
  */
44 44
 class HooksModule extends AbstractModule implements
45
-    ModuleMyArtJaubInterface,
46
-    ModuleConfigInterface,
47
-    ModuleHookSubscriberInterface
45
+	ModuleMyArtJaubInterface,
46
+	ModuleConfigInterface,
47
+	ModuleHookSubscriberInterface
48 48
 {
49
-    use ModuleMyArtJaubTrait {
50
-        boot as traitBoot;
51
-    }
52
-    use ModuleConfigTrait;
53
-
54
-    // How to update the database schema for this module
55
-    private const SCHEMA_TARGET_VERSION   = 2;
56
-    private const SCHEMA_SETTING_NAME     = 'MAJ_HOOKS_SCHEMA_VERSION';
57
-    private const SCHEMA_MIGRATION_PREFIX = __NAMESPACE__ . '\Schema';
58
-
59
-    /**
60
-     * {@inheritDoc}
61
-     * @see \Fisharebest\Webtrees\Module\AbstractModule::title()
62
-     */
63
-    public function title(): string
64
-    {
65
-        return /* I18N: Name of the “Hooks” module */ I18N::translate('Hooks');
66
-    }
67
-
68
-    /**
69
-     * {@inheritDoc}
70
-     * @see \Fisharebest\Webtrees\Module\AbstractModule::description()
71
-     */
72
-    public function description(): string
73
-    {
74
-        return /* I18N: Description of the “Hooks” module */ I18N::translate('Implements hooks management.');
75
-    }
76
-
77
-    /**
78
-     * {@inheritDoc}
79
-     * @see \Fisharebest\Webtrees\Module\AbstractModule::boot()
80
-     */
81
-    public function boot(): void
82
-    {
83
-        $this->traitBoot();
84
-        app()->bind(HookServiceInterface::class, HookService::class);
85
-        app(MigrationService::class)->updateSchema(
86
-            self::SCHEMA_MIGRATION_PREFIX,
87
-            self::SCHEMA_SETTING_NAME,
88
-            self::SCHEMA_TARGET_VERSION
89
-        );
90
-    }
91
-
92
-    /**
93
-     * {@inheritDoc}
94
-     * @see \MyArtJaub\Webtrees\Module\ModuleMyArtJaubInterface::loadRoutes()
95
-     */
96
-    public function loadRoutes(Map $router): void
97
-    {
98
-        $router->attach('', '', static function (Map $router): void {
99
-
100
-            $router->attach('', '/module-maj/hooks', static function (Map $router): void {
101
-
102
-                $router->attach('', '/config/admin', static function (Map $router): void {
103
-
104
-                    $router->get(AdminConfigPage::class, '', AdminConfigPage::class);
105
-                    $router->get(ModulesHooksPage::class, '/{hook_name}', ModulesHooksPage::class);
106
-                    $router->post(ModulesHooksAction::class, '/{hook_name}', ModulesHooksAction::class);
107
-                });
108
-            });
109
-        });
110
-    }
111
-
112
-    /**
113
-     * {@inheritDoc}
114
-     * @see \Fisharebest\Webtrees\Module\ModuleCustomInterface::customModuleVersion()
115
-     */
116
-    public function customModuleVersion(): string
117
-    {
118
-        return '2.1.1-v.1';
119
-    }
120
-
121
-    /**
122
-     * {@inheritDoc}
123
-     * @see \Fisharebest\Webtrees\Module\ModuleConfigInterface::getConfigLink()
124
-     */
125
-    public function getConfigLink(): string
126
-    {
127
-        return route(AdminConfigPage::class);
128
-    }
129
-
130
-    /**
131
-     * {@inheritDoc}
132
-     * @see \MyArtJaub\Webtrees\Contracts\Hooks\ModuleHookSubscriberInterface::listSubscribedHooks()
133
-     */
134
-    public function listSubscribedHooks(): array
135
-    {
136
-        return [
137
-            app()->makeWith(FactSourceTextExtenderCollector::class, ['module' => $this]),
138
-            app()->makeWith(FamilyDatatablesExtenderCollector::class, ['module' => $this]),
139
-            app()->makeWith(IndividualDatatablesExtenderCollector::class, ['module' => $this]),
140
-            app()->makeWith(NameAccordionExtenderCollector::class, ['module' => $this]),
141
-            app()->makeWith(RecordNameTextExtenderCollector::class, ['module' => $this]),
142
-            app()->makeWith(SosaFamilyDatatablesExtenderCollector::class, ['module' => $this]),
143
-            app()->makeWith(SosaIndividualDatatablesExtenderCollector::class, ['module' => $this]),
144
-            app()->makeWith(SosaMissingDatatablesExtenderCollector::class, ['module' => $this])
145
-        ];
146
-    }
49
+	use ModuleMyArtJaubTrait {
50
+		boot as traitBoot;
51
+	}
52
+	use ModuleConfigTrait;
53
+
54
+	// How to update the database schema for this module
55
+	private const SCHEMA_TARGET_VERSION   = 2;
56
+	private const SCHEMA_SETTING_NAME     = 'MAJ_HOOKS_SCHEMA_VERSION';
57
+	private const SCHEMA_MIGRATION_PREFIX = __NAMESPACE__ . '\Schema';
58
+
59
+	/**
60
+	 * {@inheritDoc}
61
+	 * @see \Fisharebest\Webtrees\Module\AbstractModule::title()
62
+	 */
63
+	public function title(): string
64
+	{
65
+		return /* I18N: Name of the “Hooks” module */ I18N::translate('Hooks');
66
+	}
67
+
68
+	/**
69
+	 * {@inheritDoc}
70
+	 * @see \Fisharebest\Webtrees\Module\AbstractModule::description()
71
+	 */
72
+	public function description(): string
73
+	{
74
+		return /* I18N: Description of the “Hooks” module */ I18N::translate('Implements hooks management.');
75
+	}
76
+
77
+	/**
78
+	 * {@inheritDoc}
79
+	 * @see \Fisharebest\Webtrees\Module\AbstractModule::boot()
80
+	 */
81
+	public function boot(): void
82
+	{
83
+		$this->traitBoot();
84
+		app()->bind(HookServiceInterface::class, HookService::class);
85
+		app(MigrationService::class)->updateSchema(
86
+			self::SCHEMA_MIGRATION_PREFIX,
87
+			self::SCHEMA_SETTING_NAME,
88
+			self::SCHEMA_TARGET_VERSION
89
+		);
90
+	}
91
+
92
+	/**
93
+	 * {@inheritDoc}
94
+	 * @see \MyArtJaub\Webtrees\Module\ModuleMyArtJaubInterface::loadRoutes()
95
+	 */
96
+	public function loadRoutes(Map $router): void
97
+	{
98
+		$router->attach('', '', static function (Map $router): void {
99
+
100
+			$router->attach('', '/module-maj/hooks', static function (Map $router): void {
101
+
102
+				$router->attach('', '/config/admin', static function (Map $router): void {
103
+
104
+					$router->get(AdminConfigPage::class, '', AdminConfigPage::class);
105
+					$router->get(ModulesHooksPage::class, '/{hook_name}', ModulesHooksPage::class);
106
+					$router->post(ModulesHooksAction::class, '/{hook_name}', ModulesHooksAction::class);
107
+				});
108
+			});
109
+		});
110
+	}
111
+
112
+	/**
113
+	 * {@inheritDoc}
114
+	 * @see \Fisharebest\Webtrees\Module\ModuleCustomInterface::customModuleVersion()
115
+	 */
116
+	public function customModuleVersion(): string
117
+	{
118
+		return '2.1.1-v.1';
119
+	}
120
+
121
+	/**
122
+	 * {@inheritDoc}
123
+	 * @see \Fisharebest\Webtrees\Module\ModuleConfigInterface::getConfigLink()
124
+	 */
125
+	public function getConfigLink(): string
126
+	{
127
+		return route(AdminConfigPage::class);
128
+	}
129
+
130
+	/**
131
+	 * {@inheritDoc}
132
+	 * @see \MyArtJaub\Webtrees\Contracts\Hooks\ModuleHookSubscriberInterface::listSubscribedHooks()
133
+	 */
134
+	public function listSubscribedHooks(): array
135
+	{
136
+		return [
137
+			app()->makeWith(FactSourceTextExtenderCollector::class, ['module' => $this]),
138
+			app()->makeWith(FamilyDatatablesExtenderCollector::class, ['module' => $this]),
139
+			app()->makeWith(IndividualDatatablesExtenderCollector::class, ['module' => $this]),
140
+			app()->makeWith(NameAccordionExtenderCollector::class, ['module' => $this]),
141
+			app()->makeWith(RecordNameTextExtenderCollector::class, ['module' => $this]),
142
+			app()->makeWith(SosaFamilyDatatablesExtenderCollector::class, ['module' => $this]),
143
+			app()->makeWith(SosaIndividualDatatablesExtenderCollector::class, ['module' => $this]),
144
+			app()->makeWith(SosaMissingDatatablesExtenderCollector::class, ['module' => $this])
145
+		];
146
+	}
147 147
 }
Please login to merge, or discard this patch.
app/Module/Hooks/Schema/Migration0.php 1 patch
Indentation   +8 added lines, -8 removed lines patch added patch discarded remove patch
@@ -21,13 +21,13 @@
 block discarded – undo
21 21
  */
22 22
 class Migration0 implements MigrationInterface
23 23
 {
24
-    /**
25
-     * {@inheritDoc}
26
-     * @see \Fisharebest\Webtrees\Schema\MigrationInterface::upgrade()
27
-     */
28
-    public function upgrade(): void
29
-    {
24
+	/**
25
+	 * {@inheritDoc}
26
+	 * @see \Fisharebest\Webtrees\Schema\MigrationInterface::upgrade()
27
+	 */
28
+	public function upgrade(): void
29
+	{
30 30
 
31
-        // This migration has been superseded by migration 1.
32
-    }
31
+		// This migration has been superseded by migration 1.
32
+	}
33 33
 }
Please login to merge, or discard this patch.
app/Module/Hooks/Schema/Migration1.php 1 patch
Indentation   +24 added lines, -24 removed lines patch added patch discarded remove patch
@@ -23,28 +23,28 @@
 block discarded – undo
23 23
  */
24 24
 class Migration1 implements MigrationInterface
25 25
 {
26
-    /**
27
-     * {@inheritDoc}
28
-     * @see \Fisharebest\Webtrees\Schema\MigrationInterface::upgrade()
29
-     */
30
-    public function upgrade(): void
31
-    {
32
-        $in_transaction = DB::connection()->getPdo()->inTransaction();
33
-
34
-        if (DB::schema()->hasTable('maj_hooks')) {
35
-            DB::schema()->drop('maj_hooks');
36
-        }
37
-
38
-        DB::schema()->create('maj_hook_order', static function (Blueprint $table): void {
39
-            $table->string('majho_module_name', 32);
40
-            $table->string('majho_hook_name', 64);
41
-            $table->integer('majho_hook_order')->nullable();
42
-
43
-            $table->primary(['majho_module_name', 'majho_hook_name']);
44
-        });
45
-
46
-        if ($in_transaction && !DB::connection()->getPdo()->inTransaction()) {
47
-            DB::connection()->beginTransaction();
48
-        }
49
-    }
26
+	/**
27
+	 * {@inheritDoc}
28
+	 * @see \Fisharebest\Webtrees\Schema\MigrationInterface::upgrade()
29
+	 */
30
+	public function upgrade(): void
31
+	{
32
+		$in_transaction = DB::connection()->getPdo()->inTransaction();
33
+
34
+		if (DB::schema()->hasTable('maj_hooks')) {
35
+			DB::schema()->drop('maj_hooks');
36
+		}
37
+
38
+		DB::schema()->create('maj_hook_order', static function (Blueprint $table): void {
39
+			$table->string('majho_module_name', 32);
40
+			$table->string('majho_hook_name', 64);
41
+			$table->integer('majho_hook_order')->nullable();
42
+
43
+			$table->primary(['majho_module_name', 'majho_hook_name']);
44
+		});
45
+
46
+		if ($in_transaction && !DB::connection()->getPdo()->inTransaction()) {
47
+			DB::connection()->beginTransaction();
48
+		}
49
+	}
50 50
 }
Please login to merge, or discard this patch.
app/Module/Hooks/Http/RequestHandlers/ModulesHooksPage.php 1 patch
Indentation   +34 added lines, -34 removed lines patch added patch discarded remove patch
@@ -29,44 +29,44 @@
 block discarded – undo
29 29
  */
30 30
 class ModulesHooksPage implements RequestHandlerInterface
31 31
 {
32
-    use ViewResponseTrait;
32
+	use ViewResponseTrait;
33 33
 
34
-    protected HookService $hook_service;
34
+	protected HookService $hook_service;
35 35
 
36
-    /**
37
-     * Constructor for ModulesHooksPage request handler
38
-     *
39
-     * @param HookService $hook_service
40
-     */
41
-    public function __construct(HookService $hook_service)
42
-    {
43
-        $this->hook_service = $hook_service;
44
-    }
36
+	/**
37
+	 * Constructor for ModulesHooksPage request handler
38
+	 *
39
+	 * @param HookService $hook_service
40
+	 */
41
+	public function __construct(HookService $hook_service)
42
+	{
43
+		$this->hook_service = $hook_service;
44
+	}
45 45
 
46
-    /**
47
-     * {@inheritDoc}
48
-     * @see \Psr\Http\Server\RequestHandlerInterface::handle()
49
-     */
50
-    public function handle(ServerRequestInterface $request): ResponseInterface
51
-    {
52
-        $this->layout = 'layouts/administration';
46
+	/**
47
+	 * {@inheritDoc}
48
+	 * @see \Psr\Http\Server\RequestHandlerInterface::handle()
49
+	 */
50
+	public function handle(ServerRequestInterface $request): ResponseInterface
51
+	{
52
+		$this->layout = 'layouts/administration';
53 53
 
54
-        $hook_name = Validator::attributes($request)->string('hook_name', '');
55
-        $hook = $this->hook_service->find($hook_name, true);
56
-        if ($hook === null) {
57
-            throw new HttpNotFoundException(I18N::translate('The hook with name “%s” does not exist.', $hook_name));
58
-        }
54
+		$hook_name = Validator::attributes($request)->string('hook_name', '');
55
+		$hook = $this->hook_service->find($hook_name, true);
56
+		if ($hook === null) {
57
+			throw new HttpNotFoundException(I18N::translate('The hook with name “%s” does not exist.', $hook_name));
58
+		}
59 59
 
60
-        $modules = $hook->hooks()
61
-            ->sortKeys()
62
-            ->mapWithKeys(fn(HookInterface $hook) => [$hook->module()->name() => $hook->module()]);
60
+		$modules = $hook->hooks()
61
+			->sortKeys()
62
+			->mapWithKeys(fn(HookInterface $hook) => [$hook->module()->name() => $hook->module()]);
63 63
 
64
-        return $this->viewResponse('admin/components', [
65
-            'description'    => $hook->description(),
66
-            'modules'        => $modules,
67
-            'title'          => $hook->title(),
68
-            'uses_access'    => false,
69
-            'uses_sorting'   => true
70
-        ]);
71
-    }
64
+		return $this->viewResponse('admin/components', [
65
+			'description'    => $hook->description(),
66
+			'modules'        => $modules,
67
+			'title'          => $hook->title(),
68
+			'uses_access'    => false,
69
+			'uses_sorting'   => true
70
+		]);
71
+	}
72 72
 }
Please login to merge, or discard this patch.
app/Module/Hooks/Services/HookService.php 1 patch
Indentation   +88 added lines, -88 removed lines patch added patch discarded remove patch
@@ -30,101 +30,101 @@
 block discarded – undo
30 30
  */
31 31
 class HookService implements HookServiceInterface
32 32
 {
33
-    private ModuleService $module_service;
33
+	private ModuleService $module_service;
34 34
 
35
-    /**
36
-     * Constructor for HookService
37
-     *
38
-     * @param ModuleService $module_service
39
-     */
40
-    public function __construct(ModuleService $module_service)
41
-    {
42
-        $this->module_service = $module_service;
43
-    }
35
+	/**
36
+	 * Constructor for HookService
37
+	 *
38
+	 * @param ModuleService $module_service
39
+	 */
40
+	public function __construct(ModuleService $module_service)
41
+	{
42
+		$this->module_service = $module_service;
43
+	}
44 44
 
45
-    /**
46
-     * {@inheritDoc}
47
-     * @see \MyArtJaub\Webtrees\Contracts\Hooks\HookServiceInterface::use()
48
-     */
49
-    public function use(string $hook_interface): ?HookCollectorInterface
50
-    {
51
-        return $this->all()->get($hook_interface);
52
-    }
45
+	/**
46
+	 * {@inheritDoc}
47
+	 * @see \MyArtJaub\Webtrees\Contracts\Hooks\HookServiceInterface::use()
48
+	 */
49
+	public function use(string $hook_interface): ?HookCollectorInterface
50
+	{
51
+		return $this->all()->get($hook_interface);
52
+	}
53 53
 
54 54
 
55
-    /**
56
-     * Find a hook collector by its name, with or without the disabled ones.
57
-     *
58
-     * @param string $hook_name
59
-     * @return HookCollectorInterface|null
60
-     */
61
-    public function find(string $hook_name, bool $include_disabled = false): ?HookCollectorInterface
62
-    {
63
-        return $this->all($include_disabled)
64
-            ->first(fn(HookCollectorInterface $hook_collector) => $hook_collector->name() === $hook_name);
65
-    }
55
+	/**
56
+	 * Find a hook collector by its name, with or without the disabled ones.
57
+	 *
58
+	 * @param string $hook_name
59
+	 * @return HookCollectorInterface|null
60
+	 */
61
+	public function find(string $hook_name, bool $include_disabled = false): ?HookCollectorInterface
62
+	{
63
+		return $this->all($include_disabled)
64
+			->first(fn(HookCollectorInterface $hook_collector) => $hook_collector->name() === $hook_name);
65
+	}
66 66
 
67
-    /**
68
-     * Get all hook collectors subscribed by modules, with hooks ordered, with or without the disabled ones.
69
-     *
70
-     * @param bool $include_disabled
71
-     * @return Collection<string, HookCollectorInterface>
72
-     */
73
-    public function all(bool $include_disabled = false): Collection
74
-    {
75
-        return Registry::cache()->array()->remember('all-hooks', function () use ($include_disabled): Collection {
76
-            $hooks_info = DB::table('maj_hook_order')
77
-                ->get()
78
-                ->groupBy(['majho_hook_name', 'majho_module_name']);
67
+	/**
68
+	 * Get all hook collectors subscribed by modules, with hooks ordered, with or without the disabled ones.
69
+	 *
70
+	 * @param bool $include_disabled
71
+	 * @return Collection<string, HookCollectorInterface>
72
+	 */
73
+	public function all(bool $include_disabled = false): Collection
74
+	{
75
+		return Registry::cache()->array()->remember('all-hooks', function () use ($include_disabled): Collection {
76
+			$hooks_info = DB::table('maj_hook_order')
77
+				->get()
78
+				->groupBy(['majho_hook_name', 'majho_module_name']);
79 79
 
80
-            $hooks = $this->module_service
81
-                ->findByInterface(ModuleHookSubscriberInterface::class, $include_disabled)
82
-                ->flatMap(fn(ModuleHookSubscriberInterface $module) => $module->listSubscribedHooks());
80
+			$hooks = $this->module_service
81
+				->findByInterface(ModuleHookSubscriberInterface::class, $include_disabled)
82
+				->flatMap(fn(ModuleHookSubscriberInterface $module) => $module->listSubscribedHooks());
83 83
 
84
-            $hook_collectors = collect();
85
-            $hook_instances = collect();
86
-            foreach ($hooks as $hook) {
87
-                if (!($hook instanceof HookInterface)) {
88
-                    continue;
89
-                }
90
-                if ($hook instanceof HookCollectorInterface) {
91
-                    $hook_collectors->put($hook->hookInterface(), $hook);
92
-                } else {
93
-                    $hook_instances->add($hook);
94
-                }
95
-            }
84
+			$hook_collectors = collect();
85
+			$hook_instances = collect();
86
+			foreach ($hooks as $hook) {
87
+				if (!($hook instanceof HookInterface)) {
88
+					continue;
89
+				}
90
+				if ($hook instanceof HookCollectorInterface) {
91
+					$hook_collectors->put($hook->hookInterface(), $hook);
92
+				} else {
93
+					$hook_instances->add($hook);
94
+				}
95
+			}
96 96
 
97
-            foreach ($hook_collectors as $hook_interface => $hook_collector) {
98
-                $hook_info = $hooks_info->get($hook_collector->name()) ?? collect();
99
-                foreach (
100
-                    $hook_instances->filter(
101
-                        fn(HookInterface $hook): bool => $hook instanceof $hook_interface
102
-                    ) as $hook_instance
103
-                ) {
104
-                    $hook_module_info = $hook_info->get($hook_instance->module()->name(), collect())->first();
105
-                    $hook_order = $hook_module_info instanceof stdClass ? (int) $hook_module_info->majho_hook_order : 0;
106
-                    $hook_collector->register($hook_instance, $hook_order);
107
-                }
108
-            }
109
-            return $hook_collectors;
110
-        });
111
-    }
97
+			foreach ($hook_collectors as $hook_interface => $hook_collector) {
98
+				$hook_info = $hooks_info->get($hook_collector->name()) ?? collect();
99
+				foreach (
100
+					$hook_instances->filter(
101
+						fn(HookInterface $hook): bool => $hook instanceof $hook_interface
102
+					) as $hook_instance
103
+				) {
104
+					$hook_module_info = $hook_info->get($hook_instance->module()->name(), collect())->first();
105
+					$hook_order = $hook_module_info instanceof stdClass ? (int) $hook_module_info->majho_hook_order : 0;
106
+					$hook_collector->register($hook_instance, $hook_order);
107
+				}
108
+			}
109
+			return $hook_collectors;
110
+		});
111
+	}
112 112
 
113
-    /**
114
-     * Update the order of the modules implementing a hook in the database.
115
-     *
116
-     * @param HookCollectorInterface $hook_collector
117
-     * @param ModuleInterface $module
118
-     * @param int $order
119
-     * @return int
120
-     */
121
-    public function updateOrder(HookCollectorInterface $hook_collector, ModuleInterface $module, int $order): int
122
-    {
123
-        return DB::table('maj_hook_order')
124
-            ->upsert([
125
-                'majho_module_name' =>  $module->name(),
126
-                'majho_hook_name'   =>  $hook_collector->name(),
127
-                'majho_hook_order'  =>  $order
128
-            ], ['majho_module_name', 'majho_hook_name'], ['majho_hook_order']);
129
-    }
113
+	/**
114
+	 * Update the order of the modules implementing a hook in the database.
115
+	 *
116
+	 * @param HookCollectorInterface $hook_collector
117
+	 * @param ModuleInterface $module
118
+	 * @param int $order
119
+	 * @return int
120
+	 */
121
+	public function updateOrder(HookCollectorInterface $hook_collector, ModuleInterface $module, int $order): int
122
+	{
123
+		return DB::table('maj_hook_order')
124
+			->upsert([
125
+				'majho_module_name' =>  $module->name(),
126
+				'majho_hook_name'   =>  $hook_collector->name(),
127
+				'majho_hook_order'  =>  $order
128
+			], ['majho_module_name', 'majho_hook_name'], ['majho_hook_order']);
129
+	}
130 130
 }
Please login to merge, or discard this patch.
app/Module/WelcomeBlock/Http/RequestHandlers/MatomoStats.php 1 patch
Indentation   +52 added lines, -52 removed lines patch added patch discarded remove patch
@@ -32,64 +32,64 @@
 block discarded – undo
32 32
  */
33 33
 class MatomoStats implements RequestHandlerInterface
34 34
 {
35
-    use ViewResponseTrait;
35
+	use ViewResponseTrait;
36 36
 
37
-    /**
38
-     * @var WelcomeBlockModule|null $module
39
-     */
40
-    private $module;
37
+	/**
38
+	 * @var WelcomeBlockModule|null $module
39
+	 */
40
+	private $module;
41 41
 
42
-    /**
43
-     * @var MatomoStatsService $matomo_service
44
-     */
45
-    private $matomo_service;
42
+	/**
43
+	 * @var MatomoStatsService $matomo_service
44
+	 */
45
+	private $matomo_service;
46 46
 
47
-    /**
48
-     * Constructor for MatomoStats request handler
49
-     * @param ModuleService $module_service
50
-     * @param MatomoStatsService $matomo_service
51
-     */
52
-    public function __construct(
53
-        ModuleService $module_service,
54
-        MatomoStatsService $matomo_service
55
-    ) {
56
-        $this->module = $module_service->findByInterface(WelcomeBlockModule::class)->first();
57
-        $this->matomo_service = $matomo_service;
58
-    }
47
+	/**
48
+	 * Constructor for MatomoStats request handler
49
+	 * @param ModuleService $module_service
50
+	 * @param MatomoStatsService $matomo_service
51
+	 */
52
+	public function __construct(
53
+		ModuleService $module_service,
54
+		MatomoStatsService $matomo_service
55
+	) {
56
+		$this->module = $module_service->findByInterface(WelcomeBlockModule::class)->first();
57
+		$this->matomo_service = $matomo_service;
58
+	}
59 59
 
60
-    /**
61
-     * {@inheritDoc}
62
-     * @see \Psr\Http\Server\RequestHandlerInterface::handle()
63
-     */
64
-    public function handle(ServerRequestInterface $request): ResponseInterface
65
-    {
66
-        $this->layout = 'layouts/ajax';
60
+	/**
61
+	 * {@inheritDoc}
62
+	 * @see \Psr\Http\Server\RequestHandlerInterface::handle()
63
+	 */
64
+	public function handle(ServerRequestInterface $request): ResponseInterface
65
+	{
66
+		$this->layout = 'layouts/ajax';
67 67
 
68
-        if ($this->module === null) {
69
-            return $this->viewResponse('errors/unhandled-exception', [
70
-                'error' => 'The attached module could not be found.'
71
-            ], StatusCodeInterface::STATUS_NOT_FOUND);
72
-        }
68
+		if ($this->module === null) {
69
+			return $this->viewResponse('errors/unhandled-exception', [
70
+				'error' => 'The attached module could not be found.'
71
+			], StatusCodeInterface::STATUS_NOT_FOUND);
72
+		}
73 73
 
74
-        $block_id = Validator::attributes($request)->integer('block_id', -1);
75
-        $nb_visits_year = $nb_visits_today = null;
74
+		$block_id = Validator::attributes($request)->integer('block_id', -1);
75
+		$nb_visits_year = $nb_visits_today = null;
76 76
 
77
-        try {
78
-            if ($block_id !== -1 && $this->module->isMatomoEnabled($block_id)) {
79
-                $nb_visits_today = $this->matomo_service->visitsToday($this->module, $block_id) ?? 0;
80
-                $nb_visits_year = ($this->matomo_service->visitsThisYear($this->module, $block_id) ?? 0)
81
-                    + $nb_visits_today;
82
-            }
83
-        } catch (Throwable $ex) {
84
-            return $this->viewResponse('errors/unhandled-exception', [
85
-                'error' => I18N::translate('Error while retrieving Matomo statistics: ') .
86
-                    (Auth::isAdmin() ? $ex->getMessage() : I18N::translate('Log in as admin for error details'))
87
-            ], StatusCodeInterface::STATUS_INTERNAL_SERVER_ERROR);
88
-        }
77
+		try {
78
+			if ($block_id !== -1 && $this->module->isMatomoEnabled($block_id)) {
79
+				$nb_visits_today = $this->matomo_service->visitsToday($this->module, $block_id) ?? 0;
80
+				$nb_visits_year = ($this->matomo_service->visitsThisYear($this->module, $block_id) ?? 0)
81
+					+ $nb_visits_today;
82
+			}
83
+		} catch (Throwable $ex) {
84
+			return $this->viewResponse('errors/unhandled-exception', [
85
+				'error' => I18N::translate('Error while retrieving Matomo statistics: ') .
86
+					(Auth::isAdmin() ? $ex->getMessage() : I18N::translate('Log in as admin for error details'))
87
+			], StatusCodeInterface::STATUS_INTERNAL_SERVER_ERROR);
88
+		}
89 89
 
90
-        return $this->viewResponse($this->module->name() . '::matomo-stats', [
91
-            'visits_year'   =>  $nb_visits_year,
92
-            'visits_today'  =>  $nb_visits_today
93
-        ]);
94
-    }
90
+		return $this->viewResponse($this->module->name() . '::matomo-stats', [
91
+			'visits_year'   =>  $nb_visits_year,
92
+			'visits_today'  =>  $nb_visits_today
93
+		]);
94
+	}
95 95
 }
Please login to merge, or discard this patch.
app/Module/WelcomeBlock/Services/MatomoStatsService.php 1 patch
Indentation   +82 added lines, -82 removed lines patch added patch discarded remove patch
@@ -28,93 +28,93 @@
 block discarded – undo
28 28
  */
29 29
 class MatomoStatsService
30 30
 {
31
-    /**
32
-     * Returns the number of visits for the current year (up to the day before).
33
-     * That statistic is cached for the day, to avoid unecessary calls to Matomo API.
34
-     *
35
-     * @param WelcomeBlockModule $module
36
-     * @param int $block_id
37
-     * @return int|NULL
38
-     */
39
-    public function visitsThisYear(WelcomeBlockModule $module, int $block_id): ?int
40
-    {
41
-        return Registry::cache()->file()->remember(
42
-            $module->name() . '-matomovisits-yearly-' . $block_id,
43
-            function () use ($module, $block_id): ?int {
44
-                $visits_year = $this->visits($module, $block_id, 'year');
45
-                if ($visits_year === null) {
46
-                    return null;
47
-                }
48
-                $visits_today = (int) $this->visits($module, $block_id, 'day');
31
+	/**
32
+	 * Returns the number of visits for the current year (up to the day before).
33
+	 * That statistic is cached for the day, to avoid unecessary calls to Matomo API.
34
+	 *
35
+	 * @param WelcomeBlockModule $module
36
+	 * @param int $block_id
37
+	 * @return int|NULL
38
+	 */
39
+	public function visitsThisYear(WelcomeBlockModule $module, int $block_id): ?int
40
+	{
41
+		return Registry::cache()->file()->remember(
42
+			$module->name() . '-matomovisits-yearly-' . $block_id,
43
+			function () use ($module, $block_id): ?int {
44
+				$visits_year = $this->visits($module, $block_id, 'year');
45
+				if ($visits_year === null) {
46
+					return null;
47
+				}
48
+				$visits_today = (int) $this->visits($module, $block_id, 'day');
49 49
 
50
-                return $visits_year - $visits_today;
51
-            },
52
-            Carbon::now()->addDay()->startOfDay()->diffInSeconds(Carbon::now()) // Valid until midnight
53
-        );
54
-    }
50
+				return $visits_year - $visits_today;
51
+			},
52
+			Carbon::now()->addDay()->startOfDay()->diffInSeconds(Carbon::now()) // Valid until midnight
53
+		);
54
+	}
55 55
 
56
-    /**
57
-     * Returns the number of visits for the current day.
58
-     *
59
-     * @param WelcomeBlockModule $module
60
-     * @param int $block_id
61
-     * @return int|NULL
62
-     */
63
-    public function visitsToday(WelcomeBlockModule $module, int $block_id): ?int
64
-    {
65
-        return Registry::cache()->array()->remember(
66
-            $module->name() . '-matomovisits-daily-' . $block_id,
67
-            function () use ($module, $block_id): ?int {
68
-                return $this->visits($module, $block_id, 'day');
69
-            }
70
-        );
71
-    }
56
+	/**
57
+	 * Returns the number of visits for the current day.
58
+	 *
59
+	 * @param WelcomeBlockModule $module
60
+	 * @param int $block_id
61
+	 * @return int|NULL
62
+	 */
63
+	public function visitsToday(WelcomeBlockModule $module, int $block_id): ?int
64
+	{
65
+		return Registry::cache()->array()->remember(
66
+			$module->name() . '-matomovisits-daily-' . $block_id,
67
+			function () use ($module, $block_id): ?int {
68
+				return $this->visits($module, $block_id, 'day');
69
+			}
70
+		);
71
+	}
72 72
 
73
-    /**
74
-     * Invoke the Matomo API to retrieve the number of visits over a period.
75
-     *
76
-     * @param WelcomeBlockModule $module
77
-     * @param int $block_id
78
-     * @param string $period
79
-     * @return int|NULL
80
-     */
81
-    protected function visits(WelcomeBlockModule $module, int $block_id, string $period): ?int
82
-    {
83
-        $settings = $module->matomoSettings($block_id);
73
+	/**
74
+	 * Invoke the Matomo API to retrieve the number of visits over a period.
75
+	 *
76
+	 * @param WelcomeBlockModule $module
77
+	 * @param int $block_id
78
+	 * @param string $period
79
+	 * @return int|NULL
80
+	 */
81
+	protected function visits(WelcomeBlockModule $module, int $block_id, string $period): ?int
82
+	{
83
+		$settings = $module->matomoSettings($block_id);
84 84
 
85
-        if (
86
-            $settings['matomo_enabled'] === true
87
-            && mb_strlen($settings['matomo_url']) > 0
88
-            && mb_strlen($settings['matomo_token']) > 0
89
-            && $settings['matomo_siteid'] > 0
90
-        ) {
91
-            try {
92
-                $http_client = new Client([
93
-                    RequestOptions::TIMEOUT => 30
94
-                ]);
85
+		if (
86
+			$settings['matomo_enabled'] === true
87
+			&& mb_strlen($settings['matomo_url']) > 0
88
+			&& mb_strlen($settings['matomo_token']) > 0
89
+			&& $settings['matomo_siteid'] > 0
90
+		) {
91
+			try {
92
+				$http_client = new Client([
93
+					RequestOptions::TIMEOUT => 30
94
+				]);
95 95
 
96
-                $response = $http_client->get($settings['matomo_url'], [
97
-                    'query' =>  [
98
-                        'module'    =>  'API',
99
-                        'method'    =>  'VisitsSummary.getVisits',
100
-                        'idSite'    =>  $settings['matomo_siteid'],
101
-                        'period'    =>  $period,
102
-                        'date'      =>  'today',
103
-                        'token_auth' =>  $settings['matomo_token'],
104
-                        'format'    =>  'json'
105
-                    ]
106
-                ]);
96
+				$response = $http_client->get($settings['matomo_url'], [
97
+					'query' =>  [
98
+						'module'    =>  'API',
99
+						'method'    =>  'VisitsSummary.getVisits',
100
+						'idSite'    =>  $settings['matomo_siteid'],
101
+						'period'    =>  $period,
102
+						'date'      =>  'today',
103
+						'token_auth' =>  $settings['matomo_token'],
104
+						'format'    =>  'json'
105
+					]
106
+				]);
107 107
 
108
-                if ($response->getStatusCode() === StatusCodeInterface::STATUS_OK) {
109
-                    $result = json_decode((string) $response->getBody(), true)['value'] ?? null;
110
-                    if ($result !== null) {
111
-                        return (int)$result;
112
-                    }
113
-                }
114
-            } catch (GuzzleException $ex) {
115
-            }
116
-        }
108
+				if ($response->getStatusCode() === StatusCodeInterface::STATUS_OK) {
109
+					$result = json_decode((string) $response->getBody(), true)['value'] ?? null;
110
+					if ($result !== null) {
111
+						return (int)$result;
112
+					}
113
+				}
114
+			} catch (GuzzleException $ex) {
115
+			}
116
+		}
117 117
 
118
-        return null;
119
-    }
118
+		return null;
119
+	}
120 120
 }
Please login to merge, or discard this patch.
app/Module/PatronymicLineage/PatronymicLineageModule.php 1 patch
Indentation   +134 added lines, -134 removed lines patch added patch discarded remove patch
@@ -36,139 +36,139 @@
 block discarded – undo
36 36
  * Display lineages of people with the same surname.
37 37
  */
38 38
 class PatronymicLineageModule extends IndividualListModule implements
39
-    ModuleMyArtJaubInterface,
40
-    ModuleListInterface,
41
-    ModuleGlobalInterface
39
+	ModuleMyArtJaubInterface,
40
+	ModuleListInterface,
41
+	ModuleGlobalInterface
42 42
 {
43
-    use ModuleMyArtJaubTrait;
44
-    use ModuleListTrait;
45
-    use ModuleGlobalTrait;
46
-
47
-     /**
48
-     * {@inheritDoc}
49
-     * @see \Fisharebest\Webtrees\Module\AbstractModule::title()
50
-     */
51
-    public function title(): string
52
-    {
53
-        return /* I18N: Name of the “Patronymic lineage” module */ I18N::translate('Patronymic Lineages');
54
-    }
55
-
56
-    /**
57
-     * {@inheritDoc}
58
-     * @see \Fisharebest\Webtrees\Module\AbstractModule::description()
59
-     */
60
-    public function description(): string
61
-    {
62
-        //phpcs:ignore Generic.Files.LineLength.TooLong
63
-        return /* I18N: Description of the “Patronymic lineage” module */ I18N::translate('Display lineages of people holding the same surname.');
64
-    }
65
-
66
-    /**
67
-     * {@inheritDoc}
68
-     * @see \MyArtJaub\Webtrees\Module\ModuleMyArtJaubInterface::loadRoutes()
69
-     */
70
-    public function loadRoutes(Map $router): void
71
-    {
72
-        $router->attach('', '', static function (Map $router): void {
73
-
74
-            $router->attach('', '/module-maj/lineages', static function (Map $router): void {
75
-
76
-                $router->attach('', '/Page', static function (Map $router): void {
77
-
78
-                    $router->get(SurnamesList::class, '/{tree}/list{/alpha}', SurnamesList::class);
79
-                    $router->get(LineagesPage::class, '/{tree}/lineage/{surname}', LineagesPage::class);
80
-                });
81
-            });
82
-        });
83
-    }
84
-
85
-    /**
86
-     * {@inheritDoc}
87
-     * @see \Fisharebest\Webtrees\Module\ModuleCustomInterface::customModuleVersion()
88
-     */
89
-    public function customModuleVersion(): string
90
-    {
91
-        return '2.0.11-v.1';
92
-    }
93
-
94
-    /**
95
-     * {@inheritDoc}
96
-     * @see \Fisharebest\Webtrees\Module\ModuleListInterface::listUrl()
97
-     *
98
-     * @param array<bool|int|string|array<mixed>|null> $parameters
99
-     */
100
-    public function listUrl(Tree $tree, array $parameters = []): string
101
-    {
102
-        $surname = $parameters['surname'] ?? '';
103
-
104
-        $xref = app(ServerRequestInterface::class)->getAttribute('xref', '');
105
-        if ($xref !== '' && ($individual = Registry::individualFactory()->make($xref, $tree)) !== null) {
106
-            $surname = $individual->getAllNames()[$individual->getPrimaryName()]['surname'];
107
-        }
108
-
109
-        if ($surname !== '') {
110
-            return route(LineagesPage::class, [
111
-                'tree'      =>  $tree->name(),
112
-                'surname'   =>  $surname
113
-            ] + $parameters);
114
-        }
115
-        return route(SurnamesList::class, [
116
-            'tree'  =>  $tree->name()
117
-        ] + $parameters);
118
-    }
119
-
120
-    /**
121
-     * {@inheritDoc}
122
-     * @see \Fisharebest\Webtrees\Module\ModuleListInterface::listMenuClass()
123
-     */
124
-    public function listMenuClass(): string
125
-    {
126
-        return 'menu-maj-patrolineage';
127
-    }
128
-
129
-    /**
130
-     * {@inheritDoc}
131
-     * @see \Fisharebest\Webtrees\Module\ModuleGlobalInterface::headContent()
132
-     */
133
-    public function headContent(): string
134
-    {
135
-        return '<link rel="stylesheet" href="' . e($this->moduleCssUrl()) . '">';
136
-    }
137
-
138
-    /**
139
-     * {@inheritDoc}
140
-     * @see \Fisharebest\Webtrees\Module\IndividualListModule::individuals()
141
-     *
142
-     * Implemented to set the visibility to public.
143
-     * This should probably be in a service, but this hack allows for reuse of mainstream code.
144
-     */
145
-    public function individuals(
146
-        Tree $tree,
147
-        string $surn,
148
-        string $salpha,
149
-        string $galpha,
150
-        bool $marnm,
151
-        bool $fams,
152
-        LocaleInterface $locale
153
-    ): Collection {
154
-        return parent::individuals($tree, $surn, $salpha, $galpha, $marnm, $fams, $locale);
155
-    }
156
-
157
-    /**
158
-     * {@inheritDoc}
159
-     * @see \Fisharebest\Webtrees\Module\IndividualListModule::surnames()
160
-     *
161
-     * Implemented to set the visibility to public.
162
-     * This should probably be in a service, but this hack allows for reuse of mainstream code.
163
-     */
164
-    public function surnames(
165
-        Tree $tree,
166
-        string $surn,
167
-        string $salpha,
168
-        bool $marnm,
169
-        bool $fams,
170
-        LocaleInterface $locale
171
-    ): array {
172
-        return parent::surnames($tree, $surn, $salpha, $marnm, $fams, $locale);
173
-    }
43
+	use ModuleMyArtJaubTrait;
44
+	use ModuleListTrait;
45
+	use ModuleGlobalTrait;
46
+
47
+	 /**
48
+	  * {@inheritDoc}
49
+	  * @see \Fisharebest\Webtrees\Module\AbstractModule::title()
50
+	  */
51
+	public function title(): string
52
+	{
53
+		return /* I18N: Name of the “Patronymic lineage” module */ I18N::translate('Patronymic Lineages');
54
+	}
55
+
56
+	/**
57
+	 * {@inheritDoc}
58
+	 * @see \Fisharebest\Webtrees\Module\AbstractModule::description()
59
+	 */
60
+	public function description(): string
61
+	{
62
+		//phpcs:ignore Generic.Files.LineLength.TooLong
63
+		return /* I18N: Description of the “Patronymic lineage” module */ I18N::translate('Display lineages of people holding the same surname.');
64
+	}
65
+
66
+	/**
67
+	 * {@inheritDoc}
68
+	 * @see \MyArtJaub\Webtrees\Module\ModuleMyArtJaubInterface::loadRoutes()
69
+	 */
70
+	public function loadRoutes(Map $router): void
71
+	{
72
+		$router->attach('', '', static function (Map $router): void {
73
+
74
+			$router->attach('', '/module-maj/lineages', static function (Map $router): void {
75
+
76
+				$router->attach('', '/Page', static function (Map $router): void {
77
+
78
+					$router->get(SurnamesList::class, '/{tree}/list{/alpha}', SurnamesList::class);
79
+					$router->get(LineagesPage::class, '/{tree}/lineage/{surname}', LineagesPage::class);
80
+				});
81
+			});
82
+		});
83
+	}
84
+
85
+	/**
86
+	 * {@inheritDoc}
87
+	 * @see \Fisharebest\Webtrees\Module\ModuleCustomInterface::customModuleVersion()
88
+	 */
89
+	public function customModuleVersion(): string
90
+	{
91
+		return '2.0.11-v.1';
92
+	}
93
+
94
+	/**
95
+	 * {@inheritDoc}
96
+	 * @see \Fisharebest\Webtrees\Module\ModuleListInterface::listUrl()
97
+	 *
98
+	 * @param array<bool|int|string|array<mixed>|null> $parameters
99
+	 */
100
+	public function listUrl(Tree $tree, array $parameters = []): string
101
+	{
102
+		$surname = $parameters['surname'] ?? '';
103
+
104
+		$xref = app(ServerRequestInterface::class)->getAttribute('xref', '');
105
+		if ($xref !== '' && ($individual = Registry::individualFactory()->make($xref, $tree)) !== null) {
106
+			$surname = $individual->getAllNames()[$individual->getPrimaryName()]['surname'];
107
+		}
108
+
109
+		if ($surname !== '') {
110
+			return route(LineagesPage::class, [
111
+				'tree'      =>  $tree->name(),
112
+				'surname'   =>  $surname
113
+			] + $parameters);
114
+		}
115
+		return route(SurnamesList::class, [
116
+			'tree'  =>  $tree->name()
117
+		] + $parameters);
118
+	}
119
+
120
+	/**
121
+	 * {@inheritDoc}
122
+	 * @see \Fisharebest\Webtrees\Module\ModuleListInterface::listMenuClass()
123
+	 */
124
+	public function listMenuClass(): string
125
+	{
126
+		return 'menu-maj-patrolineage';
127
+	}
128
+
129
+	/**
130
+	 * {@inheritDoc}
131
+	 * @see \Fisharebest\Webtrees\Module\ModuleGlobalInterface::headContent()
132
+	 */
133
+	public function headContent(): string
134
+	{
135
+		return '<link rel="stylesheet" href="' . e($this->moduleCssUrl()) . '">';
136
+	}
137
+
138
+	/**
139
+	 * {@inheritDoc}
140
+	 * @see \Fisharebest\Webtrees\Module\IndividualListModule::individuals()
141
+	 *
142
+	 * Implemented to set the visibility to public.
143
+	 * This should probably be in a service, but this hack allows for reuse of mainstream code.
144
+	 */
145
+	public function individuals(
146
+		Tree $tree,
147
+		string $surn,
148
+		string $salpha,
149
+		string $galpha,
150
+		bool $marnm,
151
+		bool $fams,
152
+		LocaleInterface $locale
153
+	): Collection {
154
+		return parent::individuals($tree, $surn, $salpha, $galpha, $marnm, $fams, $locale);
155
+	}
156
+
157
+	/**
158
+	 * {@inheritDoc}
159
+	 * @see \Fisharebest\Webtrees\Module\IndividualListModule::surnames()
160
+	 *
161
+	 * Implemented to set the visibility to public.
162
+	 * This should probably be in a service, but this hack allows for reuse of mainstream code.
163
+	 */
164
+	public function surnames(
165
+		Tree $tree,
166
+		string $surn,
167
+		string $salpha,
168
+		bool $marnm,
169
+		bool $fams,
170
+		LocaleInterface $locale
171
+	): array {
172
+		return parent::surnames($tree, $surn, $salpha, $marnm, $fams, $locale);
173
+	}
174 174
 }
Please login to merge, or discard this patch.