fieldStateConditions['fieldName'] = [ * 'readonly' => new SomeCondition(), * 'disabled' => CompositeCondition::and( * new AgeRangeCondition(null, 17), * FieldValueCondition::equals('someField', 'someValue') * ), * ]; * * Condition Types: * - 'readonly': Field is visible but not editable * - 'disabled': Field interaction is disabled * - 'required': Field becomes mandatory * - 'hidden': Field is not displayed */ protected function registerFieldStateConditions(): void { // Booking eligibility condition - hide all service fields when no skipasses available for participant's age $bookingEligibilityCondition = new BookingEligibilityCondition($this->participantEligibilityService); $rentalCondition = new RentalSelectionCondition(); $skiPassCondition = new SkiPassSelectionCondition(); // Hide body dimensions section unless rental services are selected $this->fieldStateConditions['bodyDimensions'] = [ 'hidden' => CompositeCondition::not($rentalCondition), ]; // Hide age-dependent fields when no date of birth is provided $dateOfBirthProvidedCondition = new DateOfBirthProvidedCondition(); // Age-dependent service fields are hidden until birth date is provided OR when participant is ineligible $this->fieldStateConditions['courses'] = [ 'hidden' => CompositeCondition::or( CompositeCondition::not($dateOfBirthProvidedCondition), $bookingEligibilityCondition ), ]; $this->fieldStateConditions['additionalServices'] = [ 'hidden' => CompositeCondition::or( CompositeCondition::not($dateOfBirthProvidedCondition), $bookingEligibilityCondition ), ]; // Skipass field - hidden when participant is ineligible OR when no date of birth $this->fieldStateConditions['skiPass'] = [ 'hidden' => CompositeCondition::or( CompositeCondition::not($dateOfBirthProvidedCondition), $bookingEligibilityCondition ), ]; // Show rentals only when both date of birth is provided AND skipass is selected AND participant is eligible $this->fieldStateConditions['rentals'] = [ 'hidden' => CompositeCondition::or( CompositeCondition::not($dateOfBirthProvidedCondition), CompositeCondition::not($skiPassCondition), $bookingEligibilityCondition ), ]; $this->fieldStateConditions['board'] = [ 'hidden' => CompositeCondition::or( CompositeCondition::not($dateOfBirthProvidedCondition), $bookingEligibilityCondition ), ]; // Bulk insurance booking conditions $bulkInsuranceBookingCondition = new BulkInsuranceBookingCondition(); // Show bulk insurance booking checkbox ONLY for applicant (index 0) and when insurance field is visible $this->fieldStateConditions['bulkInsuranceBooking'] = [ 'hidden' => CompositeCondition::or( CompositeCondition::not($dateOfBirthProvidedCondition), // Hide until date of birth provided CompositeCondition::not(new ApplicantCondition()) // Hide for non-applicants ), ]; // Hide insurance field until date of birth is provided OR when bulk insurance booking is active OR when participant is ineligible $this->fieldStateConditions['insurance'] = [ 'hidden' => CompositeCondition::or( CompositeCondition::not($dateOfBirthProvidedCondition), $bulkInsuranceBookingCondition, $bookingEligibilityCondition ), ]; // Room-specific field conditions $sharedRoomCondition = new RoomSelectionCondition(['mbz']); // Show remarks room field only when room with code 'mbz' is selected $this->fieldStateConditions['remarksRoom'] = [ 'hidden' => CompositeCondition::not($sharedRoomCondition), ]; // Transportation-related field conditions // All transportation fields require date of birth and participant eligibility // Outbound transportation - hidden until date of birth provided AND participant is eligible $this->fieldStateConditions['transportationOutbound'] = [ 'hidden' => CompositeCondition::or( CompositeCondition::not($dateOfBirthProvidedCondition), $bookingEligibilityCondition ), ]; // Inbound transportation - hidden until date of birth provided AND participant is eligible $this->fieldStateConditions['transportationInbound'] = [ 'hidden' => CompositeCondition::or( CompositeCondition::not($dateOfBirthProvidedCondition), $bookingEligibilityCondition ), ]; // Show pickup only when either outbound or inbound transportation is BUS (hidden by default) $this->fieldStateConditions['pickup'] = [ 'hidden' => CompositeCondition::not( CompositeCondition::or( ServiceSubTypeCondition::equals('transportationOutbound', DirectionMapper::SUBTYPE_BUS_API), ServiceSubTypeCondition::equals('transportationInbound', DirectionMapper::SUBTYPE_BUS_API) ) ), ]; // Show parking only when outbound transportation is PKW (hidden by default) // Parking is offered at holiday destination for those arriving by car $this->fieldStateConditions['parking'] = [ 'hidden' => CompositeCondition::not( ServiceSubTypeCondition::equals('transportationOutbound', DirectionMapper::SUBTYPE_CAR_API) ), ]; // Show rental insurance only when rental services are selected (hidden by default) $this->fieldStateConditions['rentalInsurance'] = [ 'hidden' => CompositeCondition::not($rentalCondition), ]; // Show license plate only when parking is selected (hidden by default) $this->fieldStateConditions['licensePlate'] = [ 'hidden' => FieldValueCondition::equals('parking', false), ]; // Make mobile field required for applicant (participant index 0) $this->fieldStateConditions['mobile'] = [ 'required' => new ApplicantCondition(), ]; // Make address field required for applicant (participant index 0) $this->fieldStateConditions['address'] = [ 'required' => new ApplicantCondition(), ]; // Example field state conditions would be registered here // For demonstration purposes, here are some example patterns: // Example 1: Make assignedRoomId readonly for participants under 18 // $this->fieldStateConditions['assignedRoomId'] = [ // 'readonly' => new AgeRangeCondition(null, 17), // ]; // Example 2: Disable service selection if no room is assigned // $this->fieldStateConditions['serviceSelection'] = [ // 'disabled' => FieldValueCondition::isEmpty('assignedRoomId'), // ]; // Example 3: Complex condition with multiple criteria // $this->fieldStateConditions['advancedOptions'] = [ // 'hidden' => CompositeCondition::or( // new AgeRangeCondition(null, 15), // FieldValueCondition::equals('userType', 'basic') // ), // ]; } }