*
* PHP version 5
*
- * Copyright © 2020-2021 The Galette Team
+ * Copyright © 2020-2023 The Galette Team
*
* This file is part of Galette (http://galette.tuxfamily.org).
*
* You should have received a copy of the GNU General Public License
* along with Galette. If not, see <http://www.gnu.org/licenses/>.
*
- * @category Entity
+ * @category Features
* @package Galette
*
* @author Johan Cwiklinski <johan@x-tnd.be>
- * @copyright 2020-2021 The Galette Team
+ * @copyright 2020-2023 The Galette Team
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL License 3.0 or (at your option) any later version
* @link http://galette.eu
* @since 2020-12-20
use Galette\Core\Logo;
use Galette\Core\Preferences;
use Galette\DynamicFields\Choice;
+use Galette\DynamicFields\Separator;
use Galette\Entity\Adherent;
use Galette\Entity\Contribution;
use Galette\Entity\PdfModel;
+use Galette\Entity\Reminder;
+use Galette\Entity\Texts;
use Galette\Repository\DynamicFieldsSet;
use Galette\DynamicFields\DynamicField;
use Analog\Analog;
use NumberFormatter;
-use Slim\Router;
+use PHPMailer\PHPMailer\PHPMailer;
+use Slim\Routing\RouteParser;
+use DI\Attribute\Inject;
/**
* Replacements feature
* @name Replacements
* @package Galette
* @author Johan Cwiklinski <johan@x-tnd.be>
- * @copyright 2020-2021 The Galette Team
+ * @copyright 2020-2023 The Galette Team
* @license http://www.gnu.org/licenses/gpl-3.0.html GPL License 3.0 or (at your option) any later version
* @link http://galette.eu
* @since 2020-12-20
private $patterns = [];
private $replaces = [];
private $dynamic_patterns = [];
+ private ?PHPMailer $mail = null;
/**
- * @Inject("db")
* @var Db
*/
+ #[Inject("zdb")]
protected $zdb;
/**
- * @Inject("login")
* @var Login
*/
+ #[Inject("login")]
protected $login;
/**
- * @Inject("preferences")
* @var Preferences
*/
+ #[Inject("preferences")]
protected $preferences;
/**
- * @Inject
- * @var Router
+ * @var RouteParser
*/
- protected $router;
+ protected $routeparser;
/**
* Get dynamic patterns
$dynamic_patterns = [];
foreach ($dynamic_fields as $dynamic_field) {
+ //no pattern for separators
+ if ($dynamic_field instanceof Separator) {
+ continue;
+ }
$key = strtoupper('DYNFIELD_' . $dynamic_field->getId() . '_' . $form_name);
$capabilities = [
'LABEL',
''
];
- if ($legacy === true || $dynamic_field instanceof Choice) {
+ if (!($this instanceof Texts) && ($legacy === true || $dynamic_field instanceof Choice)) {
$capabilities[] = 'INPUT';
}
foreach ($capabilities as $capability) {
break;
case '':
case 'VALUE':
+ default:
$skey = $key;
$title = _T('Value for dynamic field "%s"');
break;
'pattern' => '/{ASSO_LOGO}/',
],
'date_now' => [
+ //TRANS: see https://www.php.net/manual/datetime.format.php
'title' => _T('Current date (Y-m-d)'),
'pattern' => '/{DATE_NOW}/'
],
'login_uri' => [
'title' => _T("Galette's login URI"),
'pattern' => '/{LOGIN_URI}/'
+ ],
+ 'asso_footer' => [
+ 'title' => trim(trim(_T("Footer text:"), ':')),
+ 'pattern' => '/{ASSO_FOOTER}/'
]
];
}
'title' => _T("Member's ID"),
'pattern' => '/{ID_ADH}/',
],
+ 'adh_num' => [
+ 'title' => _T("Member number"),
+ 'pattern' => '/{NUM_ADH}/',
+ ],
'adh_name' => [
'title' => _T("Name"),
'pattern' => '/{NAME_ADH}/',
'title' => _T("Address"),
'pattern' => '/{ADDRESS_ADH}/',
],
+ 'adh_address_multi' => [
+ 'title' => sprintf('%s (%s)', _T('Address'), _T('with break lines')),
+ 'pattern' => '/{ADDRESS_ADH_MULTI}/',
+ ],
'adh_zip' => [
'title' => _T("Zipcode"),
'pattern' => '/{ZIP_ADH}/',
}
$c_patterns['__contrib_label'] = [
- 'title' => $c_patterns['contrib_label'],
+ 'title' => $c_patterns['contrib_label']['title'],
'pattern' => '/{CONTRIB_TYPE}/'
];
}
//handle DEADLINE alias
+ $c_patterns['deadline'] = [
+ 'title' => $c_patterns['contrib_edate']['title'],
+ 'pattern' => '/{DEADLINE}/'
+ ];
return $c_patterns + $dynamic_patterns;
}
+ /**
+ * Set mail instance
+ *
+ * @param PHPMailer $mail PHPMailer instance
+ *
+ * @return self
+ */
+ public function setMail(PHPMailer $mail): self
+ {
+ $this->mail = $mail;
+ return $this;
+ }
+
/**
* Set main replacements
*
}
$logo = new Logo();
- $logo_elt = '<img' .
- ' src="' . $this->preferences->getURL() . $this->router->pathFor('logo') . '"' .
- ' width="' . $logo->getOptimalWidth() . '"' .
- ' height="' . $logo->getOptimalHeight() . '"' .
- '/>';
+ if ($this->mail !== null) {
+ $logo_content = $this->preferences->getURL() . $this->routeparser->urlFor('logo');
+ } else {
+ $logo_content = '@' . base64_encode(file_get_contents($logo->getPath()));
+ }
+ $logo_elt = sprintf(
+ '<img src="%1$s" width="%2$s" height="%3$s" alt="" />',
+ $logo_content,
+ $logo->getOptimalWidth(),
+ $logo->getOptimalHeight()
+ );
$this->setReplacements(
array(
'asso_address_multi' => $address_multi,
'asso_website' => $website,
'asso_logo' => $logo_elt,
+ //TRANS: see https://www.php.net/manual/datetime.format.php
'date_now' => date(_T('Y-m-d')),
- 'login_uri' => $this->preferences->getURL() . $this->router->pathFor('login'),
+ 'login_uri' => $this->preferences->getURL() . $this->routeparser->urlFor('login'),
+ 'asso_footer' => $this->preferences->pref_footer
)
);
$c_replacements['__contrib_label'] = $c_replacements['contrib_label'];
//handle DEADLINE alias
+ $c_replacements['deadline'] = null;
$this->setReplacements($c_replacements);
*
* @param Contribution $contrib Contribution
*
- * @return PdfModel
+ * @return self
*/
public function setContribution(Contribution $contrib): self
{
$c_replacements['__contrib_label'] = $c_replacements['contrib_label'];
//handle DEADLINE alias
+ $c_replacements['deadline'] = $c_replacements['contrib_edate'];
$this->setReplacements($c_replacements);
*
* @param Adherent $member Member
*
- * @return PdfModel
+ * @return self
*/
public function setMember(Adherent $member): self
{
global $login;
- $address = $member->address;
- if ($member->address_continuation !== '') {
- $address .= '<br/>' . $member->address_continuation;
- }
+ $address = $member->getAddress();
+ $address_multi = preg_replace("/\n/", "<br>", $address);
if ($member->isMan()) {
$gender = _T("Man");
array(
'adh_title' => $member->stitle,
'adh_id' => $member->id,
+ 'adh_num' => $member->number,
'adh_name' => $member->sfullname,
'adh_last_name' => $member->name,
'adh_first_name' => $member->surname,
'adh_profession' => $member->job,
'adh_company' => $member->company_name,
'adh_address' => $address,
- 'adh_zip' => $member->zipcode,
- 'adh_town' => $member->town,
- 'adh_country' => $member->country,
+ 'adh_address_multi' => $address_multi,
+ 'adh_zip' => $member->getZipcode(),
+ 'adh_town' => $member->getTown(),
+ 'adh_country' => $member->getCountry(),
'adh_phone' => $member->phone,
'adh_mobile' => $member->gsm,
+ //always take current member email, to be sure.
'adh_email' => $member->email,
'adh_login' => $member->login,
'adh_main_group' => $main_group,
'adh_groups' => $group_list,
'adh_dues' => $member->getDues(),
'days_remaining' => $member->days_remaining,
- 'days_expired' => ($member->days_remaining * -1),
+ 'days_expired' => (int)$member->days_remaining + 1,
//Handle COMPANY_NAME_ADH... https://bugs.galette.eu/issues/1530
'_adh_company' => $member->company_name,
//Handle old names for variables ... https://bugs.galette.eu/issues/1393
* @param array $dynamic_fields Dynamic fields
* @param mixed $object Related object (Adherent, Contribution, ...)
*
- * @return PdfModel
+ * @return self
*/
public function setDynamicFields(string $form_name, array $dynamic_fields, $object): self
{
switch ($field_type) {
case DynamicField::CHOICE:
+ $choice_values = $dynamic_fields[$field_id]->getValues();
if ($capacity == 'INPUT') {
- $choice_values = $dynamic_fields[$field_id]->getValues();
foreach ($choice_values as $choice_idx => $choice_value) {
$value .= '<input type="radio" class="box" name="' . $field_name . '" value="' . $field_id . '"';
if (isset($field_values[$choice_idx])) {
$value .= ' disabled="disabled">' . $choice_value . ' ';
}
} else {
- $value .= implode(' ', $field_values);
+ foreach ($field_values as $field_value) {
+ $value .= $field_value;
+ }
+ }
+ break;
+ case DynamicField::BOOLEAN:
+ foreach ($field_values as $field_value) {
+ $value .= ($field_value ? _T("Yes") : _T("No"));
}
break;
case DynamicField::FILE:
- //TODO: link to file
+ $pos = 0;
+ foreach ($field_values as $field_value) {
+ if (empty($field_value)) {
+ continue;
+ }
+ $spattern = (($this instanceof Texts) ?
+ '%3$s (%1$s%2$s)' :
+ '<a href="%1$s%2$s">%3$s</a>'
+ );
+ $value .= sprintf(
+ $spattern,
+ $this->preferences->getURL(),
+ $this->routeparser->urlFor(
+ 'getDynamicFile',
+ [
+ 'form_name' => $form_name,
+ 'id' => $object->id,
+ 'fid' => $field_id,
+ 'pos' => ++$pos,
+ 'name' => $field_value
+ ]
+ ),
+ $field_value
+ );
+ }
+ break;
case DynamicField::TEXT:
case DynamicField::LINE:
case DynamicField::DATE:
- //TODO: ensure display
- case DynamicField::BOOLEAN:
- //TODO: ensure display
$value .= implode('<br/>', $field_values);
break;
}
}
/**
- * Set Router dependency
+ * Set RouteParser dependency
*
- * @param Router $router Router instance
+ * @param RouteParser $routeparser RouteParser instance
*
* @return $this
*/
- public function setRouter(Router $router): self
+ public function setRouteparser(RouteParser $routeparser): self
{
- $this->router = $router;
+ $this->routeparser = $routeparser;
return $this;
}
*/
protected function proceedReplacements(string $source): string
{
- $replaced = $source;
-
//handle translations
$callback = static function ($matches) {
return _T($matches[1]);
$replaced
);
- return $replaced;
+ return trim($replaced);
}
/**