t_form_summary( $form ); } return [ 'forms' => $result, 'total' => $total, ]; } /** * Ability callback: Get single form. * * @since 1.9.9 * * @param mixed $input Input data. * * @return array|WP_Error */ public function ability_get_form( $input = null ) { $args = $this->normalize_input( $input ); $form_id = absint( $args['form_id'] ?? 0 ); if ( empty( $form_id ) ) { return new WP_Error( 'wpforms_invalid_form_id', __( 'Invalid form ID.', 'wpforms-lite' ), [ 'status' => 400 ] ); } $form_handler = $this->get_form_handler(); if ( is_wp_error( $form_handler ) ) { return $form_handler; } $form = $form_handler->get( $form_id ); if ( empty( $form ) ) { return new WP_Error( 'wpforms_form_not_found', __( 'Form not found.', 'wpforms-lite' ), [ 'status' => 404 ] ); } $include_fields = wp_validate_boolean( $args['include_fields'] ?? true ); return $this->format_form_detail( $form, $include_fields ); } /** * Normalize input data to array format. * * @since 1.9.9 * * @param mixed $input Input data (can be the array, object, or null). * * @return array */ protected function normalize_input( $input ): array { if ( is_array( $input ) ) { return $input; } if ( is_object( $input ) ) { return (array) $input; } return []; } /** * Get the form handler and validate it. * * @since 1.9.9 * * @return object|WP_Error Form handler object or WP_Error on failure. */ protected function get_form_handler() { $form_handler = wpforms()->obj( 'form' ); if ( ! $form_handler ) { return new WP_Error( 'wpforms_form_handler_error', __( 'Form handler not available.', 'wpforms-lite' ), [ 'status' => 500 ] ); } return $form_handler; } /** * Format form data for summary listing. * * @since 1.9.9 * * @param WP_Post $form Form the `post` object. * * @return array */ protected function format_form_summary( WP_Post $form ): array { return [ 'id' => $form->ID, 'title' => $form->post_title, 'status' => $form->post_status, 'created' => $form->post_date, 'modified' => $form->post_modified, 'author' => absint( $form->post_author ), ]; } /** * Format form data for the detailed view. * * @since 1.9.9 * * @param WP_Post $form Form `post` object. * @param bool $include_fields Whether to include fields. * * @return array */ protected function format_form_detail( WP_Post $form, bool $include_fields = true ): array { $form_handler = $this->get_form_handler(); $form_data = ! is_wp_error( $form_handler ) ? $form_handler->get( $form->ID, [ 'content_only' => true ] ) : []; // Ensure form_data is an array. if ( ! is_array( $form_data ) ) { $form_data = []; } $result = [ 'id' => $form->ID, 'title' => $form->post_title, 'status' => $form->post_status, 'created' => $form->post_date, 'modified' => $form->post_modified, 'author' => absint( $form->post_author ), 'settings' => $this->get_safe_settings( $form_data ), ]; if ( $include_fields && ! empty( $form_data['fields'] ) ) { $result['fields'] = $this->format_fields( $form_data['fields'] ); } return $result; } /** * Get safe settings (without sensitive data). * * @since 1.9.9 * * @param array $form_data Form data. * * @return array */ protected function get_safe_settings( array $form_data ): array { $settings = $form_data['settings'] ?? []; // Return only safe, non-sensitive settings. return [ 'form_title' => $settings['form_title'] ?? '', 'form_desc' => $settings['form_desc'] ?? '', 'submit_text' => $settings['submit_text'] ?? __( 'Submit', 'wpforms-lite' ), 'ajax_submit' => ! empty( $settings['ajax_submit'] ), 'honeypot' => ! empty( $settings['honeypot'] ), 'antispam' => ! empty( $settings['antispam'] ), ]; } /** * Format fields for output. * * @since 1.9.9 * * @param array $fields Form fields. * * @return array */ protected function format_fields( array $fields ): array { $result = []; foreach ( $fields as $field_id => $field ) { $result[] = [ 'id' => absint( $field_id ), 'type' => sanitize_text_field( $field['type'] ?? '' ), 'label' => sanitize_text_field( $field['label'] ?? '' ), 'description' => sanitize_text_field( $field['description'] ?? '' ), 'required' => ! empty( $field['required'] ), 'size' => sanitize_text_field( $field['size'] ?? 'medium' ), ]; } return $result; } }