]> _ Git - ccv-wordpress.git/commitdiff
Purview issue research + form processing. WIP #3445 @8.5
authorStephen Cameron <stephen@cubedesigners.com>
Mon, 27 Apr 2020 16:40:14 +0000 (18:40 +0200)
committerStephen Cameron <stephen@cubedesigners.com>
Mon, 27 Apr 2020 16:40:14 +0000 (18:40 +0200)
wp-content/mu-plugins/cube/src/Forms/Base.php
wp-content/mu-plugins/cube/src/Forms/Consultation.php
wp-content/mu-plugins/cube/src/Forms/Training.php
wp-content/themes/CCV/resources/views/forms/consultation.blade.php

index 8c1e09dec97936611faade680ecea0315aa2e8d8..533b4d8f419efb21f78873a5523f8b63d7fd116f 100644 (file)
@@ -6,8 +6,16 @@ use function Roots\asset;
 
 class Base
 {
-    private $fields = [];
     private $action_name = 'cube_forms_process'; // Name of the AJAX action
+    private $destination = 'avis-medical@ccv-montpellier.fr'; // Default, can be overridden
+
+    private $forms = [ // All available forms
+        'consultation' => Consultation::class,
+        'training' => Training::class,
+    ];
+
+    private $fields = [];
+    private $data;
 
     // Field types
     const BINARY = 'binary';
@@ -28,8 +36,8 @@ class Base
 
     public function hook() {
         // Catch AJAX requests (handles both logged in and logged out users)
-        add_action('wp_ajax_nopriv_'. $this->action_name, [$this, 'process']);
-        add_action('wp_ajax_'. $this->action_name, [$this, 'process']);
+        add_action('wp_ajax_nopriv_'. $this->action_name, [$this, 'handle_ajax_request']);
+        add_action('wp_ajax_'. $this->action_name, [$this, 'handle_ajax_request']);
     }
 
     public function init() {
@@ -81,12 +89,79 @@ class Base
 
     public function register_fields() {}
 
+    public function get_forms() {
+        return $this->forms;
+    }
+
+    public function get_form_data() {
+        $data = $_POST;
+
+        // Include successful file uploads in data
+        if (!empty($_FILES)) {
+            foreach ($_FILES as $field_name => $file) {
+                if ($file['error'] === UPLOAD_ERR_OK) {
+                    $data[$field_name] = $file;
+                }
+            }
+        }
+
+        return $data;
+    }
+
+    public function handle_ajax_request() {
+
+        // Here we handle the form ajax requests, ensuring they're valid and loading the appropriate sub-class
+
+        // First, check that request is valid via nonce value
+        if (check_ajax_referer($this->action_name, 'nonce', false) === false) {
+            wp_send_json_error(new \WP_Error('nonce', 'Failed security validation'));
+        }
+
+        // Next, check which form is being sent and if it is valid
+        $form_name = $_POST['_form_name'] ?? null;
+
+        if (!($form_name && array_key_exists($form_name, $this->forms))) {
+            wp_send_json_error(new \WP_Error('invalid_form', "Unknown form ($form_name)"));
+        }
+
+        // Load the form and process it...
+        /* @var $form Base */
+        $form = new $this->forms[$form_name];
+        $form->register_fields();
+        $form->data = $this->get_form_data();
+        $form->process();
+        exit;
+    }
+
+    public function pre_process() {}
 
     public function process() {
-        print_r($_POST);
-        die("PROCESSING FORM");
+
+        $this->pre_process();
+
+        echo "SENDING FORM TO: {$this->destination}\n\n";
+
+        foreach ($this->fields as $field_name => $field) {
+            if ($value = $this->data($field_name)) {
+                if (is_array($value)) $value = "\n- " . implode("\n- ", $value);
+                echo "{$field['title']} {$value}\n";
+            }
+        }
+
+        // ...
+
+        $this->post_process();
     }
 
+    public function post_process() {}
+
+    public function data($name, $default = null) {
+        if (isset($this->data[$name])) {
+            return $this->data[$name];
+        }
+
+        return $default;
+    }
 
 
     /**
@@ -97,7 +172,7 @@ class Base
      */
     public function field($name, $settings = []) {
 
-        $field = $this->getField($name);
+        $field = $this->get_field($name);
         if (!$field) return false;
 
         $default_settings = [
@@ -147,7 +222,7 @@ class Base
 
         $title_class = $settings['title_class'] ?? '';
 
-        $field = $this->getField($name);
+        $field = $this->get_field($name);
         if (!$field) return false;
 
         return '<div class="form-field-title '. $title_class .'">'. $field['title'] .'</div>';
@@ -337,12 +412,15 @@ class Base
         return '<button type="'. $settings['type'] .'" class="'. $settings['class'] .'">'. $text .'</button>';
     }
 
+    function set_destination($address) {
+        $this->destination = $address;
+    }
 
     /**
      * Set multiple fields at once
      * @param array $fields
      */
-    public function setFields($fields) {
+    public function set_fields($fields) {
         $this->fields = $fields;
     }
 
@@ -350,7 +428,7 @@ class Base
      * Get all fields
      * @return array
      */
-    public function getFields() {
+    public function get_fields() {
         return $this->fields;
     }
 
@@ -358,7 +436,7 @@ class Base
      * Get the field names
      * @return array
      */
-    public function getFieldKeys() {
+    public function get_field_keys() {
         return array_keys($this->fields);
     }
 
@@ -369,12 +447,12 @@ class Base
      * @param $type
      * @param array $options
      */
-    public function addField($name, $title, $type, $options = []) {
+    public function add_field($name, $title, $type, $options = []) {
         $this->fields[$name]['title'] = $title;
         $this->fields[$name]['type'] = $type;
 
         if (!empty($options)) {
-            $this->setFieldOptions($name, $options);
+            $this->set_field_options($name, $options);
         }
     }
 
@@ -392,7 +470,7 @@ class Base
      * @param $name
      * @return mixed|null
      */
-    public function getField($name) {
+    public function get_field($name) {
         return $this->fields[$name] ?? null;
     }
 
@@ -401,7 +479,7 @@ class Base
      * @param string $name
      * @param array $options
      */
-    public function setFieldOptions($name, $options) {
+    public function set_field_options($name, $options) {
         if ($this->exists($name)) {
             $this->fields[$name]['options'] = $options;
         }
@@ -412,7 +490,7 @@ class Base
      * @param string $name
      * @return array
      */
-    public function getFieldOptions($name) {
+    public function get_field_options($name) {
         if ($this->exists($name) && isset($this->fields[$name]['options'])) {
             return $this->fields[$name]['options'];
         }
@@ -424,9 +502,9 @@ class Base
      * Helper function to print template code for all fields
      * @return string
      */
-    public function generateCode() {
+    public function generate_code() {
         $res  = "<pre>AVAILABLE FIELDS:\n\n";
-        foreach ($this->getFieldKeys() as $key) {
+        foreach ($this->get_field_keys() as $key) {
             $res .= "{!! \$form->field('$key') !!}\n";
         }
         $res .= '</pre>';
index e4e83e93dafa545cbaa31fed2024b8b9f899b5e9..fac8333310b0a50d3c3c6243e52ca882e8272a20 100644 (file)
@@ -21,7 +21,7 @@ class Consultation extends Base
         parent::register_fields();
 
         //== SYMPTOMS
-        $this->addField('main-problem', __('Problème principal', 'ccv'), self::RADIO,
+        $this->add_field('main-problem', __('Problème principal', 'ccv'), self::RADIO,
             [
                 __('Cervicales', 'ccv'),
                 __('Lombaires', 'ccv'),
@@ -29,13 +29,13 @@ class Consultation extends Base
             ]
         );
 
-        $this->addField('date-first-symptoms', __('Date des premiers symptômes :', 'ccv'), self::DATE);
+        $this->add_field('date-first-symptoms', __('Date des premiers symptômes :', 'ccv'), self::DATE);
 
-        $this->addField('date-pain-since', __('Douleurs permanentes depuis (le cas échéant) :', 'ccv'), self::DATE);
+        $this->add_field('date-pain-since', __('Douleurs permanentes depuis (le cas échéant) :', 'ccv'), self::DATE);
 
-        $this->addField('pain-arms-legs', __('Avez-vous des douleurs dans les bras ou les jambes (sciatiques, cruralgies, névralgies) ?', 'ccv'), self::BINARY);
+        $this->add_field('pain-arms-legs', __('Avez-vous des douleurs dans les bras ou les jambes (sciatiques, cruralgies, névralgies) ?', 'ccv'), self::BINARY);
 
-        $this->addField('pain-arms-legs-detail', __('Si oui, cochez les membres concernés :', 'ccv'), self::CHECKBOX,
+        $this->add_field('pain-arms-legs-detail', __('Si oui, cochez les membres concernés :', 'ccv'), self::CHECKBOX,
             [
                 __('Haut du bras gauche', 'ccv'),
                 __('Haut du bras droit', 'ccv'),
@@ -48,7 +48,7 @@ class Consultation extends Base
             ]
         );
 
-        $this->addField('main-pain', __('La douleur principale est-elle ?', 'ccv'), self::RADIO,
+        $this->add_field('main-pain', __('La douleur principale est-elle ?', 'ccv'), self::RADIO,
             [
                 __('Dans la colonne', 'ccv'),
                 __('Dans les membres', 'ccv'),
@@ -56,43 +56,43 @@ class Consultation extends Base
             ]
         );
 
-        $this->addField('tingling-numbness', __('Avez-vous des fourmillements ou une sensation d’engourdissement dans un des membres ? ', 'ccv'), self::BINARY);
+        $this->add_field('tingling-numbness', __('Avez-vous des fourmillements ou une sensation d’engourdissement dans un des membres ? ', 'ccv'), self::BINARY);
 
-        $this->addField('tingling-numbness-date', __('Si oui depuis quand ?', 'ccv'), self::DATE);
+        $this->add_field('tingling-numbness-date', __('Si oui depuis quand ?', 'ccv'), self::DATE);
 
-        $this->addField('strength-loss', __('Avez-vous une perte de force importante dans un des membres ?', 'ccv'), self::BINARY);
+        $this->add_field('strength-loss', __('Avez-vous une perte de force importante dans un des membres ?', 'ccv'), self::BINARY);
 
-        $this->addField('strength-loss-date', __('Si oui depuis quand ?', 'ccv'), self::DATE);
+        $this->add_field('strength-loss-date', __('Si oui depuis quand ?', 'ccv'), self::DATE);
 
         //=== TREATMENTS
-        $this->addField('medication', __('Indiquez ici les médicaments que vous avez pris pour vos douleurs (le cas échéant)', 'ccv'), self::TEXTAREA);
+        $this->add_field('medication', __('Indiquez ici les médicaments que vous avez pris pour vos douleurs (le cas échéant)', 'ccv'), self::TEXTAREA);
 
-        $this->addField('kine-osteo', __('Kinésithérapie ou ostéopathie', 'ccv'), self::BINARY);
-        $this->addField('corset', __('Corset ou ceinture lombaire', 'ccv'), self::BINARY);
-        $this->addField('hospitalisation', __('Séjour en hospitalisation', 'ccv'), self::BINARY);
-        $this->addField('infiltration', __('Infiltration ou thermocoagulation', 'ccv'), self::BINARY);
+        $this->add_field('kine-osteo', __('Kinésithérapie ou ostéopathie', 'ccv'), self::BINARY);
+        $this->add_field('corset', __('Corset ou ceinture lombaire', 'ccv'), self::BINARY);
+        $this->add_field('hospitalisation', __('Séjour en hospitalisation', 'ccv'), self::BINARY);
+        $this->add_field('infiltration', __('Infiltration ou thermocoagulation', 'ccv'), self::BINARY);
 
-        $this->addField('surgeries', __('Indiquez ici vos précédentes chirurgies de la colonne et leurs dates (le cas échéant)', 'ccv'), self::TEXTAREA);
+        $this->add_field('surgeries', __('Indiquez ici vos précédentes chirurgies de la colonne et leurs dates (le cas échéant)', 'ccv'), self::TEXTAREA);
 
         //=== IMAGERY
-        $this->addField('imagery-type', __('Imagerie', 'ccv'), null); // This is a special case and will be output manually so only using this for the e-mail label
-        $this->addField('imagery-online', __('Images en ligne', 'ccv'), self::TEXTAREA); // Again, a manually handled field
-        $this->addField('imagery-posted', __('Images envoyé par courrier', 'ccv'), self::CHECKBOX);
+        $this->add_field('imagery-type', __('Imagerie', 'ccv'), null); // This is a special case and will be output manually so only using this for the e-mail label
+        $this->add_field('imagery-online', __('Images en ligne', 'ccv'), self::TEXTAREA); // Again, a manually handled field
+        $this->add_field('imagery-posted', __('Images envoyé par courrier', 'ccv'), self::CHECKBOX);
 
         //=== PERSONAL INFORMATION
-        $this->addField('last-name', _x('Nom', 'Nom de famille', 'ccv'), self::TEXT);
-        $this->addField('first-name', __('Prénom', 'ccv'), self::TEXT);
-        $this->addField('profession', __('Profession', 'ccv'), self::TEXT);
-        $this->addField('city', __('Ville', 'ccv'), self::TEXT);
-        $this->addField('country', __('Pays', 'ccv'), self::TEXT);
-        $this->addField('phone', __('Tel', 'ccv'), self::TEXT);
-        $this->addField('email', __('Email', 'ccv'), self::EMAIL);
-        $this->addField('sex', __('Sexe', 'ccv'), self::RADIO, [_x('M', 'Sexe (M)', 'ccv'), _x('F', 'Sexe (F)', 'ccv')]);
-        $this->addField('age', __('Âge :', 'ccv'), self::TEXT);
-        $this->addField('message', __('Avez vous un message (ou une demande) spécifique à nous formuler ?', 'ccv'), self::TEXTAREA);
+        $this->add_field('last-name', _x('Nom', 'Nom de famille', 'ccv'), self::TEXT);
+        $this->add_field('first-name', __('Prénom', 'ccv'), self::TEXT);
+        $this->add_field('profession', __('Profession', 'ccv'), self::TEXT);
+        $this->add_field('city', __('Ville', 'ccv'), self::TEXT);
+        $this->add_field('country', __('Pays', 'ccv'), self::TEXT);
+        $this->add_field('phone', __('Tel', 'ccv'), self::TEXT);
+        $this->add_field('email', __('Email', 'ccv'), self::EMAIL);
+        $this->add_field('sex', __('Sexe', 'ccv'), self::RADIO, [_x('M', 'Sexe (M)', 'ccv'), _x('F', 'Sexe (F)', 'ccv')]);
+        $this->add_field('age', __('Âge :', 'ccv'), self::TEXT);
+        $this->add_field('message', __('Avez vous un message (ou une demande) spécifique à nous formuler ?', 'ccv'), self::TEXTAREA);
 
         // Special field: if a surgeon is selected, their e-mail address will be override the default delivery address
-        $this->addField('surgeon', __('Chirurgien spécifique'), self::SELECT,
+        $this->add_field('surgeon', __('Chirurgien spécifique'), self::SELECT,
             [
                 // TODO: Add proper e-mail addresses here once we have them
                 'Dr Guilhaume GENESTE' => 'xxxxx@ccv-montpellier.fr',
@@ -101,4 +101,15 @@ class Consultation extends Base
                 'Dr Caroline HIRSH' => 'xxxxx@ccv-montpellier.fr',
             ]);
     }
+
+    public function pre_process() {
+
+        // If a surgeon is selected, send the form directly to them
+        $surgeons = $this->get_field_options('surgeon');
+        if (!empty($this->data('surgeon')) && array_key_exists($this->data('surgeon'), $surgeons)) {
+            $this->set_destination($surgeons[$this->data('surgeon')]);
+        }
+    }
+
+
 }
index 125ecbff999189bc15296c22a3d1f2da9f0876fc..34aa422158516d3e34fa6dfda977bd2bcc2a03eb 100644 (file)
@@ -14,15 +14,15 @@ class Training extends Base
         parent::register_fields();
 
         //== IDENTITY
-        $this->addField('last-name', _x('Nom', 'Nom de famille', 'ccv'), self::TEXT);
-        $this->addField('first-name', __('Prénom', 'ccv'), self::TEXT);
-        $this->addField('birth-date', __('Date de naissance', 'ccv'), self::DATE);
-        $this->addField('phone', __('Tel', 'ccv'), self::TEXT);
-        $this->addField('email', __('Mail', 'ccv'), self::EMAIL);
-        $this->addField('country-residence', __('Pays de résidence', 'ccv'), self::TEXT);
-        $this->addField('country-training', __('Pays de formation chirurgicale', 'ccv'), self::TEXT);
-
-        $this->addField('speciality', __('Spécialité chirurgicale', 'ccv'), self::RADIO,
+        $this->add_field('last-name', _x('Nom', 'Nom de famille', 'ccv'), self::TEXT);
+        $this->add_field('first-name', __('Prénom', 'ccv'), self::TEXT);
+        $this->add_field('birth-date', __('Date de naissance', 'ccv'), self::DATE);
+        $this->add_field('phone', __('Tel', 'ccv'), self::TEXT);
+        $this->add_field('email', __('Mail', 'ccv'), self::EMAIL);
+        $this->add_field('country-residence', __('Pays de résidence', 'ccv'), self::TEXT);
+        $this->add_field('country-training', __('Pays de formation chirurgicale', 'ccv'), self::TEXT);
+
+        $this->add_field('speciality', __('Spécialité chirurgicale', 'ccv'), self::RADIO,
             [
                 __('Neurochirurgien', 'ccv'),
                 __('Chirurgien orthopédiste avec chirurgie du rachis exclusif', 'ccv'),
@@ -30,7 +30,7 @@ class Training extends Base
             ]
         );
 
-        $this->addField('status', __('Statut', 'ccv'), self::RADIO,
+        $this->add_field('status', __('Statut', 'ccv'), self::RADIO,
             [
                 __('Etudiant (interne, fellow)', 'ccv'),
                 __('Chirurgien en activité', 'ccv'),
@@ -38,7 +38,7 @@ class Training extends Base
         );
 
         //== AREA OF INTERVENTION
-        $this->addField('experience-lumbar-anterior', __("Quel niveau d'expertise avez-vous dans ce domaine ?", 'ccv'), self::RADIO,
+        $this->add_field('experience-lumbar-anterior', __("Quel niveau d'expertise avez-vous dans ce domaine ?", 'ccv'), self::RADIO,
             [
                 __("Pas d'expérience", 'ccv'),
                 __('Moins de 20 chirurgies', 'ccv'),
@@ -47,7 +47,7 @@ class Training extends Base
             ]
         );
 
-        $this->addField('experience-scoliosis', __("Quel niveau d’expertise avez-vous dans la chirurgie de la scoliose ?", 'ccv'), self::RADIO,
+        $this->add_field('experience-scoliosis', __("Quel niveau d’expertise avez-vous dans la chirurgie de la scoliose ?", 'ccv'), self::RADIO,
             [
                 __("Pas d'expérience", 'ccv'),
                 __('Moins de 20 chirurgies', 'ccv'),
@@ -58,6 +58,6 @@ class Training extends Base
 
         //== TYPE OF TRAINING
         // Since this question has a complex layout, the options are set in the template (formation.blade.php)
-        $this->addField('training-type', __('Par quel type de formation au CCV Montpellier êtes-vous intéressé ?', 'ccv'), self::RADIO, null);
+        $this->add_field('training-type', __('Par quel type de formation au CCV Montpellier êtes-vous intéressé ?', 'ccv'), self::RADIO, null);
     }
 }
index f44aee1ce1f424e7a779a2a6a429892e9bd46817..ecf68795b56568f85f4267446023916a53772eb8 100644 (file)
@@ -46,9 +46,9 @@
             <div class="pain-areas">
               <img src="@asset('images/consultation-body-outline.svg')" class="consultation-body-outline-image">
 
-              @foreach ($form->getField('pain-arms-legs-detail')['options'] as $option)
+              @foreach ($form->get_field_options('pain-arms-legs-detail') as $option)
                 <label title="{{ $option }}">
-                  <input type="checkbox" name="pain-arms-legs-detail" value="{{ $option }}">
+                  <input type="checkbox" name="pain-arms-legs-detail[]" value="{{ $option }}">
                   <span class="form-label">{{-- No label here but the element is needed so custom checkboxes work --}}</span>
                 </label>
               @endforeach
           // The options for this field contains the e-mail address as the value but we don't want to expose that here
           // so we override options with a new array made up of just their names as both the key and value.
           // Once the form is processed, this will be used to look up the e-mail address.
-          'options' => array_combine(array_keys($form->getFieldOptions('surgeon')), array_keys($form->getFieldOptions('surgeon'))),
+          'options' => array_combine(array_keys($form->get_field_options('surgeon')), array_keys($form->get_field_options('surgeon'))),
           'placeholder' => [
             '' => __('Sélectionner') // First select option
           ]