100, 'last_name' => 100, 'company' => 190, 'phone' => 40, 'address_1' => 190, 'address_2' => 190, 'city' => 100, 'state' => 100, 'postcode' => 20, ); /** * Cleans input. * * @since 0.1.0 * * @param array $raw Unslashed input. * @param bool $creating True when a new customer is being created. * @return array{data: array, errors: array} */ public static function clean( array $raw, bool $creating ): array { $data = array(); foreach ( self::TEXT_FIELDS as $field => $max ) { if ( $creating || array_key_exists( $field, $raw ) ) { $data[ $field ] = Sanitizer::text( $raw[ $field ] ?? '' ); } } if ( $creating || array_key_exists( 'email', $raw ) ) { $data['email'] = Sanitizer::email( $raw['email'] ?? '' ); } if ( $creating || array_key_exists( 'country', $raw ) ) { $country = strtoupper( Sanitizer::text( $raw['country'] ?? '' ) ); $data['country'] = 1 === preg_match( '/^[A-Z]{2}$/', $country ) ? $country : ''; } $status_error = ''; if ( $creating || array_key_exists( 'status', $raw ) ) { $status = Sanitizer::pick( $raw, 'status', CustomerStatus::editable(), $creating ? CustomerStatus::ACTIVE : null ); if ( null === $status ) { $status_error = __( 'Choose one of the allowed values.', 'hostkhata' ); } else { $data['status'] = $status; } } if ( $creating || array_key_exists( 'tags', $raw ) ) { $data['tags'] = Tags::parse( $raw['tags'] ?? array() ); } if ( $creating || array_key_exists( 'reminders_muted', $raw ) ) { $data['reminders_muted'] = Sanitizer::boolean( $raw['reminders_muted'] ?? false ); } $errors = self::validate( $data, $raw, $creating ); if ( '' !== $status_error ) { $errors['status'] = $status_error; } return array( 'data' => $data, 'errors' => $errors, ); } /** * Validates the cleaned data. * * @param array $data Cleaned data. * @param array $raw Original input. * @param bool $creating Creating or updating. * @return array */ private static function validate( array $data, array $raw, bool $creating ): array { $rules = array(); foreach ( self::TEXT_FIELDS as $field => $max ) { if ( isset( $data[ $field ] ) ) { $rules[ $field ] = 'max_length:' . $max; } } if ( $creating ) { $rules['first_name'] = 'required|' . ( $rules['first_name'] ?? 'max_length:100' ); $rules['email'] = 'required|email|max_length:190'; } elseif ( isset( $data['first_name'] ) ) { $rules['first_name'] = 'required|max_length:100'; } if ( ! $creating && array_key_exists( 'email', $data ) ) { $rules['email'] = 'required|email|max_length:190'; } $errors = ( new Validator() )->validate( $data, $rules )->first_per_field(); // An email that was sent but cleaned away entirely is invalid, not "missing". $email_sent = isset( $raw['email'] ) && is_scalar( $raw['email'] ) && '' !== trim( (string) $raw['email'] ); if ( $email_sent && array_key_exists( 'email', $data ) && '' === $data['email'] ) { $errors['email'] = __( 'Enter a valid email address.', 'hostkhata' ); } if ( isset( $raw['country'] ) && is_scalar( $raw['country'] ) && '' !== trim( (string) $raw['country'] ) && '' === ( $data['country'] ?? '' ) ) { $errors['country'] = __( 'Use a two-letter country code, for example BD.', 'hostkhata' ); } return $errors; } }