}>|null */ private static ?array $cache = null; /** * Returns every registered type. * * @return array}> Definitions keyed by type. */ public static function all(): array { /* * Cached for the request: supports() is called several times per field * while sanitising and rendering, and each call rebuilt this array and * ran the filter again. */ if ( null !== self::$cache ) { return self::$cache; } $types = array( self::TEXT => array( 'label' => __( 'Text', 'devplugins-custom-form-builder' ), 'supports' => array( self::SUPPORTS_PLACEHOLDER, self::SUPPORTS_DEFAULT, self::SUPPORTS_DESCRIPTION, self::SUPPORTS_REQUIRED, self::SUPPORTS_LENGTH ), ), self::EMAIL => array( 'label' => __( 'Email', 'devplugins-custom-form-builder' ), 'supports' => array( self::SUPPORTS_PLACEHOLDER, self::SUPPORTS_DEFAULT, self::SUPPORTS_DESCRIPTION, self::SUPPORTS_REQUIRED, self::SUPPORTS_LENGTH ), ), self::PHONE => array( 'label' => __( 'Phone', 'devplugins-custom-form-builder' ), 'supports' => array( self::SUPPORTS_PLACEHOLDER, self::SUPPORTS_DEFAULT, self::SUPPORTS_DESCRIPTION, self::SUPPORTS_REQUIRED, self::SUPPORTS_LENGTH ), ), self::URL => array( 'label' => __( 'URL', 'devplugins-custom-form-builder' ), 'supports' => array( self::SUPPORTS_PLACEHOLDER, self::SUPPORTS_DEFAULT, self::SUPPORTS_DESCRIPTION, self::SUPPORTS_REQUIRED, self::SUPPORTS_LENGTH ), ), self::TEXTAREA => array( 'label' => __( 'Textarea', 'devplugins-custom-form-builder' ), 'supports' => array( self::SUPPORTS_PLACEHOLDER, self::SUPPORTS_DEFAULT, self::SUPPORTS_DESCRIPTION, self::SUPPORTS_REQUIRED, self::SUPPORTS_LENGTH, self::SUPPORTS_ROWS ), ), self::CHECKBOX => array( 'label' => __( 'Checkbox', 'devplugins-custom-form-builder' ), 'supports' => array( self::SUPPORTS_OPTIONS, self::SUPPORTS_DESCRIPTION, self::SUPPORTS_REQUIRED, self::SUPPORTS_CHOICE_LIMITS ), ), self::RADIO => array( 'label' => __( 'Radio', 'devplugins-custom-form-builder' ), 'supports' => array( self::SUPPORTS_OPTIONS, self::SUPPORTS_DESCRIPTION, self::SUPPORTS_REQUIRED ), ), self::SELECT => array( 'label' => __( 'Select', 'devplugins-custom-form-builder' ), 'supports' => array( self::SUPPORTS_OPTIONS, self::SUPPORTS_DESCRIPTION, self::SUPPORTS_REQUIRED, self::SUPPORTS_MULTIPLE, self::SUPPORTS_CHOICE_LIMITS ), ), self::DATE => array( 'label' => __( 'Date', 'devplugins-custom-form-builder' ), 'supports' => array( self::SUPPORTS_DEFAULT, self::SUPPORTS_DESCRIPTION, self::SUPPORTS_REQUIRED, self::SUPPORTS_DATE_RANGE ), ), self::NUMBER => array( 'label' => __( 'Number', 'devplugins-custom-form-builder' ), 'supports' => array( self::SUPPORTS_PLACEHOLDER, self::SUPPORTS_DEFAULT, self::SUPPORTS_DESCRIPTION, self::SUPPORTS_REQUIRED, self::SUPPORTS_RANGE ), ), self::HIDDEN => array( 'label' => __( 'Hidden', 'devplugins-custom-form-builder' ), 'supports' => array( self::SUPPORTS_DEFAULT ), ), self::STEP => array( 'label' => __( 'Page Break', 'devplugins-custom-form-builder' ), 'supports' => array( self::SUPPORTS_DESCRIPTION ), ), self::FILE => array( 'label' => __( 'File Upload', 'devplugins-custom-form-builder' ), 'supports' => array( self::SUPPORTS_DESCRIPTION, self::SUPPORTS_REQUIRED, self::SUPPORTS_UPLOAD ), ), ); /** * Filters the registered field types. * * @since 1.0.0 * * @param array}> $types Definitions keyed by type. */ self::$cache = (array) apply_filters( 'formpilot_field_types', $types ); return self::$cache; } /** * Forgets the cached definitions. * * Call this after registering a type late, so the new entry is picked up. */ public static function flush(): void { self::$cache = null; } /** * Returns the type labels. * * @return array Translated labels keyed by type. */ public static function labels(): array { return array_map( static fn( array $type ): string => (string) ( $type['label'] ?? '' ), self::all() ); } /** * Returns the label of a type. * * @param string $type Field type. * * @return string The translated label, or the raw type when unknown. */ public static function label( string $type ): string { return self::labels()[ $type ] ?? $type; } /** * Determines whether a type is registered. * * @param string $type Field type. * * @return bool True when the type exists. */ public static function exists( string $type ): bool { return array_key_exists( $type, self::all() ); } /** * Determines whether a type supports a setting. * * @param string $type Field type. * @param string $feature One of the SUPPORTS_* constants. * * @return bool True when the setting applies. */ public static function supports( string $type, string $feature ): bool { $types = self::all(); if ( ! isset( $types[ $type ]['supports'] ) ) { return false; } return in_array( $feature, (array) $types[ $type ]['supports'], true ); } /** * Returns the fallback type used when a request carries an unknown one. */ public static function fallback(): string { return self::TEXT; } }