From 8b5d5dc9ea5b65dc687bdab55826b9f1d57d97d9 Mon Sep 17 00:00:00 2001 From: Aday Bujeda Date: Thu, 23 May 2024 15:43:25 +0100 Subject: [PATCH 1/3] Updated submission checklist rendering in submission creation workflow --- pprOjsPlugin/css/iqss.css | 9 ++ .../PPRTemplateOverrideService.inc.php | 1 + .../templates/submission/form/step1.tpl | 116 ++++++++++++++++++ .../PPRTemplateOverrideServiceTest.php | 1 + 4 files changed, 127 insertions(+) create mode 100644 pprOjsPlugin/templates/submission/form/step1.tpl diff --git a/pprOjsPlugin/css/iqss.css b/pprOjsPlugin/css/iqss.css index 4759a07..c3d2f7c 100644 --- a/pprOjsPlugin/css/iqss.css +++ b/pprOjsPlugin/css/iqss.css @@ -45,6 +45,15 @@ div.pkpPublication__header div.pkpHeader__actions{ /** SUBMISSION */ +#ppr_start_submissionChecklist label { + cursor: default; +} + +#ppr_start_submissionChecklist ul { + list-style: revert; + padding: revert; +} + #ppr_confirmation_submissionChecklist { font-size: .875rem; line-height: 1.5rem; diff --git a/pprOjsPlugin/services/PPRTemplateOverrideService.inc.php b/pprOjsPlugin/services/PPRTemplateOverrideService.inc.php index 3893465..5ce70f6 100644 --- a/pprOjsPlugin/services/PPRTemplateOverrideService.inc.php +++ b/pprOjsPlugin/services/PPRTemplateOverrideService.inc.php @@ -72,6 +72,7 @@ public function __construct($plugin) { } if ($this->pprPlugin->getPluginSettings()->submissionConfirmationChecklistEnabled()) { + $this->overriddenTemplates[] = 'lib/pkp/templates/submission/form/step1.tpl'; $this->overriddenTemplates[] = 'lib/pkp/templates/submission/form/step4.tpl'; } diff --git a/pprOjsPlugin/templates/submission/form/step1.tpl b/pprOjsPlugin/templates/submission/form/step1.tpl new file mode 100644 index 0000000..d46e383 --- /dev/null +++ b/pprOjsPlugin/templates/submission/form/step1.tpl @@ -0,0 +1,116 @@ +{** + * templates/submission/form/step1.tpl + * + * Copyright (c) 2014-2021 Simon Fraser University + * Copyright (c) 2003-2021 John Willinsky + * Distributed under the GNU GPL v3. For full terms see the file docs/COPYING. + * + * Step 1 of author submission process. + *} + + +
+{csrf} +{if $submissionId}{/if} + + +{include file="controllers/notification/inPlaceNotification.tpl" notificationId="submitStep1FormNotification"} + +{fbvFormArea id="submissionStep1"} + + {$additionalFormContent1} + + {include file="submission/submissionLocale.tpl"} + + {$additionalFormContent2} + + {include file="submission/form/categories.tpl"} + + {* PPR SUBMISSION CHECKLIST OVERRIDE *} + {* REMOVE CHECKBOXES => JUST DISPLAY THE CHECKLIST *} + {if $currentContext->getLocalizedData('submissionChecklist')} + {fbvFormSection list="true" label="submission.submit.submissionChecklist" description="submission.submit.submissionChecklistDescription" id="ppr_start_submissionChecklist"} + {foreach name=checklist from=$currentContext->getLocalizedData('submissionChecklist') key=checklistId item=checklistItem} +
  • + +
  • + {* CHECKLIST ITEMS ARE COMPULSORY AND VALIDATED IN THE BACKEND *} + {fbvElement type="hidden" id="checklist-$checklistId" value=1} + {/foreach} + {/fbvFormSection} + {/if} + {* PPR SUBMISSION CHECKLIST OVERRIDE END *} + + {* Cover Note To Editor*} + {fbvFormSection for="commentsToEditor" title="submission.submit.coverNote"} + {fbvElement type="textarea" name="commentsToEditor" id="commentsToEditor" value=$commentsToEditor rich=true} + {/fbvFormSection} + + {* Submitting in which role? *} + {if $noExistingRoles} + {if count($userGroupOptions) > 1} + {fbvFormSection label="submission.submit.availableUserGroups" description="submission.submit.availableUserGroupsDescription" list=true required=true} + {foreach from=$userGroupOptions key="userGroupId" item="userGroupName"} + {if $defaultGroup->getId() == $userGroupId}{assign var="checked" value=true}{else}{assign var="checked" value=false}{/if} + {fbvElement type="radio" id="userGroup"|concat:$userGroupId name="userGroupId" value=$userGroupId checked=$checked label=$userGroupName translate=false} + {/foreach} + {/fbvFormSection} + {else} + {foreach from=$userGroupOptions key="userGroupId" item="userGroupName"} + {capture assign="onlyUserGroupId"}{$userGroupId}{/capture} + {/foreach} + {fbvFormSection label="submission.submit.contactConsent" list=true required=true} + {fbvElement type="checkbox" id="userGroupId" required=true value=$onlyUserGroupId label="submission.submit.contactConsentDescription"} + {/fbvFormSection} + {/if} + + {* If user has existing roles, show available roles or automatically select single role *} + {else} + {if count($userGroupOptions) > 1} + {fbvFormSection label="submission.submit.availableUserGroups" list=true required=true} + {if $managerGroups} + {translate key='submission.submit.userGroupDescriptionManagers' managerGroups=$managerGroups} + {else} + {translate key='submission.submit.userGroupDescription'} + {/if} + {foreach from=$userGroupOptions key="userGroupId" item="userGroupName"} + {if $defaultGroup->getId() == $userGroupId}{assign var="checked" value=true}{else}{assign var="checked" value=false}{/if} + {fbvElement type="radio" id="userGroup"|concat:$userGroupId name="userGroupId" value=$userGroupId checked=$checked label=$userGroupName translate=false} + {/foreach} + {/fbvFormSection} + {elseif count($userGroupOptions) == 1} + {foreach from=$userGroupOptions key="userGroupId" item="authorUserGroupName"}{assign var=userGroupId value=$userGroupId}{/foreach} + {fbvElement type="hidden" id="userGroupId" value=$userGroupId} + {/if} + {/if} + + {if $copyrightNotice} + {fbvFormSection title="submission.submit.copyrightNoticeAgreementLabel"} + {$copyrightNotice} + {fbvFormSection list="true"} + {fbvElement type="checkbox" id="copyrightNoticeAgree" required=true value=1 label="submission.submit.copyrightNoticeAgree" checked=$submissionId} + {/fbvFormSection} + {/fbvFormSection} + {/if} + + {* Privacy Statement *} + {if $hasPrivacyStatement} + {fbvFormSection list="true"} + {capture assign="privacyUrl"}{url router=$smarty.const.ROUTE_PAGE page="about" op="privacy"}{/capture} + {capture assign="privacyLabel"}{translate key="user.register.form.privacyConsent" privacyUrl=$privacyUrl}{/capture} + {fbvElement type="checkbox" id="privacyConsent" required=true value=1 label=$privacyLabel translate=false checked=$privacyConsent} + {/fbvFormSection} + {/if} + + {* Buttons *} + {fbvFormButtons id="step1Buttons" submitText="common.saveAndContinue"} + +

    {translate key="common.requiredField"}

    +{/fbvFormArea} + +
    diff --git a/pprOjsPlugin/tests/src/services/PPRTemplateOverrideServiceTest.php b/pprOjsPlugin/tests/src/services/PPRTemplateOverrideServiceTest.php index c5a0e02..c955646 100644 --- a/pprOjsPlugin/tests/src/services/PPRTemplateOverrideServiceTest.php +++ b/pprOjsPlugin/tests/src/services/PPRTemplateOverrideServiceTest.php @@ -115,6 +115,7 @@ public function test_expected_overridden_templates_for_each_setting() { ]; $expectedTemplatesForSetting['submissionConfirmationChecklistEnabled'] = [ + 'lib/pkp/templates/submission/form/step1.tpl', 'lib/pkp/templates/submission/form/step4.tpl', ]; From 5b0b2b3d72470212f1ca62797ff02389b8383097 Mon Sep 17 00:00:00 2001 From: Aday Bujeda Date: Thu, 23 May 2024 15:44:17 +0100 Subject: [PATCH 2/3] Updated FirstNameService to replace email template body to show updated variables in OJS activity log --- .../email/PPRFirstNameEmailService.inc.php | 5 +- .../PPRFirstNamesManagementServiceTest.php | 40 +++++++--- .../PPRFirstNamesManagementService.inc.php | 74 +++++++++---------- 3 files changed, 70 insertions(+), 49 deletions(-) diff --git a/pprOjsPlugin/services/email/PPRFirstNameEmailService.inc.php b/pprOjsPlugin/services/email/PPRFirstNameEmailService.inc.php index 26c4ee3..a4147ef 100644 --- a/pprOjsPlugin/services/email/PPRFirstNameEmailService.inc.php +++ b/pprOjsPlugin/services/email/PPRFirstNameEmailService.inc.php @@ -49,7 +49,7 @@ class PPRFirstNameEmailService { private $pprPlugin; private $pprObjectFactory; - function __construct($plugin, $pprObjectFactory = null) { + public function __construct($plugin, $pprObjectFactory = null) { $this->pprPlugin = $plugin; $this->pprObjectFactory = $pprObjectFactory ?: new PPRObjectFactory(); $this->pprPlugin->import('util.PPRMissingUser'); @@ -91,7 +91,10 @@ function addPPRStageParticipantGridHandler($hookName, $hookArgs) { function addFirstNamesToEmailTemplate($hookName, $arguments) { $emailTemplate = $arguments[0]; if ($emailTemplate instanceof SubmissionMailTemplate && $this->isEmailSupported($emailTemplate->emailKey)) { + error_log("PPR[PPRFirstNameEmailService] processing emailTemplate={$emailTemplate->emailKey}"); $this->pprObjectFactory->firstNamesManagementService()->addFirstNamesToEmailTemplate($emailTemplate); + } else { + error_log("PPR[PPRFirstNameEmailService] notSupported emailTemplate={$emailTemplate->emailKey}"); } return false; diff --git a/pprOjsPlugin/tests/src/util/PPRFirstNamesManagementServiceTest.php b/pprOjsPlugin/tests/src/util/PPRFirstNamesManagementServiceTest.php index a98cebc..87db134 100644 --- a/pprOjsPlugin/tests/src/util/PPRFirstNamesManagementServiceTest.php +++ b/pprOjsPlugin/tests/src/util/PPRFirstNamesManagementServiceTest.php @@ -54,6 +54,22 @@ public function test_getReviewer_should_use_authorized_object_when_all_others_ar $this->assertEquals($reviewer, $result); } + public function test_getReviewer_should_not_break_when_request_handler_is_null() { + $submissionUtil = $this->createMock(PPRSubmissionUtil::class); + $this->getRequestMock()->method('getUserVar')->withConsecutive(['reviewerId'], ['reviewAssignmentId']) + ->willReturnOnConsecutiveCalls(null, null); + + $requestMock = $this->createMock(Request::class); + $router = $this->createMock(PKPRouter::class); + $router->expects($this->once())->method('getHandler')->willReturn(null); + $requestMock->method('getRouter')->willReturn($router); + Registry::set('request', $requestMock); + + $target = new PPRFirstNamesManagementService($submissionUtil); + $result = $target->getReviewer(null); + $this->assertEquals(PPRMissingUser::defaultMissingUser(), $result); + } + public function test_getContributorsNames_should_return_author_first_name_when_emailContributors_is_null() { $author = $this->getTestUtil()->createAuthor($this->getRandomId(), 'AuthorName', 'AuthorName'); $submission = $this->getTestUtil()->createSubmissionWithAuthors('PrimaryAuthorName', ['PrimaryAuthorName', 'ContributorName']); @@ -161,16 +177,17 @@ public function test_addFirstNamesToEmailTemplate_should_not_update_mail_templat public function test_addFirstNamesToEmailTemplate_should_add_author_editor_reviewer_names() { $submissionUtil = $this->createMock(PPRSubmissionUtil::class); $mailTemplate = $this->createSubmissionEmailTemplate(); + $mailTemplate->expects($this->once())->method('getBody')->willReturn($this->createTextToReplace()); + $mailTemplate->expects($this->once())->method('getSubject')->willReturn($this->createTextToReplace()); + $this->addEditorAndAuthor($submissionUtil); $reviewerId = $this->getRandomId(); $mailTemplate->method('getData')->with('reviewerId')->willReturn($reviewerId); $this->addReviewer($submissionUtil, $reviewerId); - $mailTemplate->expects($this->exactly(11))->method('addPrivateParam') - ->withConsecutive( - ['{$authorName}', 'authorFullName'], ['{$authorFullName}', 'authorFullName'], ['{$authorFirstName}', 'authorFirstName'], ['{$contributorsNames}', 'authorFirstName'], - ['{$editorName}', 'editorFullName'], ['{$editorFullName}', 'editorFullName'], ['{$editorFirstName}', 'editorFirstName'], - ['{$reviewerName}', 'reviewerFullName'], ['{$reviewerFullName}', 'reviewerFullName'], ['{$reviewerFirstName}', 'reviewerFirstName'], ['{$firstNameOnly}', 'reviewerFirstName']); + $expectedText = 'Author: authorFullName - authorFullName - authorFirstName - authorFirstName, Editor: editorFullName - editorFullName - editorFirstName, Reviewer: reviewerFullName - reviewerFullName - reviewerFirstName - reviewerFirstName'; + $mailTemplate->expects($this->once())->method('setBody')->with($expectedText); + $mailTemplate->expects($this->once())->method('setSubject')->with($expectedText); $target = new PPRFirstNamesManagementService($submissionUtil); $target->addFirstNamesToEmailTemplate($mailTemplate); @@ -179,14 +196,17 @@ public function test_addFirstNamesToEmailTemplate_should_add_author_editor_revie public function test_addFirstNamesToEmailTemplate_should_handle_missing_author_editor_and_reviewer() { $submissionUtil = $this->createMock(PPRSubmissionUtil::class); $mailTemplate = $this->createSubmissionEmailTemplate(); + $mailTemplate->expects($this->once())->method('getBody')->willReturn($this->createTextToReplace()); + $mailTemplate->expects($this->once())->method('getSubject')->willReturn($this->createTextToReplace()); + $this->addEditorAndAuthor($submissionUtil, true); $missingName = __('ppr.user.missing.name'); - $mailTemplate->expects($this->exactly(11))->method('addPrivateParam') - ->withConsecutive( - ['{$authorName}', $missingName], ['{$authorFullName}', $missingName], ['{$authorFirstName}', $missingName], ['{$contributorsNames}', $missingName], - ['{$editorName}', $missingName], ['{$editorFullName}', $missingName], ['{$editorFirstName}', $missingName], - ['{$reviewerName}', $missingName], ['{$reviewerFullName}', $missingName], ['{$reviewerFirstName}', $missingName], ['{$firstNameOnly}', $missingName]); + $expectedText = sprintf('Author: %s - %s - %s - %s, Editor: %s - %s - %s, Reviewer: %s - %s - %s - %s', + $missingName, $missingName, $missingName, $missingName, $missingName, $missingName, $missingName, $missingName, $missingName, $missingName, $missingName); + + $mailTemplate->expects($this->once())->method('setBody')->with($expectedText); + $mailTemplate->expects($this->once())->method('setSubject')->with($expectedText); $target = new PPRFirstNamesManagementService($submissionUtil); $target->addFirstNamesToEmailTemplate($mailTemplate); diff --git a/pprOjsPlugin/util/PPRFirstNamesManagementService.inc.php b/pprOjsPlugin/util/PPRFirstNamesManagementService.inc.php index d373a1d..a934be1 100644 --- a/pprOjsPlugin/util/PPRFirstNamesManagementService.inc.php +++ b/pprOjsPlugin/util/PPRFirstNamesManagementService.inc.php @@ -9,11 +9,11 @@ class PPRFirstNamesManagementService { private $pprSubmissionUtil; - function __construct($pprSubmissionUtil) { + public function __construct($pprSubmissionUtil) { $this->pprSubmissionUtil = $pprSubmissionUtil; } - function addFirstNameLabelsToTemplate($templateVariableName) { + public function addFirstNameLabelsToTemplate($templateVariableName) { // ADD FIRST NAME LABELS FOR REVIEWER, AUTHOR, AND EDITOR IN THE EMAIL BODY EDITOR IN THE FORM $templateMgr = TemplateManager::getManager(Application::get()->getRequest()); $emailVariables = $templateMgr->getTemplateVars($templateVariableName) ?? []; @@ -32,36 +32,26 @@ function addFirstNameLabelsToTemplate($templateVariableName) { $templateMgr->assign($templateVariableName, $emailVariables); } - function addFirstNamesToEmailTemplate($emailTemplate) { + public function addFirstNamesToEmailTemplate($emailTemplate) { $submission = $emailTemplate->submission; if (!$submission) { error_log(sprintf("PPR[PPRFirstNameReplacementService] emailTemplate=%s - submission is null - skip", $emailTemplate->emailKey)); return false; } - // SETTING PRIVATE PARAMS IN THE EMAIL TEMPLATE WILL GET REPLACED IN THE BODY AFTER THIS HOOK COMPLETES - // AT THIS POINT REGULAR PARAMETERS HAVE ALREADY BEEN REPLACED $submissionAuthor = $this->getSubmissionAuthor($submission->getId()); $contributorsNames = $this->getContributorsNames($submission, $submissionAuthor); - $emailTemplate->addPrivateParam('{$authorName}', htmlspecialchars($submissionAuthor->getFullName())); - $emailTemplate->addPrivateParam('{$authorFullName}', htmlspecialchars($submissionAuthor->getFullName())); - $emailTemplate->addPrivateParam('{$authorFirstName}', htmlspecialchars($submissionAuthor->getLocalizedGivenName())); - $emailTemplate->addPrivateParam('{$contributorsNames}', htmlspecialchars($contributorsNames)); $contextId = $submission->getContextId(); $submissionEditor = $this->getSubmissionEditor($submission->getId(), $contextId); - $emailTemplate->addPrivateParam('{$editorName}', htmlspecialchars($submissionEditor->getFullName())); - $emailTemplate->addPrivateParam('{$editorFullName}', htmlspecialchars($submissionEditor->getFullName())); - $emailTemplate->addPrivateParam('{$editorFirstName}', htmlspecialchars($submissionEditor->getLocalizedGivenName())); - // CHECK THE REVIEWER ID MARKER IN TEMPLATE OR REQUEST PARAMETER + // CHECK THE REVIEWER ID MARKER IN TEMPLATE $reviewerId = $emailTemplate->getData('reviewerId'); $requestReviewer = $this->getReviewer($reviewerId); - $emailTemplate->addPrivateParam('{$reviewerName}', htmlspecialchars($requestReviewer->getFullName())); - $emailTemplate->addPrivateParam('{$reviewerFullName}', htmlspecialchars($requestReviewer->getFullName())); - $emailTemplate->addPrivateParam('{$reviewerFirstName}', htmlspecialchars($requestReviewer->getLocalizedGivenName())); - // firstNameOnly (REVIEWER) IS DEPRECATED. ADDED HERE FOR BACKWARDS COMPATIBILITY FOR advancedsearchreviewerform - $emailTemplate->addPrivateParam('{$firstNameOnly}', htmlspecialchars($requestReviewer->getLocalizedGivenName())); + + $tempTemplate = $this->replaceParams($emailTemplate->getBody(), $emailTemplate->getSubject(), $submissionAuthor, $requestReviewer, $submissionEditor, $contributorsNames); + $emailTemplate->setBody($tempTemplate->getBody()); + $emailTemplate->setSubject($tempTemplate->getSubject()); } /** @@ -73,24 +63,7 @@ public function replaceFirstNames($originalText, $submission, $reviewerId = null $author = $submission ? $this->getSubmissionAuthor($submission->getId()) : PPRMissingUser::defaultMissingUser(); $contributorsNames = $submission ? $this->getContributorsNames($submission, $author) : PPRMissingUser::defaultMissingUser()->getLocalizedGivenName(); - // WE NEED ANY EMAIL TEMPLATE TO OVERRIDE THE BODY AND USE THE replaceParams METHOD - $mailTemplate = new MailTemplate(); - $mailTemplate->setBody($originalText); - $mailTemplate->assignParams([ - 'reviewerName' => htmlspecialchars($reviewer->getFullName()), - 'reviewerFullName' => htmlspecialchars($reviewer->getFullName()), - 'reviewerFirstName' => htmlspecialchars($reviewer->getLocalizedGivenName()), - // firstNameOnly (REVIEWER) IS DEPRECATED. ADDED HERE FOR BACKWARDS COMPATIBILITY FOR advancedsearchreviewerform - 'firstNameOnly' => htmlspecialchars($reviewer->getLocalizedGivenName()), - 'editorName' => htmlspecialchars($editor->getFullName()), - 'editorFullName' => htmlspecialchars($editor->getFullName()), - 'editorFirstName' => htmlspecialchars($editor->getLocalizedGivenName()), - 'authorName' => htmlspecialchars($author->getFullName()), - 'authorFullName' => htmlspecialchars($author->getFullName()), - 'authorFirstName' => htmlspecialchars($author->getLocalizedGivenName()), - 'contributorsNames' => htmlspecialchars($contributorsNames), - ]); - $mailTemplate->replaceParams(); + $mailTemplate = $this->replaceParams($originalText, '', $author, $reviewer, $editor, $contributorsNames); return $mailTemplate->getBody(); } @@ -105,9 +78,12 @@ public function getReviewer($reviewerId) { } elseif ($reviewId = $request->getUserVar('reviewAssignmentId')) { // TRY reviewAssignment REQUEST PARAMETER $reviewer = $this->pprSubmissionUtil->getReviewer($reviewId); - } elseif ($review = $request->getRouter()->getHandler()->getAuthorizedContextObject(ASSOC_TYPE_REVIEW_ASSIGNMENT)) { + } elseif ($request->getRouter()->getHandler()) { + $review = $request->getRouter()->getHandler()->getAuthorizedContextObject(ASSOC_TYPE_REVIEW_ASSIGNMENT); // LAST CHANCE TO GET A reviewAssignment OBJECT - $reviewer = $this->pprSubmissionUtil->getReviewer($review->getId()); + if ($review) { + $reviewer = $this->pprSubmissionUtil->getReviewer($review->getId()); + } } return $reviewer ?? PPRMissingUser::defaultMissingUser(); @@ -143,4 +119,26 @@ private function getSubmissionAuthor($submissionId) { //GET FIRST AUTHOR return empty($submissionAuthors) ? PPRMissingUser::defaultMissingUser() : reset($submissionAuthors); } + + private function replaceParams($body, $subject, $author, $reviewer, $editor, $contributorsNames) { + $mailTemplate = new MailTemplate(); + $mailTemplate->setBody($body); + $mailTemplate->setSubject($subject); + $mailTemplate->assignParams([ + 'reviewerName' => htmlspecialchars($reviewer->getFullName()), + 'reviewerFullName' => htmlspecialchars($reviewer->getFullName()), + 'reviewerFirstName' => htmlspecialchars($reviewer->getLocalizedGivenName()), + // firstNameOnly (REVIEWER) IS DEPRECATED. ADDED HERE FOR BACKWARDS COMPATIBILITY FOR advancedsearchreviewerform + 'firstNameOnly' => htmlspecialchars($reviewer->getLocalizedGivenName()), + 'editorName' => htmlspecialchars($editor->getFullName()), + 'editorFullName' => htmlspecialchars($editor->getFullName()), + 'editorFirstName' => htmlspecialchars($editor->getLocalizedGivenName()), + 'authorName' => htmlspecialchars($author->getFullName()), + 'authorFullName' => htmlspecialchars($author->getFullName()), + 'authorFirstName' => htmlspecialchars($author->getLocalizedGivenName()), + 'contributorsNames' => htmlspecialchars($contributorsNames), + ]); + $mailTemplate->replaceParams(); + return $mailTemplate; + } } \ No newline at end of file From b2a7bb3b88711832be72842cc2ac93c3caadd132 Mon Sep 17 00:00:00 2001 From: Aday Bujeda Date: Thu, 23 May 2024 15:59:37 +0100 Subject: [PATCH 3/3] Fixed possible undefined property when logging the email template key --- pprOjsPlugin/services/email/PPRFirstNameEmailService.inc.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pprOjsPlugin/services/email/PPRFirstNameEmailService.inc.php b/pprOjsPlugin/services/email/PPRFirstNameEmailService.inc.php index a4147ef..874e2d7 100644 --- a/pprOjsPlugin/services/email/PPRFirstNameEmailService.inc.php +++ b/pprOjsPlugin/services/email/PPRFirstNameEmailService.inc.php @@ -94,7 +94,8 @@ function addFirstNamesToEmailTemplate($hookName, $arguments) { error_log("PPR[PPRFirstNameEmailService] processing emailTemplate={$emailTemplate->emailKey}"); $this->pprObjectFactory->firstNamesManagementService()->addFirstNamesToEmailTemplate($emailTemplate); } else { - error_log("PPR[PPRFirstNameEmailService] notSupported emailTemplate={$emailTemplate->emailKey}"); + $emailKey = $emailTemplate->emailKey ?? 'N/A'; + error_log("PPR[PPRFirstNameEmailService] notSupported emailTemplate={$emailKey}"); } return false;