From 1526de0837dff54f9b247cc9aa4b3e6360aa292c Mon Sep 17 00:00:00 2001 From: Stephen Cameron Date: Mon, 27 Apr 2020 18:40:14 +0200 Subject: [PATCH] Purview issue research + form processing. WIP #3445 @8.5 --- wp-content/mu-plugins/cube/src/Forms/Base.php | 112 +++++++++++++++--- .../cube/src/Forms/Consultation.php | 71 ++++++----- .../mu-plugins/cube/src/Forms/Training.php | 26 ++-- .../views/forms/consultation.blade.php | 6 +- 4 files changed, 152 insertions(+), 63 deletions(-) diff --git a/wp-content/mu-plugins/cube/src/Forms/Base.php b/wp-content/mu-plugins/cube/src/Forms/Base.php index 8c1e09d..533b4d8 100644 --- a/wp-content/mu-plugins/cube/src/Forms/Base.php +++ b/wp-content/mu-plugins/cube/src/Forms/Base.php @@ -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 '
'. $field['title'] .'
'; @@ -337,12 +412,15 @@ class Base return ''; } + 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 = "
AVAILABLE FIELDS:\n\n";
-        foreach ($this->getFieldKeys() as $key) {
+        foreach ($this->get_field_keys() as $key) {
             $res .= "{!! \$form->field('$key') !!}\n";
         }
         $res .= '
'; diff --git a/wp-content/mu-plugins/cube/src/Forms/Consultation.php b/wp-content/mu-plugins/cube/src/Forms/Consultation.php index e4e83e9..fac8333 100644 --- a/wp-content/mu-plugins/cube/src/Forms/Consultation.php +++ b/wp-content/mu-plugins/cube/src/Forms/Consultation.php @@ -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')]); + } + } + + } diff --git a/wp-content/mu-plugins/cube/src/Forms/Training.php b/wp-content/mu-plugins/cube/src/Forms/Training.php index 125ecbf..34aa422 100644 --- a/wp-content/mu-plugins/cube/src/Forms/Training.php +++ b/wp-content/mu-plugins/cube/src/Forms/Training.php @@ -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); } } diff --git a/wp-content/themes/CCV/resources/views/forms/consultation.blade.php b/wp-content/themes/CCV/resources/views/forms/consultation.blade.php index f44aee1..ecf6879 100644 --- a/wp-content/themes/CCV/resources/views/forms/consultation.blade.php +++ b/wp-content/themes/CCV/resources/views/forms/consultation.blade.php @@ -46,9 +46,9 @@
- @foreach ($form->getField('pain-arms-legs-detail')['options'] as $option) + @foreach ($form->get_field_options('pain-arms-legs-detail') as $option) @endforeach @@ -275,7 +275,7 @@ // 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 ] -- 2.39.5