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';
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() {
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;
+ }
/**
*/
public function field($name, $settings = []) {
- $field = $this->getField($name);
+ $field = $this->get_field($name);
if (!$field) return false;
$default_settings = [
$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>';
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;
}
* Get all fields
* @return array
*/
- public function getFields() {
+ public function get_fields() {
return $this->fields;
}
* Get the field names
* @return array
*/
- public function getFieldKeys() {
+ public function get_field_keys() {
return array_keys($this->fields);
}
* @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);
}
}
* @param $name
* @return mixed|null
*/
- public function getField($name) {
+ public function get_field($name) {
return $this->fields[$name] ?? null;
}
* @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;
}
* @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'];
}
* 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>';
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'),
]
);
- $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'),
]
);
- $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'),
]
);
- $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',
'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')]);
+ }
+ }
+
+
}
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'),
]
);
- $this->addField('status', __('Statut', 'ccv'), self::RADIO,
+ $this->add_field('status', __('Statut', 'ccv'), self::RADIO,
[
__('Etudiant (interne, fellow)', 'ccv'),
__('Chirurgien en activité', 'ccv'),
);
//== 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'),
]
);
- $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'),
//== 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);
}
}
<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
]