Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Throw exception when saving afforms with mandatory values missing #31479

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions ext/afform/core/Civi/Api4/Action/Afform/Submit.php
Original file line number Diff line number Diff line change
Expand Up @@ -353,6 +353,9 @@ public static function processGenericEntity(AfformSubmitEvent $event) {
// What to do here? Sometimes we should silently ignore errors, e.g. an optional entity
// intentionally left blank. Other times it's a real error the user should know about.
\Civi::log('afform')->debug('Silently ignoring exception in Afform processGenericEntity call for "' . $event->getEntityName() . '". Message: ' . $e->getMessage());
if ('mandatory_missing' === $e->getErrorCode()) {
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
if ('mandatory_missing' === $e->getErrorCode()) {
if (1 === count($event->records) && 'mandatory_missing' === $e->getErrorCode()) {

This would'nt be a problem if we were still in times when a spouse wasn't optional for a household 😉

Ok, this was obviously too optimistic. I think there should be a configurable option for making entities mandatory in FormBuilder, or at least consider the only entity in a form mandatory by default - what do you think?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Typically that's done by making fields required. For example, if you make the spouse first/last name fields required, then effectively the form requires a spouse. Otherwise, if all fields are optional, then the entity is not required.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hm, but this is reaching limits in case you want to require a spouse but not a specific attribute (let's say either first/last name or e-mail should be required). Marking the entire entity required would leave the validation of mandatory attributes to the API and allow FormBuilder to display the mandatory_missing error message.

Would you agree that a form with a single entity (count($event->records) === 1) would justify mandatory_missing errors to be displayed?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would you agree that a form with a single entity (count($event->records) === 1) would justify mandatory_missing errors to be displayed?

Probably yes, in most cases. But perhaps it would be better to make it explicit on the entity and give the option for an entity to be required.

throw $e;
}
}
}
}
Expand Down