Jake Vanderwerf
2026-09-15 bdf344f19158a980a99dcca7c82c6e34e84533c0
inc/blocks/FormBlock.php
@@ -1,12 +1,10 @@
<?php
namespace JVBase\blocks;
use JVBase\integrations\services\Cloudflare;
use JVBase\managers\Cache;
use JVBase\meta\MetaManager;
use JVBase\managers\CloudflareTurnstile;
use Exception;
use JVBase\utility\Features;
use WP_Block;
use JVBase\meta\Form;
use JVBase\base\Site;
if (!defined('ABSPATH')) {
   exit; // Exit if accessed directly
@@ -36,7 +34,9 @@
   public function __construct()
   {
      $this->cache = Cache::for('forms', WEEK_IN_SECONDS);
      $this->cache = Cache::for('forms', null, WEEK_IN_SECONDS);
      // Initialize forms from filter
      $this->forms = $this->registerForms();
      $this->form_contact = apply_filters('jvb_form_contact', '');
@@ -61,8 +61,8 @@
      }
      // Enqueue Turnstile if needed
      if (Features::forSite()->hasIntegration('cloudflare')) {
         $cloudflare = JVB()->connect('cloudflare');
      if (Site::hasIntegration('cloudflare')) {
         $cloudflare = Cloudflare::getInstance();
         if ($cloudflare->isSetUp()) {
            $cloudflare->enqueueTurnstileScripts();
         }
@@ -91,10 +91,9 @@
      $forms = apply_filters('jvb_register_forms', $default_forms);
      // Process forms to ensure they have proper structure
      $processed_forms = [];
      foreach ($forms as $form_key => $form_config) {
         $processed_forms[$form_key] = $this->processFormConfig($form_config);
      }
      $processed_forms = array_map(function ($form_config) {
         return $this->processFormConfig($form_config);
      }, $forms);
      return $processed_forms;
   }
@@ -130,9 +129,8 @@
         return '<div class="jvb-form-error">No valid form type selected. Please edit this block and select a form type.</div>';
      }
      $cache_key = $this->cache->generateKey($block);
      return $this->cache->remember(
         $cache_key,
         $block,
         function() use ($form_type, $block) {
            return $this->renderForm($form_type, $block);
         }
@@ -181,7 +179,6 @@
      $this->renderTurnstile();
      $this->renderFormEnd($type, $form_id);
      echo '</div>';
      return ob_get_clean();
   }
@@ -279,7 +276,7 @@
         }
      }
      echo '<form id="' . esc_attr($form_id) . '" data-form-id="'.esc_attr($type).'" data-save="form">';
      echo '<form id="' . esc_attr($form_id) . '" data-form-id="'.esc_attr($type).'" data-save="form" data-handled data-step>';
//    wp_nonce_field('jvb_form_' . $type);
   }
@@ -294,17 +291,14 @@
         return;
      }
      // Create MetaManager instance for form rendering
      $meta = new MetaManager();
      // If sections are defined, render in sections
      if (!empty($form_config['sections'])) {
         $this->renderSections($type, $meta);
         $this->renderSections($type);
      } else {
         echo jvbFormStatus();
         // Render fields directly
         foreach ($form_config['fields'] as $field_name => $field_config) {
            $meta->render('form', $field_name, $field_config);
            echo Form::render($field_name, null, $field_config);
         }
         $submit_text = $form_config['submit'] ?? 'Submit';
         echo '<button type="submit" class="button primary">' . esc_html($submit_text) . '</button>';
@@ -314,7 +308,7 @@
   /**
    * Render form sections
    */
   protected function renderSections(string $type, MetaManager $meta): void
   protected function renderSections(string $type): void
   {
      $form_config = $this->forms[$type];
      $sections = $form_config['sections'];
@@ -324,13 +318,13 @@
      echo '<div class="container">';
      if ($total > 1) {
         echo '<div class="form-progress">';
         jvbRenderProgressBar('<span class="step-text">Step <span class="current">1</span> of ' . $total . '</span>');
         jvbRenderProgressBar('<span class="step-text">Step <span class="current">1</span> of ' . $total . '</span>', false, false);
         echo '</div>';
      }
      // Render navigation if multiple sections
      if (count($sections) > 1) {
         echo '<nav class="tabs row start" role="tablist">';
         echo '<nav class="tabs row left" role="tablist">';
         $i = 1;
         foreach ($sections as $slug => $section) {
            $active_class = $i === 1 ? ' active' : '';
@@ -338,7 +332,7 @@
            echo '<button type="button" class="tab' . $active_class . '" data-tab="' . esc_attr($slug) . '" data-step="'.$i.'" role="tab" aria-selected="' . $aria_selected . '">';
            echo '<span class="step-number">' . $i . '</span>';
            echo '<h2>' . esc_html($section['label'] ?? $section) . '</h2>';
            echo '<span>' . esc_html($section['label'] ?? $section) . '</span>';
            echo '</button>';
            $i++;
         }
@@ -369,11 +363,11 @@
         });
         foreach ($section_fields as $field_name => $field_config) {
            $meta->render('form', $field_name, $field_config);
            echo Form::render($field_name, null, $field_config);
         }
         // Add step navigation buttons
         echo '<div class="step-navigation row btw">';
         echo '<div class="step-navigation row x-btw">';
         if ($i > 0) {
            echo '<button type="button" class="button secondary prev-step" data-action="prev-step">';
@@ -408,11 +402,11 @@
    */
   protected function renderTurnstile(): void
   {
      if (!Features::hasIntegration('cloudflare')) {
      if (!Site::hasIntegration('cloudflare')) {
         return;
      }
      $cloudflare = JVB()->connect('cloudflare');
      $cloudflare = Cloudflare::getInstance();
      if ($cloudflare->isSetUp()) {
         $cloudflare->renderTurnstile();
      }