@@ -800,7 +800,7 @@ private function sendConfirmationEmail(Form $form, Submission $submission): void
800800 $ answerMap [$ questionId ][] = $ answer ->getText ();
801801 }
802802
803- $ recipientQuestion = $ this ->getConfirmationEmailRecipientQuestion ($ questions );
803+ $ recipientQuestion = $ this ->getConfirmationEmailRecipientQuestion ($ form , $ questions );
804804 if ($ recipientQuestion === null ) {
805805 $ this ->logger ->debug ('No confirmation email recipient question is available ' , [
806806 'formId ' => $ form ->getId (),
@@ -893,49 +893,39 @@ private function sendConfirmationEmail(Form $form, Submission $submission): void
893893 * @param list<FormsQuestion> $questions
894894 * @return FormsQuestion|null
895895 */
896- private function getConfirmationEmailRecipientQuestion (array $ questions ): ?array {
897- $ emailQuestions = array_values (array_filter (
898- $ questions ,
899- fn (array $ question ): bool => $ this ->isConfirmationEmailQuestion ($ question ),
900- ));
901-
902- if ($ emailQuestions === []) {
896+ private function getConfirmationEmailRecipientQuestion (Form $ form , array $ questions ): ?array {
897+ $ recipientQuestionId = $ form ->getConfirmationEmailRecipient ();
898+ if ($ recipientQuestionId === null ) {
903899 return null ;
904900 }
905901
906- $ explicitRecipients = array_values (array_filter (
907- $ emailQuestions ,
908- function (array $ question ): bool {
909- $ extraSettings = (array )($ question ['extraSettings ' ] ?? []);
910- return !empty ($ extraSettings ['confirmationEmailRecipient ' ]);
911- },
912- ));
902+ foreach ($ questions as $ questionData ) {
903+ if (($ questionData ['id ' ] ?? null ) !== $ recipientQuestionId ) {
904+ continue ;
905+ }
913906
914- if (count ( $ explicitRecipients ) === 1 ) {
915- return $ explicitRecipients [ 0 ] ;
916- }
907+ if ($ this -> isConfirmationEmailQuestion ( $ questionData ) ) {
908+ return $ questionData ;
909+ }
917910
918- if (count ($ explicitRecipients ) > 1 ) {
911+ $ this ->logger ->debug ('Configured confirmation email recipient question is invalid ' , [
912+ 'formId ' => $ form ->getId (),
913+ 'recipientQuestionId ' => $ recipientQuestionId ,
914+ ]);
919915 return null ;
920916 }
921917
922- if (count ($ emailQuestions ) === 1 ) {
923- return $ emailQuestions [0 ];
924- }
925-
926918 return null ;
927919 }
928920
929921 /**
930922 * @param FormsQuestion $question
931923 */
932924 private function isConfirmationEmailQuestion (array $ question ): bool {
933- if (($ question ['type ' ] ?? null ) !== Constants::ANSWER_TYPE_SHORT ) {
934- return false ;
935- }
936-
937- $ extraSettings = (array )($ question ['extraSettings ' ] ?? []);
938- return ($ extraSettings ['validationType ' ] ?? null ) === 'email ' ;
925+ return Question::isEmailTypeStatic (
926+ $ question ['type ' ] ?? '' ,
927+ (array )($ question ['extraSettings ' ] ?? [])
928+ );
939929 }
940930
941931 /**
@@ -1072,11 +1062,6 @@ public function areExtraSettingsValid(array $extraSettings, string $questionType
10721062
10731063 // Special handling of short input for validation
10741064 } elseif ($ questionType === Constants::ANSWER_TYPE_SHORT ) {
1075- if (!empty ($ extraSettings ['confirmationEmailRecipient ' ])
1076- && ($ extraSettings ['validationType ' ] ?? null ) !== 'email ' ) {
1077- return false ;
1078- }
1079-
10801065 if (!isset ($ extraSettings ['validationType ' ])) {
10811066 return true ;
10821067 }
@@ -1221,4 +1206,29 @@ public function getTemporaryUploadedFilePath(Form $form, Question $question): st
12211206 private static function normalizeFileName (string $ fileName ): string {
12221207 return trim (str_replace (Constants::FILENAME_INVALID_CHARS , '- ' , $ fileName ));
12231208 }
1209+
1210+ /**
1211+ * @throws \InvalidArgumentException
1212+ */
1213+ public function validateConfirmationEmailRecipient (Form $ form , mixed $ recipientId ): void {
1214+ if ($ recipientId === null ) {
1215+ return ;
1216+ }
1217+
1218+ if (!is_int ($ recipientId )) {
1219+ throw new \InvalidArgumentException ('Invalid confirmationEmailRecipient ' );
1220+ }
1221+
1222+ try {
1223+ $ question = $ this ->questionMapper ->findById ($ recipientId );
1224+ } catch (IMapperException $ e ) {
1225+ throw new \InvalidArgumentException ('Invalid confirmationEmailRecipient ' );
1226+ }
1227+
1228+ if ($ question ->getFormId () !== $ form ->getId ()
1229+ || $ question ->getOrder () === 0
1230+ || !$ question ->isEmailType ()) {
1231+ throw new \InvalidArgumentException ('Invalid confirmationEmailRecipient ' );
1232+ }
1233+ }
12241234}
0 commit comments