Admin user roster; per-locale subject; SiteUser as From

- Admin preferences page can now subscribe existing webtrees users
  per tree, not just external addresses.
- Subject prefix is now configurable per locale (en/de), and the
  date in the subject is formatted via IntlDateFormatter in the
  recipient's locale.
- "From:" header now uses SiteUser (SMTP_FROM_NAME/SMTP_DISP_NAME)
  to match webtrees' own system-mail convention; the tree contact
  becomes the Reply-To.
This commit is contained in:
2026-05-15 14:30:01 +02:00
parent 00478e2466
commit 9ccc636105
4 changed files with 253 additions and 16 deletions
+74 -7
View File
@@ -8,11 +8,13 @@ use Fisharebest\Webtrees\Http\RequestHandlers\ControlPanel;
use Fisharebest\Webtrees\Http\RequestHandlers\ModulesAllPage;
use Fisharebest\Webtrees\I18N;
use Fisharebest\Webtrees\Tree;
use Fisharebest\Webtrees\User;
use Illuminate\Support\Collection;
/**
* @var Module $module
* @var Collection<int,Tree> $all_trees
* @var Collection<int,User> $all_users
* @var string $cron_token
* @var string $cron_url
* @var string $title
@@ -117,16 +119,43 @@ use Illuminate\Support\Collection;
</div>
</div>
<div class="row mb-3">
<label class="col-sm-3 col-form-label" for="subject-<?= $id ?>">
<fieldset class="row mb-3">
<legend class="col-sm-3 col-form-label">
<?= I18N::translate('Subject prefix') ?>
</label>
</legend>
<div class="col-sm-9">
<input class="form-control" type="text"
id="subject-<?= $id ?>" name="subject-<?= $id ?>"
value="<?= e($subject) ?>">
<small class="form-text text-muted d-block mb-2">
<?= I18N::translate('Prepended to the email subject line. Leave a field blank to fall back to the generic prefix below.') ?>
</small>
<?php foreach (Configuration::supportedSubjectLocales() as $code => $label) : ?>
<?php
$field = 'subject-' . $id . '-' . $code;
$val = $tree->getPreference(
Configuration::PREF_SUBJECT_PREFIX_PREFIX . $code,
'',
);
?>
<div class="input-group input-group-sm mb-2">
<span class="input-group-text" style="min-width: 7rem;">
<?= e($label) ?>
</span>
<input class="form-control" type="text"
id="<?= e($field) ?>" name="<?= e($field) ?>"
value="<?= e($val) ?>"
placeholder="<?= e('[' . $tree->title() . '] ') ?>">
</div>
<?php endforeach ?>
<div class="input-group input-group-sm">
<span class="input-group-text" style="min-width: 7rem;">
<?= I18N::translate('Generic') ?>
</span>
<input class="form-control" type="text"
id="subject-<?= $id ?>" name="subject-<?= $id ?>"
value="<?= e($subject) ?>">
</div>
</div>
</div>
</fieldset>
<div class="row mb-3">
<label class="col-sm-3 col-form-label" for="extras-<?= $id ?>">
@@ -138,6 +167,44 @@ use Illuminate\Support\Collection;
</div>
</div>
<div class="row mb-3">
<label class="col-sm-3 col-form-label">
<?= I18N::translate('Subscribed users') ?>
</label>
<div class="col-sm-9">
<input type="hidden" name="users-submitted-<?= $id ?>" value="1">
<?php if ($all_users->isEmpty()) : ?>
<small class="form-text text-muted">
<?= I18N::translate('No users with email addresses found.') ?>
</small>
<?php else : ?>
<small class="form-text text-muted d-block mb-2">
<?= I18N::translate('Tick a user to subscribe them to this trees newsletter. Users can still adjust their own subscription on their account page.') ?>
</small>
<div class="border rounded p-2"
style="max-height: 18rem; overflow-y: auto;">
<?php foreach ($all_users as $user) : ?>
<?php
$field = 'subscribe-' . $id . '-' . $user->id();
$is_subbed = $tree->getUserPreference($user, Configuration::USER_PREF_SUBSCRIBED) === '1';
?>
<div class="form-check">
<input class="form-check-input" type="checkbox"
id="<?= e($field) ?>" name="<?= e($field) ?>"
value="1" <?= $is_subbed ? 'checked' : '' ?>>
<label class="form-check-label" for="<?= e($field) ?>">
<?= e($user->realName()) ?>
<small class="text-muted">
&lt;<?= e($user->email()) ?>&gt;
</small>
</label>
</div>
<?php endforeach ?>
</div>
<?php endif ?>
</div>
</div>
<?php if ($last_sent > 0) : ?>
<div class="row mb-3">
<div class="offset-sm-3 col-sm-9">