From 03644edbb54bb7d4c59d4650088781545d2b9a31 Mon Sep 17 00:00:00 2001 From: Dileep Date: Fri, 22 Jun 2018 11:19:57 -0400 Subject: [PATCH 01/30] Add method to find FRSL module ID --- ExternalModule.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/ExternalModule.php b/ExternalModule.php index 8c0998e..21252a0 100644 --- a/ExternalModule.php +++ b/ExternalModule.php @@ -478,4 +478,17 @@ protected function _getFormattedSettings($settings, $values, $inherited_deltas = return $formatted; } + + /** + * gets external module_id for FRSL. + * cannot use ExternalModules::getIdForPrefix() because it is private. + */ + function getFRSLModuleId() { + $q = "SELECT external_module_id FROM redcap_external_modules where directory_prefix = '" . $this->PREFIX . "'" ; + + $result = $this->query($q); + $id = $result->fetch_assoc()['external_module_id']; + + return $id; + } } From acdf5c7014eb925c0f3a2ba11d2afd87fd87268e Mon Sep 17 00:00:00 2001 From: Dileep Date: Fri, 22 Jun 2018 11:55:46 -0400 Subject: [PATCH 02/30] Add method that checks if FRSL_v2.X.X settings exist --- ExternalModule.php | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/ExternalModule.php b/ExternalModule.php index 21252a0..2f31dbb 100644 --- a/ExternalModule.php +++ b/ExternalModule.php @@ -479,6 +479,22 @@ protected function _getFormattedSettings($settings, $values, $inherited_deltas = return $formatted; } + /** + * checks if FRSL version 2.X settings exist. + */ + function CheckIfVersion2SettingsExist() { + $module_id = $this->getFRSLModuleId(); + + //search for existing 2.X settings + $q = "SELECT 1 FROM redcap_external_module_settings WHERE external_module_id='$module_id' AND `key` IN ('control_field', 'event_name', 'event_name', 'field_name', 'enabled_before_ctrl_field_is_set', 'target_instruments', 'instrument_name', 'control_field_value');"; + $result = $this->query($q); + + //if we got something return true, otherwise false + $settings_exist = !empty($result->fetch_assoc()); + + return $settings_exist; + } + /** * gets external module_id for FRSL. * cannot use ExternalModules::getIdForPrefix() because it is private. From 029c675c08e0d93e4233e3fe8205b7de0ef25f3b Mon Sep 17 00:00:00 2001 From: Dileep Date: Wed, 27 Jun 2018 09:19:57 -0400 Subject: [PATCH 03/30] Add method to get FRSL version 2.x.x settings --- ExternalModule.php | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/ExternalModule.php b/ExternalModule.php index 2f31dbb..af791f1 100644 --- a/ExternalModule.php +++ b/ExternalModule.php @@ -486,7 +486,7 @@ function CheckIfVersion2SettingsExist() { $module_id = $this->getFRSLModuleId(); //search for existing 2.X settings - $q = "SELECT 1 FROM redcap_external_module_settings WHERE external_module_id='$module_id' AND `key` IN ('control_field', 'event_name', 'event_name', 'field_name', 'enabled_before_ctrl_field_is_set', 'target_instruments', 'instrument_name', 'control_field_value');"; + $q = "SELECT 1 FROM redcap_external_module_settings WHERE external_module_id='$module_id' AND `key` IN ('control_field', 'event_name', 'event_name', 'field_name', 'enabled_before_ctrl_field_is_set', 'target_instruments', 'instrument_name', 'control_field_value')"; $result = $this->query($q); //if we got something return true, otherwise false @@ -501,10 +501,35 @@ function CheckIfVersion2SettingsExist() { */ function getFRSLModuleId() { $q = "SELECT external_module_id FROM redcap_external_modules where directory_prefix = '" . $this->PREFIX . "'" ; - $result = $this->query($q); $id = $result->fetch_assoc()['external_module_id']; return $id; } + + /** + * gets FRSLv2.x.x settings for each as an associative array indexed by + * project_id, where each project setting is an associative array indexed by + * setting name and maps to a setting value + * @return array $settings + */ + function getV2XSettings() { + $module_id = $this->getFRSLModuleId(); + + //get old settings data + $q = "SELECT project_id, `key`, value FROM redcap_external_module_settings WHERE external_module_id='$module_id' AND `key` IN ('control_field', 'event_name', 'event_name', 'field_name', 'enabled_before_ctrl_field_is_set', 'target_instruments', 'instrument_name', 'control_field_value')"; + $result = $this->query($q); + + //create data stucture to represent old settings data + $settings = []; + while($row = $result->fetch_assoc()) { + $project_id = $row["project_id"]; + $key = $row["key"]; + $value = $row["value"]; + $settings[$project_id][$key] = $value; + } + + return $settings; + } + } From 8e5403cd8e0c6d4a3627e13d7afa056e133bf55c Mon Sep 17 00:00:00 2001 From: Dileep Date: Wed, 27 Jun 2018 09:50:03 -0400 Subject: [PATCH 04/30] Add method that converts FRSL v2.x.x settings to v3.x.x --- ExternalModule.php | 62 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/ExternalModule.php b/ExternalModule.php index af791f1..5e00b40 100644 --- a/ExternalModule.php +++ b/ExternalModule.php @@ -532,4 +532,66 @@ function getV2XSettings() { return $settings; } + /** + * converts settings from from FRSL_v2.X to FRSL_v3.X + * @param array $old_settings, array of v2 settings indexed by project_id + * @return array $new_settings, array of v3 settings indexed by project_id + */ + function convert2XSettingsTo3XSettings($old_settings) { + $module_id = $this->getFRSLModuleId(); + + //use old_settings to create new_settings + $new_settings = []; + foreach ($old_settings as $project_id => $old_setting) { + + //generate some of the new settings using the old "instrument_name" values + $old_instrument_names = json_decode($old_setting["instrument_name"]); + $old_instrument_count = count($old_instrument_names); + $branching_logic = []; + $condition_operator = []; + $target_forms = []; + $target_events_select = []; + $target_events = []; + + for($i = 0; $i < $old_instrument_count; $i++) { + $branching_logic[] = true; + $condition_operator[] = null; + $target_forms[] = [$old_instrument_names[$i]]; + $target_events_select[] = false; + $target_events[] = [null]; + } + + //convert to nested JSON-arrays for storage + $branching_logic = "[" . json_encode($branching_logic) . "]"; + $condition_operator = "[" . json_encode($condition_operator) . "]"; + $target_forms = "[" . json_encode($target_forms) . "]"; + $target_events_select = "[" . json_encode($target_events_select) . "]"; + $target_events = "[" . json_encode($target_events) . "]"; + + //create sub-structure for project setting + $setting = []; + + /*added extra angle brackets around some values because every new config + is stored as a JSON-array or as a nested JSON-array*/ + $setting["control_fields"] = $old_setting["control_field"]; + $setting["control_mode"] = '["default"]'; + $setting["control_event_id"] = $old_setting["event_name"]; + $setting["control_field_key"] = $old_setting["field_name"]; + $setting["control_piping"] = "[null]"; + $setting["control_default_value"] = "[null]"; + $setting["branching_logic"] = $branching_logic; + $setting["condition_value"] = "[" . $old_setting["control_field_value"] . "]"; + $setting["condition_operator"] = $condition_operator; + $setting["target_forms"] = $target_forms; + $setting["target_events_select"] = $target_events_select; + $setting["target_events"] = $target_events; + + //store in main data structure + $new_settings[$project_id] = $setting; + } + + return $new_settings; + + } + } From 5c1ff18cbd1babfb08ae1b5372607dec1673d769 Mon Sep 17 00:00:00 2001 From: Dileep Date: Wed, 27 Jun 2018 09:53:22 -0400 Subject: [PATCH 05/30] Remove unused variable and redundant comment from convert2XSettingsTo3XSettings method --- ExternalModule.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/ExternalModule.php b/ExternalModule.php index 5e00b40..e5ddc2d 100644 --- a/ExternalModule.php +++ b/ExternalModule.php @@ -538,9 +538,6 @@ function getV2XSettings() { * @return array $new_settings, array of v3 settings indexed by project_id */ function convert2XSettingsTo3XSettings($old_settings) { - $module_id = $this->getFRSLModuleId(); - - //use old_settings to create new_settings $new_settings = []; foreach ($old_settings as $project_id => $old_setting) { From 23740ae46f3370e67e148ddf6ae5ddf39d5a35c4 Mon Sep 17 00:00:00 2001 From: Dileep Date: Wed, 27 Jun 2018 10:20:08 -0400 Subject: [PATCH 06/30] Add method to store 3.x.x settings into db --- ExternalModule.php | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/ExternalModule.php b/ExternalModule.php index e5ddc2d..ec624d3 100644 --- a/ExternalModule.php +++ b/ExternalModule.php @@ -591,4 +591,36 @@ function convert2XSettingsTo3XSettings($old_settings) { } + /** + * stores FRSL_v3.X created by convert2XSettingsTo3XSettings method into db + * @param array $settings, array of v3 settings indexed by project_id and + * maps to a array of setting keys pointing to their associated values. + */ + function store3XSettings($settings) { + $module_id = $this->getFRSLModuleId(); + + foreach ($settings as $project_id => $setting) { + /*creates all of the local variables used in the VALUES clause in the + statement below*/ + extract($setting); + + $q = "INSERT INTO redcap_external_module_settings + (external_module_id, project_id, `key`, type, value) + VALUES + ($module_id, $project_id, 'control_fields', 'json-array', '$control_fields'), + ($module_id, $project_id, 'control_mode', 'json-array', '$control_mode'), + ($module_id, $project_id, 'control_event_id', 'json-array', '$control_event_id'), + ($module_id, $project_id, 'control_field_key', 'json-array', '$control_field_key'), + ($module_id, $project_id, 'control_piping', 'json-array', '$control_piping'), + ($module_id, $project_id, 'control_default_value', 'json-array', '$control_default_value'), + ($module_id, $project_id, 'branching_logic', 'json-array', '$branching_logic'), + ($module_id, $project_id, 'condition_value', 'json-array', '$condition_value'), + ($module_id, $project_id, 'condition_operator', 'json-array', '$condition_operator'), + ($module_id, $project_id, 'target_forms', 'json-array', '$target_forms'), + ($module_id, $project_id, 'target_events_select', 'json-array', '$target_events_select'), + ($module_id, $project_id, 'target_events', 'json-array', '$target_events')"; + + $this->query($q); + } + } } From 76629233ae500b7ab4873f306f362a45257d0628 Mon Sep 17 00:00:00 2001 From: Dileep Date: Wed, 27 Jun 2018 12:02:03 -0400 Subject: [PATCH 07/30] Configure hook to migrate v2 configs to v3 configs when changing the module version from 2 to 3 --- ExternalModule.php | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/ExternalModule.php b/ExternalModule.php index ec624d3..46f4efa 100644 --- a/ExternalModule.php +++ b/ExternalModule.php @@ -84,6 +84,17 @@ function redcap_save_record($project_id, $record = null, $instrument, $event_id, } } + /** + * @inheritdoc + */ + function redcap_module_system_change_version($version, $old_version) { + if (preg_match("/v3\.*/", $version) && preg_match("/v2\.*/", $old_version) && $this->CheckIfVersion2SettingsExist()) { + $old_setting = $this->getV2XSettings(); + $new_setting = $this->convert2XSettingsTo3XSettings($old_setting); + $this->store3XSettings($new_setting); + } + } + /** * Gets forms access matrix. * From c442bc9fe48562a231a70fde545d42d7e08d164a Mon Sep 17 00:00:00 2001 From: Dileep Date: Fri, 29 Jun 2018 10:01:19 -0400 Subject: [PATCH 08/30] Replace CheckIfVersion2SettingExist method with the more generic checkIfVersionSettingsExist method --- ExternalModule.php | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/ExternalModule.php b/ExternalModule.php index 46f4efa..070ae9d 100644 --- a/ExternalModule.php +++ b/ExternalModule.php @@ -88,7 +88,7 @@ function redcap_save_record($project_id, $record = null, $instrument, $event_id, * @inheritdoc */ function redcap_module_system_change_version($version, $old_version) { - if (preg_match("/v3\.*/", $version) && preg_match("/v2\.*/", $old_version) && $this->CheckIfVersion2SettingsExist()) { + if (preg_match("/v3\.*/", $version) && preg_match("/v2\.*/", $old_version) && $this->checkIfVersionSettingsExist($old_version)) { $old_setting = $this->getV2XSettings(); $new_setting = $this->convert2XSettingsTo3XSettings($old_setting); $this->store3XSettings($new_setting); @@ -491,13 +491,24 @@ protected function _getFormattedSettings($settings, $values, $inherited_deltas = } /** - * checks if FRSL version 2.X settings exist. + * checks if FRSL settings for specified version exist. Does not support version + * 1. Will return false for any invalid version. + * @param string $version, module version in REDCap format e.g. 'v3.1.1' + * @return boolean, true if they exist, false otherwise */ - function CheckIfVersion2SettingsExist() { + function checkIfVersionSettingsExist($version) { $module_id = $this->getFRSLModuleId(); - //search for existing 2.X settings - $q = "SELECT 1 FROM redcap_external_module_settings WHERE external_module_id='$module_id' AND `key` IN ('control_field', 'event_name', 'event_name', 'field_name', 'enabled_before_ctrl_field_is_set', 'target_instruments', 'instrument_name', 'control_field_value')"; + $q = "SELECT 1 FROM redcap_external_module_settings WHERE external_module_id='$module_id' AND `key` IN "; + + if (preg_match("/v2\.[0-9]+(\.[0-9]+)?/", $version)) { + $q .= "('control_field', 'event_name', 'event_name', 'field_name', 'enabled_before_ctrl_field_is_set', 'target_instruments', 'instrument_name', 'control_field_value')"; + } else if (preg_match("/v3\.[0-9]+(\.[0-9]+)?/", $version)) { + $q .= "('control_fields', 'control_mode', 'control_event_id', 'control_field_key', 'control_piping', 'control_default_value', 'branching_logic', 'condition_operator', 'condition_value', 'target_forms', 'target_events_select', 'target_events')"; + } else { + return false; + } + $result = $this->query($q); //if we got something return true, otherwise false From 707831246540a82b1707cfae3495b3c8b0743c1e Mon Sep 17 00:00:00 2001 From: Dileep Date: Fri, 29 Jun 2018 10:09:09 -0400 Subject: [PATCH 09/30] Make regex inside redcap_module_system_change_version hook more exclusive --- ExternalModule.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ExternalModule.php b/ExternalModule.php index 070ae9d..8f308b4 100644 --- a/ExternalModule.php +++ b/ExternalModule.php @@ -88,7 +88,7 @@ function redcap_save_record($project_id, $record = null, $instrument, $event_id, * @inheritdoc */ function redcap_module_system_change_version($version, $old_version) { - if (preg_match("/v3\.*/", $version) && preg_match("/v2\.*/", $old_version) && $this->checkIfVersionSettingsExist($old_version)) { + if (preg_match("/v3\.[0-9]+(\.[0-9]+)?/", $version) && preg_match("/v2\.[0-9]+(\.[0-9]+)?/", $old_version) && $this->checkIfVersionSettingsExist($old_version)) { $old_setting = $this->getV2XSettings(); $new_setting = $this->convert2XSettingsTo3XSettings($old_setting); $this->store3XSettings($new_setting); From 1b7674cd6c5da08c03dc8961e729ef6714bf1a6a Mon Sep 17 00:00:00 2001 From: Dileep Date: Fri, 29 Jun 2018 10:18:18 -0400 Subject: [PATCH 10/30] Add more execution constraints to redcap_module_system_change_version hook to avoid creating multiple duplicate settings --- ExternalModule.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ExternalModule.php b/ExternalModule.php index 8f308b4..25adc52 100644 --- a/ExternalModule.php +++ b/ExternalModule.php @@ -88,7 +88,7 @@ function redcap_save_record($project_id, $record = null, $instrument, $event_id, * @inheritdoc */ function redcap_module_system_change_version($version, $old_version) { - if (preg_match("/v3\.[0-9]+(\.[0-9]+)?/", $version) && preg_match("/v2\.[0-9]+(\.[0-9]+)?/", $old_version) && $this->checkIfVersionSettingsExist($old_version)) { + if (preg_match("/v3\.[0-9]+(\.[0-9]+)?/", $version) && preg_match("/v2\.[0-9]+(\.[0-9]+)?/", $old_version) && $this->checkIfVersionSettingsExist($old_version) && !$this->checkIfVersionSettingsExist($version)) { $old_setting = $this->getV2XSettings(); $new_setting = $this->convert2XSettingsTo3XSettings($old_setting); $this->store3XSettings($new_setting); From 69d9be6dc6e656a46c2f1d774155edef8c656ebc Mon Sep 17 00:00:00 2001 From: Dileep Date: Fri, 29 Jun 2018 11:28:32 -0400 Subject: [PATCH 11/30] Give methods that manipulate module settings better names --- ExternalModule.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ExternalModule.php b/ExternalModule.php index 25adc52..05f0146 100644 --- a/ExternalModule.php +++ b/ExternalModule.php @@ -89,9 +89,9 @@ function redcap_save_record($project_id, $record = null, $instrument, $event_id, */ function redcap_module_system_change_version($version, $old_version) { if (preg_match("/v3\.[0-9]+(\.[0-9]+)?/", $version) && preg_match("/v2\.[0-9]+(\.[0-9]+)?/", $old_version) && $this->checkIfVersionSettingsExist($old_version) && !$this->checkIfVersionSettingsExist($version)) { - $old_setting = $this->getV2XSettings(); - $new_setting = $this->convert2XSettingsTo3XSettings($old_setting); - $this->store3XSettings($new_setting); + $old_setting = $this->getV2Settings(); + $new_setting = $this->convertV2SettingsToV3Settings($old_setting); + $this->storeV3Settings($new_setting); } } @@ -535,7 +535,7 @@ function getFRSLModuleId() { * setting name and maps to a setting value * @return array $settings */ - function getV2XSettings() { + function getV2Settings() { $module_id = $this->getFRSLModuleId(); //get old settings data @@ -559,7 +559,7 @@ function getV2XSettings() { * @param array $old_settings, array of v2 settings indexed by project_id * @return array $new_settings, array of v3 settings indexed by project_id */ - function convert2XSettingsTo3XSettings($old_settings) { + function convertV2SettingsToV3Settings($old_settings) { $new_settings = []; foreach ($old_settings as $project_id => $old_setting) { @@ -618,7 +618,7 @@ function convert2XSettingsTo3XSettings($old_settings) { * @param array $settings, array of v3 settings indexed by project_id and * maps to a array of setting keys pointing to their associated values. */ - function store3XSettings($settings) { + function storeV3Settings($settings) { $module_id = $this->getFRSLModuleId(); foreach ($settings as $project_id => $setting) { From e5a56120e04504454e66ddbe3d45c4b8686fcc6c Mon Sep 17 00:00:00 2001 From: Dileep Date: Fri, 29 Jun 2018 12:03:03 -0400 Subject: [PATCH 12/30] Remove hard-coded values in storeV3Settings method --- ExternalModule.php | 31 ++++++++++--------------------- 1 file changed, 10 insertions(+), 21 deletions(-) diff --git a/ExternalModule.php b/ExternalModule.php index 05f0146..194fdec 100644 --- a/ExternalModule.php +++ b/ExternalModule.php @@ -622,27 +622,16 @@ function storeV3Settings($settings) { $module_id = $this->getFRSLModuleId(); foreach ($settings as $project_id => $setting) { - /*creates all of the local variables used in the VALUES clause in the - statement below*/ - extract($setting); - - $q = "INSERT INTO redcap_external_module_settings - (external_module_id, project_id, `key`, type, value) - VALUES - ($module_id, $project_id, 'control_fields', 'json-array', '$control_fields'), - ($module_id, $project_id, 'control_mode', 'json-array', '$control_mode'), - ($module_id, $project_id, 'control_event_id', 'json-array', '$control_event_id'), - ($module_id, $project_id, 'control_field_key', 'json-array', '$control_field_key'), - ($module_id, $project_id, 'control_piping', 'json-array', '$control_piping'), - ($module_id, $project_id, 'control_default_value', 'json-array', '$control_default_value'), - ($module_id, $project_id, 'branching_logic', 'json-array', '$branching_logic'), - ($module_id, $project_id, 'condition_value', 'json-array', '$condition_value'), - ($module_id, $project_id, 'condition_operator', 'json-array', '$condition_operator'), - ($module_id, $project_id, 'target_forms', 'json-array', '$target_forms'), - ($module_id, $project_id, 'target_events_select', 'json-array', '$target_events_select'), - ($module_id, $project_id, 'target_events', 'json-array', '$target_events')"; - - $this->query($q); + $q = "INSERT INTO redcap_external_module_settings (external_module_id, project_id, `key`, type, value) VALUES "; + + //build query + $values_to_insert = []; + foreach ($setting as $key => $value) { + $values_to_insert[] = "($module_id, $project_id, '$key', 'json-array', '$value')"; + } + + $q .= join(",", $values_to_insert); + $this->query($q); } } } From 0f9c923e53fd082fd18d0f1e6dc858091f657cd9 Mon Sep 17 00:00:00 2001 From: Dileep Date: Fri, 29 Jun 2018 12:21:04 -0400 Subject: [PATCH 13/30] Update 'Upgrading From Version 2.x - 3.x' to reflect you migration feature --- README.md | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/README.md b/README.md index 9a95597..626b0eb 100644 --- a/README.md +++ b/README.md @@ -40,10 +40,4 @@ See [Animal Identification Example](samples/Animal_Identification.md) for a work ## Upgrading From Version 2.x - 3.x -Note that version 3.0.0 introduced a breaking change in the configuration. To execute the upgrade you will need to follow these steps: - -* Note the projects that use FRSL -* Record the configuration of each project -* Erase the configuration of each project -* Upgrade FRSL to 3.x -* Re-enter the configuration for each project +Note that version 3.0.0 introduced a breaking change in the configuration. When you upgrade to version 3.x all of your old configurations in 2.x will be converted into the 3.x configuration scheme. This migration only occurs the first time you upgrade from 2.x to 3.x . Thereafter, if you decided to switch back and forth between the two versions, your configurations will not transfer. This is to ensure that all of your old 2.x configurations will still be available to you if you decide to go back to version 2.x . From c34d4e01e45c5aa35bc982a3226068227b3c6d27 Mon Sep 17 00:00:00 2001 From: Dileep Date: Fri, 29 Jun 2018 12:22:05 -0400 Subject: [PATCH 14/30] Update CHANGELOG to reflect new migration feature --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9cca955..b700518 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ All notable changes to the Form Render Skip Logic module will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). +## [3.2.0] - 2018-06-29 +### Added +- Add support for migrating FRSL v2.x.x configurations to FRSL v3.x.x configurations automatically (Dileep Rajput) + ## [3.1.1] - 2018-06-04 ### Changed - Fixing control field's 2nd column visibility. (Tiago Bember Simeao) From 058cbb4aa053967f611c75c4742d8ea930803c55 Mon Sep 17 00:00:00 2001 From: Dileep Date: Fri, 13 Jul 2018 10:48:19 -0400 Subject: [PATCH 15/30] Add redcap_module_system_change_verison hook to config.json permissions --- config.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/config.json b/config.json index 43fd061..afcdcac 100644 --- a/config.json +++ b/config.json @@ -6,7 +6,8 @@ "redcap_every_page_top", "redcap_data_entry_form_top", "redcap_survey_page_top", - "redcap_save_record" + "redcap_save_record", + "redcap_module_system_change_version" ], "authors": [ { From 7ff7e36e6b1feb4612fd2dec30409da8001ae65e Mon Sep 17 00:00:00 2001 From: Dileep Date: Mon, 16 Jul 2018 08:48:01 -0400 Subject: [PATCH 16/30] Add redcap_module_system_enable hook so that settings will migrate when the module is disabled and the version number is changed --- ExternalModule.php | 25 ++++++++++++++++++++----- config.json | 3 ++- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/ExternalModule.php b/ExternalModule.php index 194fdec..88c52da 100644 --- a/ExternalModule.php +++ b/ExternalModule.php @@ -88,11 +88,26 @@ function redcap_save_record($project_id, $record = null, $instrument, $event_id, * @inheritdoc */ function redcap_module_system_change_version($version, $old_version) { - if (preg_match("/v3\.[0-9]+(\.[0-9]+)?/", $version) && preg_match("/v2\.[0-9]+(\.[0-9]+)?/", $old_version) && $this->checkIfVersionSettingsExist($old_version) && !$this->checkIfVersionSettingsExist($version)) { - $old_setting = $this->getV2Settings(); - $new_setting = $this->convertV2SettingsToV3Settings($old_setting); - $this->storeV3Settings($new_setting); - } + //migrate settings only if version 2 settings exist and version 3 settings + //do not exist. + if ($this->checkIfVersionSettingsExist("v2.0.0") && !$this->checkIfVersionSettingsExist("v3.0.0")) { + $old_setting = $this->getV2Settings(); + $new_setting = $this->convertV2SettingsToV3Settings($old_setting); + $this->storeV3Settings($new_setting); + } + } + + /** + * @inheritdoc + */ + function redcap_module_system_enable($version) { + //migrate settings only if version 2 settings exist and version 3 settings + //do not exist. + if ($this->checkIfVersionSettingsExist("v2.0.0") && !$this->checkIfVersionSettingsExist("v3.0.0")) { + $old_setting = $this->getV2Settings(); + $new_setting = $this->convertV2SettingsToV3Settings($old_setting); + $this->storeV3Settings($new_setting); + } } /** diff --git a/config.json b/config.json index afcdcac..e21d6d2 100644 --- a/config.json +++ b/config.json @@ -7,7 +7,8 @@ "redcap_data_entry_form_top", "redcap_survey_page_top", "redcap_save_record", - "redcap_module_system_change_version" + "redcap_module_system_change_version", + "redcap_module_system_enable" ], "authors": [ { From 949cfaad6630abc563c98f0d55c0ec7d219d0346 Mon Sep 17 00:00:00 2001 From: Dileep Date: Mon, 16 Jul 2018 09:04:50 -0400 Subject: [PATCH 17/30] Refactor repeated code in system_change_version and module_system_enable hooks into migrateSettings method --- ExternalModule.php | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/ExternalModule.php b/ExternalModule.php index 88c52da..bba01a6 100644 --- a/ExternalModule.php +++ b/ExternalModule.php @@ -88,26 +88,14 @@ function redcap_save_record($project_id, $record = null, $instrument, $event_id, * @inheritdoc */ function redcap_module_system_change_version($version, $old_version) { - //migrate settings only if version 2 settings exist and version 3 settings - //do not exist. - if ($this->checkIfVersionSettingsExist("v2.0.0") && !$this->checkIfVersionSettingsExist("v3.0.0")) { - $old_setting = $this->getV2Settings(); - $new_setting = $this->convertV2SettingsToV3Settings($old_setting); - $this->storeV3Settings($new_setting); - } + $this->migrateSettings(); } /** * @inheritdoc */ function redcap_module_system_enable($version) { - //migrate settings only if version 2 settings exist and version 3 settings - //do not exist. - if ($this->checkIfVersionSettingsExist("v2.0.0") && !$this->checkIfVersionSettingsExist("v3.0.0")) { - $old_setting = $this->getV2Settings(); - $new_setting = $this->convertV2SettingsToV3Settings($old_setting); - $this->storeV3Settings($new_setting); - } + $this->migrateSettings(); } /** @@ -649,4 +637,19 @@ function storeV3Settings($settings) { $this->query($q); } } + + /** + * migrates stored module settings from v2.x.x to v3.x.x if needed. + * @param none. + * @return none. + */ + function migrateSettings() { + //migrate settings only if version 2 settings exist and version 3 settings + //do not exist. + if ($this->checkIfVersionSettingsExist("v2.0.0") && !$this->checkIfVersionSettingsExist("v3.0.0")) { + $old_setting = $this->getV2Settings(); + $new_setting = $this->convertV2SettingsToV3Settings($old_setting); + $this->storeV3Settings($new_setting); + } + } } From 2d1dcec2010182f8d9044734910498eefe4840d0 Mon Sep 17 00:00:00 2001 From: Dileep Date: Wed, 25 Jul 2018 09:13:03 -0400 Subject: [PATCH 18/30] Move migration code into its own class --- ExternalModule.php | 171 ++++----------------------------------------- Migration.php | 161 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 176 insertions(+), 156 deletions(-) create mode 100644 Migration.php diff --git a/ExternalModule.php b/ExternalModule.php index bba01a6..e262937 100644 --- a/ExternalModule.php +++ b/ExternalModule.php @@ -8,6 +8,7 @@ use ExternalModules\AbstractExternalModule; use ExternalModules\ExternalModules; +use FormRenderSkipLogic\Migration\Migration; use Form; use Piping; use Project; @@ -16,6 +17,8 @@ use RCView; use REDCap; +require_once dirname(__FILE__) . '/Migration.php'; + /** * ExternalModule class for REDCap Form Render Skip Logic. */ @@ -493,163 +496,19 @@ protected function _getFormattedSettings($settings, $values, $inherited_deltas = return $formatted; } - /** - * checks if FRSL settings for specified version exist. Does not support version - * 1. Will return false for any invalid version. - * @param string $version, module version in REDCap format e.g. 'v3.1.1' - * @return boolean, true if they exist, false otherwise - */ - function checkIfVersionSettingsExist($version) { - $module_id = $this->getFRSLModuleId(); - - $q = "SELECT 1 FROM redcap_external_module_settings WHERE external_module_id='$module_id' AND `key` IN "; - - if (preg_match("/v2\.[0-9]+(\.[0-9]+)?/", $version)) { - $q .= "('control_field', 'event_name', 'event_name', 'field_name', 'enabled_before_ctrl_field_is_set', 'target_instruments', 'instrument_name', 'control_field_value')"; - } else if (preg_match("/v3\.[0-9]+(\.[0-9]+)?/", $version)) { - $q .= "('control_fields', 'control_mode', 'control_event_id', 'control_field_key', 'control_piping', 'control_default_value', 'branching_logic', 'condition_operator', 'condition_value', 'target_forms', 'target_events_select', 'target_events')"; - } else { - return false; - } - - $result = $this->query($q); - - //if we got something return true, otherwise false - $settings_exist = !empty($result->fetch_assoc()); - - return $settings_exist; - } - - /** - * gets external module_id for FRSL. - * cannot use ExternalModules::getIdForPrefix() because it is private. - */ - function getFRSLModuleId() { - $q = "SELECT external_module_id FROM redcap_external_modules where directory_prefix = '" . $this->PREFIX . "'" ; - $result = $this->query($q); - $id = $result->fetch_assoc()['external_module_id']; - - return $id; - } - - /** - * gets FRSLv2.x.x settings for each as an associative array indexed by - * project_id, where each project setting is an associative array indexed by - * setting name and maps to a setting value - * @return array $settings - */ - function getV2Settings() { - $module_id = $this->getFRSLModuleId(); - - //get old settings data - $q = "SELECT project_id, `key`, value FROM redcap_external_module_settings WHERE external_module_id='$module_id' AND `key` IN ('control_field', 'event_name', 'event_name', 'field_name', 'enabled_before_ctrl_field_is_set', 'target_instruments', 'instrument_name', 'control_field_value')"; - $result = $this->query($q); - - //create data stucture to represent old settings data - $settings = []; - while($row = $result->fetch_assoc()) { - $project_id = $row["project_id"]; - $key = $row["key"]; - $value = $row["value"]; - $settings[$project_id][$key] = $value; - } - - return $settings; - } /** - * converts settings from from FRSL_v2.X to FRSL_v3.X - * @param array $old_settings, array of v2 settings indexed by project_id - * @return array $new_settings, array of v3 settings indexed by project_id + * migrates stored module settings from v2.x.x to v3.x.x if needed. */ - function convertV2SettingsToV3Settings($old_settings) { - $new_settings = []; - foreach ($old_settings as $project_id => $old_setting) { - - //generate some of the new settings using the old "instrument_name" values - $old_instrument_names = json_decode($old_setting["instrument_name"]); - $old_instrument_count = count($old_instrument_names); - $branching_logic = []; - $condition_operator = []; - $target_forms = []; - $target_events_select = []; - $target_events = []; - - for($i = 0; $i < $old_instrument_count; $i++) { - $branching_logic[] = true; - $condition_operator[] = null; - $target_forms[] = [$old_instrument_names[$i]]; - $target_events_select[] = false; - $target_events[] = [null]; - } - - //convert to nested JSON-arrays for storage - $branching_logic = "[" . json_encode($branching_logic) . "]"; - $condition_operator = "[" . json_encode($condition_operator) . "]"; - $target_forms = "[" . json_encode($target_forms) . "]"; - $target_events_select = "[" . json_encode($target_events_select) . "]"; - $target_events = "[" . json_encode($target_events) . "]"; - - //create sub-structure for project setting - $setting = []; - - /*added extra angle brackets around some values because every new config - is stored as a JSON-array or as a nested JSON-array*/ - $setting["control_fields"] = $old_setting["control_field"]; - $setting["control_mode"] = '["default"]'; - $setting["control_event_id"] = $old_setting["event_name"]; - $setting["control_field_key"] = $old_setting["field_name"]; - $setting["control_piping"] = "[null]"; - $setting["control_default_value"] = "[null]"; - $setting["branching_logic"] = $branching_logic; - $setting["condition_value"] = "[" . $old_setting["control_field_value"] . "]"; - $setting["condition_operator"] = $condition_operator; - $setting["target_forms"] = $target_forms; - $setting["target_events_select"] = $target_events_select; - $setting["target_events"] = $target_events; - - //store in main data structure - $new_settings[$project_id] = $setting; - } - - return $new_settings; - - } - - /** - * stores FRSL_v3.X created by convert2XSettingsTo3XSettings method into db - * @param array $settings, array of v3 settings indexed by project_id and - * maps to a array of setting keys pointing to their associated values. - */ - function storeV3Settings($settings) { - $module_id = $this->getFRSLModuleId(); - - foreach ($settings as $project_id => $setting) { - $q = "INSERT INTO redcap_external_module_settings (external_module_id, project_id, `key`, type, value) VALUES "; - - //build query - $values_to_insert = []; - foreach ($setting as $key => $value) { - $values_to_insert[] = "($module_id, $project_id, '$key', 'json-array', '$value')"; - } - - $q .= join(",", $values_to_insert); - $this->query($q); - } - } - - /** - * migrates stored module settings from v2.x.x to v3.x.x if needed. - * @param none. - * @return none. - */ - function migrateSettings() { - //migrate settings only if version 2 settings exist and version 3 settings - //do not exist. - if ($this->checkIfVersionSettingsExist("v2.0.0") && !$this->checkIfVersionSettingsExist("v3.0.0")) { - $old_setting = $this->getV2Settings(); - $new_setting = $this->convertV2SettingsToV3Settings($old_setting); - $this->storeV3Settings($new_setting); - } - } + function migrateSettings() { + $migrate = new Migration($this->PREFIX); + + //migrate settings only if version 2 settings exist and version 3 settings + //do not exist. + if ($migrate->checkIfVersionSettingsExist("v2.0.0") && !$migrate->checkIfVersionSettingsExist("v3.0.0")) { + $old_setting = $migrate->getV2Settings(); + $new_setting = $migrate->convertV2SettingsToV3Settings($old_setting); + $migrate->storeV3Settings($new_setting); + } + } } diff --git a/Migration.php b/Migration.php new file mode 100644 index 0000000..9a2dabb --- /dev/null +++ b/Migration.php @@ -0,0 +1,161 @@ +PREFIX = $prefix; + } + + /** + * checks if FRSL settings for specified version exist. Does not support version + * 1. Will return false for any invalid version. + * @param string $version, module version in REDCap format e.g. 'v3.1.1' + * @return boolean, true if they exist, false otherwise + */ + function checkIfVersionSettingsExist($version) { + $module_id = $this->getFRSLModuleId(); + + $q = "SELECT 1 FROM redcap_external_module_settings WHERE external_module_id='$module_id' AND `key` IN "; + + if (preg_match("/v2\.[0-9]+(\.[0-9]+)?/", $version)) { + $q .= "('control_field', 'event_name', 'event_name', 'field_name', 'enabled_before_ctrl_field_is_set', 'target_instruments', 'instrument_name', 'control_field_value')"; + } else if (preg_match("/v3\.[0-9]+(\.[0-9]+)?/", $version)) { + $q .= "('control_fields', 'control_mode', 'control_event_id', 'control_field_key', 'control_piping', 'control_default_value', 'branching_logic', 'condition_operator', 'condition_value', 'target_forms', 'target_events_select', 'target_events')"; + } else { + return false; + } + + $result = ExternalModules::query($q); + + //if we got something return true, otherwise false + $settings_exist = !empty($result->fetch_assoc()); + + return $settings_exist; + } + + /** + * gets external module_id for FRSL. + * cannot use ExternalModules::getIdForPrefix() because it is private. + */ + function getFRSLModuleId() { + $q = "SELECT external_module_id FROM redcap_external_modules where directory_prefix = '" . $this->PREFIX . "'" ; + $result = ExternalModules::query($q); + $id = $result->fetch_assoc()['external_module_id']; + + return $id; + } + + /** + * gets FRSLv2.x.x settings for each as an associative array indexed by + * project_id, where each project setting is an associative array indexed by + * setting name and maps to a setting value + * @return array $settings + */ + function getV2Settings() { + $module_id = $this->getFRSLModuleId(); + + //get old settings data + $q = "SELECT project_id, `key`, value FROM redcap_external_module_settings WHERE external_module_id='$module_id' AND `key` IN ('control_field', 'event_name', 'event_name', 'field_name', 'enabled_before_ctrl_field_is_set', 'target_instruments', 'instrument_name', 'control_field_value')"; + $result = ExternalModules::query($q); + + //create data stucture to represent old settings data + $settings = []; + while($row = $result->fetch_assoc()) { + $project_id = $row["project_id"]; + $key = $row["key"]; + $value = $row["value"]; + $settings[$project_id][$key] = $value; + } + + return $settings; + } + + /** + * converts settings from from FRSL_v2.X to FRSL_v3.X + * @param array $old_settings, array of v2 settings indexed by project_id + * @return array $new_settings, array of v3 settings indexed by project_id + */ + function convertV2SettingsToV3Settings($old_settings) { + $new_settings = []; + foreach ($old_settings as $project_id => $old_setting) { + + //generate some of the new settings using the old "instrument_name" values + $old_instrument_names = json_decode($old_setting["instrument_name"]); + $old_instrument_count = count($old_instrument_names); + $branching_logic = []; + $condition_operator = []; + $target_forms = []; + $target_events_select = []; + $target_events = []; + + for($i = 0; $i < $old_instrument_count; $i++) { + $branching_logic[] = true; + $condition_operator[] = null; + $target_forms[] = [$old_instrument_names[$i]]; + $target_events_select[] = false; + $target_events[] = [null]; + } + + //convert to nested JSON-arrays for storage + $branching_logic = "[" . json_encode($branching_logic) . "]"; + $condition_operator = "[" . json_encode($condition_operator) . "]"; + $target_forms = "[" . json_encode($target_forms) . "]"; + $target_events_select = "[" . json_encode($target_events_select) . "]"; + $target_events = "[" . json_encode($target_events) . "]"; + + //create sub-structure for project setting + $setting = []; + + /*added extra angle brackets around some values because every new config + is stored as a JSON-array or as a nested JSON-array*/ + $setting["control_fields"] = $old_setting["control_field"]; + $setting["control_mode"] = '["default"]'; + $setting["control_event_id"] = $old_setting["event_name"]; + $setting["control_field_key"] = $old_setting["field_name"]; + $setting["control_piping"] = "[null]"; + $setting["control_default_value"] = "[null]"; + $setting["branching_logic"] = $branching_logic; + $setting["condition_value"] = "[" . $old_setting["control_field_value"] . "]"; + $setting["condition_operator"] = $condition_operator; + $setting["target_forms"] = $target_forms; + $setting["target_events_select"] = $target_events_select; + $setting["target_events"] = $target_events; + + //store in main data structure + $new_settings[$project_id] = $setting; + } + + return $new_settings; + + } + + /** + * stores FRSL_v3.X created by convert2XSettingsTo3XSettings method into db + * @param array $settings, array of v3 settings indexed by project_id and + * maps to a array of setting keys pointing to their associated values. + */ + function storeV3Settings($settings) { + $module_id = $this->getFRSLModuleId(); + + foreach ($settings as $project_id => $setting) { + $q = "INSERT INTO redcap_external_module_settings (external_module_id, project_id, `key`, type, value) VALUES "; + + //build query + $values_to_insert = []; + foreach ($setting as $key => $value) { + $values_to_insert[] = "($module_id, $project_id, '$key', 'json-array', '$value')"; + } + + $q .= join(",", $values_to_insert); + ExternalModules::query($q); + } + } +} + + ?> From b46f6110525ebb6375871b4737b0295097470958 Mon Sep 17 00:00:00 2001 From: Dileep Date: Wed, 25 Jul 2018 11:49:22 -0400 Subject: [PATCH 19/30] Optimize convertV2SettingsToV3Settings to not generate multiple branching logic sub-settings for the same control field value --- Migration.php | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/Migration.php b/Migration.php index 9a2dabb..a2bfcc4 100644 --- a/Migration.php +++ b/Migration.php @@ -85,26 +85,39 @@ function convertV2SettingsToV3Settings($old_settings) { $new_settings = []; foreach ($old_settings as $project_id => $old_setting) { - //generate some of the new settings using the old "instrument_name" values + //generate branching_logic settings using old values $old_instrument_names = json_decode($old_setting["instrument_name"]); $old_instrument_count = count($old_instrument_names); + $old_control_field_values = json_decode($old_setting["control_field_value"]); $branching_logic = []; $condition_operator = []; + $condition_value = []; $target_forms = []; $target_events_select = []; $target_events = []; for($i = 0; $i < $old_instrument_count; $i++) { - $branching_logic[] = true; - $condition_operator[] = null; - $target_forms[] = [$old_instrument_names[$i]]; - $target_events_select[] = false; - $target_events[] = [null]; + //check if a branching_logic setting already exists for this instrument + $index = array_search($old_control_field_values[$i], $condition_value); + + if($index !== false) { + //append instrument to existing branching_logic configuration + $target_forms[$index][] = $old_instrument_names[$i]; + } else { + //create a new branching_logic sub setting + $branching_logic[] = true; + $condition_operator[] = null; + $condition_value[] = $old_control_field_values[$i]; + $target_forms[] = [$old_instrument_names[$i]]; + $target_events_select[] = false; + $target_events[] = [null]; + } } //convert to nested JSON-arrays for storage $branching_logic = "[" . json_encode($branching_logic) . "]"; $condition_operator = "[" . json_encode($condition_operator) . "]"; + $condition_value = "[" . json_encode($condition_value) . "]"; $target_forms = "[" . json_encode($target_forms) . "]"; $target_events_select = "[" . json_encode($target_events_select) . "]"; $target_events = "[" . json_encode($target_events) . "]"; @@ -112,8 +125,6 @@ function convertV2SettingsToV3Settings($old_settings) { //create sub-structure for project setting $setting = []; - /*added extra angle brackets around some values because every new config - is stored as a JSON-array or as a nested JSON-array*/ $setting["control_fields"] = $old_setting["control_field"]; $setting["control_mode"] = '["default"]'; $setting["control_event_id"] = $old_setting["event_name"]; @@ -121,7 +132,7 @@ function convertV2SettingsToV3Settings($old_settings) { $setting["control_piping"] = "[null]"; $setting["control_default_value"] = "[null]"; $setting["branching_logic"] = $branching_logic; - $setting["condition_value"] = "[" . $old_setting["control_field_value"] . "]"; + $setting["condition_value"] = $condition_value; $setting["condition_operator"] = $condition_operator; $setting["target_forms"] = $target_forms; $setting["target_events_select"] = $target_events_select; From 2ab89cd7decaed76e9fbb79ecb6b1048b9bde9d1 Mon Sep 17 00:00:00 2001 From: Tiago Bember Simeao Date: Thu, 26 Jul 2018 18:04:00 -0400 Subject: [PATCH 20/30] Adding support for equations on Advanced control mode. --- CHANGELOG.md | 5 +++-- ExternalModule.php | 18 ++++++++++++++---- config.json | 6 +++--- css/piping-helper.css | 7 +++++++ 4 files changed, 27 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b700518..81e1b1f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,9 +2,10 @@ All notable changes to the Form Render Skip Logic module will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). -## [3.2.0] - 2018-06-29 +## [3.2.0] - 2018-07-27 ### Added -- Add support for migrating FRSL v2.x.x configurations to FRSL v3.x.x configurations automatically (Dileep Rajput) +- Added support for migrating FRSL v2.x.x configurations to FRSL v3.x.x configurations automatically (Dileep Rajput) +- Added support for equations on Advanced control mode (Tiago Bember Simeao) ## [3.1.1] - 2018-06-04 ### Changed diff --git a/ExternalModule.php b/ExternalModule.php index e262937..43b2da0 100644 --- a/ExternalModule.php +++ b/ExternalModule.php @@ -6,10 +6,12 @@ namespace FormRenderSkipLogic\ExternalModule; +use Calculate; use ExternalModules\AbstractExternalModule; use ExternalModules\ExternalModules; use FormRenderSkipLogic\Migration\Migration; use Form; +use LogicTester; use Piping; use Project; use Records; @@ -71,7 +73,7 @@ function redcap_survey_page_top($project_id, $record = null, $instrument, $event } // Access denied for this survey. - if (!$redirect_url = Survey::getAutoContinueSurveyUrl($record, $form_name, $event_id, $repeat_instance)) { + if (!$redirect_url = Survey::getAutoContinueSurveyUrl($record, $instrument, $event_id, $repeat_instance)) { $redirect_url = APP_PATH_WEBROOT; } @@ -191,9 +193,16 @@ function getFormsAccessMatrix($arm, $record = null) { $b = $cf['condition_value']; if ($cf['control_mode'] == 'advanced') { - $piped = Piping::replaceVariablesInLabel($cf['control_piping'], $id, $event_id, 1, array(), true, null, false); + $piped = Piping::pipeSpecialTags($cf['control_piping'], $Proj->project_id, $id, null, null, null, true); + $piped = Piping::replaceVariablesInLabel($piped, $id, null, 1, array(), false); + if ($piped !== '') { - $a = $piped; + $piped = preg_replace('/]*piping_receiver[^>]*>/', '"', str_replace('', '"', $piped)); + $piped = strval(LogicTester::evaluateCondition(Calculate::formatCalcToPHP($piped))); + + if ($piped !== '') { + $a = $piped; + } } } else { @@ -459,7 +468,8 @@ protected function getPipingHelperButtons() { $output .= RCView::button(array('class' => 'btn btn-xs btn-rc' . $color . ' btn-rc' . $color . '-light', 'onclick' => $btn['callback'] . '(); return false;'), $btn['contents']); } - return RCView::span(array('class' => 'frsl-piping-helper'), $output); + $output .= RCView::br() . RCView::a(array('href' => 'javascript:;', 'onclick' => 'helpPopup("ss78");'), $lang['design_165']); + return RCView::br() . RCView::span(array('class' => 'frsl-piping-helper'), $output); } /** diff --git a/config.json b/config.json index e21d6d2..ab98c4f 100644 --- a/config.json +++ b/config.json @@ -65,7 +65,7 @@ }, { "value": "advanced", - "name": "Advanced (Piping)" + "name": "Advanced (equation and/or Piping)" } ] }, @@ -81,8 +81,8 @@ }, { "key": "control_piping", - "name": "Piping", - "type": "text" + "name": "Equation / Piping", + "type": "textarea" }, { "key": "control_default_value", diff --git a/css/piping-helper.css b/css/piping-helper.css index e4de992..00035b2 100644 --- a/css/piping-helper.css +++ b/css/piping-helper.css @@ -15,3 +15,10 @@ top: -1px; margin-right: 2px; } + +.frsl-piping-helper a { + font-weight: normal; + color: #3089d4; + font-size: 11px; + margin: 10px 0 0 10px; +} From 63864551ca58d2728e64730847e4bf7218141abe Mon Sep 17 00:00:00 2001 From: Tiago Bember Simeao Date: Fri, 27 Jul 2018 11:01:34 -0400 Subject: [PATCH 21/30] Adding documentation about Advanced control mode. --- README.md | 9 ++++++++- config.json | 2 +- img/advanced_control_field.png | Bin 0 -> 37305 bytes img/configuration_form.png | Bin 73748 -> 64644 bytes 4 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 img/advanced_control_field.png diff --git a/README.md b/README.md index 626b0eb..3031fc7 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,14 @@ See the original functional specification at [https://docs.google.com/document/d ## Configuration Access **Manage External Modules** section of your project, click on Form Render Skip Logic's configure button, and save settings in order to show or hide instruments according to your needs. -The top level entry in the configuration is a Control Field. A control field is described by either an event name and a field name _or_ a smart variable _or_ piped data. Each control field can govern the display of a set of forms. You can define multiple control fields as long as each controls a separate set of forms. +The top level entry in the configuration is a Control Field. A control field is described by either: + +1. a selected event-field pair _or_ +2. a text that describes an equation, working as a [calculated field](https://www.ctsi.ufl.edu/files/2017/06/Calculated-Fields-%E2%80%93-REDCap-How.pdf) (you may use Piping and smart variables) + +![advanced control field](img/advanced_control_field.png) + +Each control field can govern the display of a set of forms. You can define multiple control fields as long as each controls a separate set of forms. Each control field can have multiple conditions. Each condition compares the control field to a string or number. If the condition evaluates as true, the forms listed under the condition will be displayed. If the condition is false and no other true condition displays them, the forms will be hidden. Be careful that the values in the conditions of a control field are mutually exclusive or the results could be unexpected. diff --git a/config.json b/config.json index ab98c4f..446a30a 100644 --- a/config.json +++ b/config.json @@ -65,7 +65,7 @@ }, { "value": "advanced", - "name": "Advanced (equation and/or Piping)" + "name": "Advanced (Equation with Piping and/or Smart Variables)" } ] }, diff --git a/img/advanced_control_field.png b/img/advanced_control_field.png new file mode 100644 index 0000000000000000000000000000000000000000..dbb8f32a6bb35f7a008f68142ec07207d2ae1f5f GIT binary patch literal 37305 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 YLp)r>_U4T`9PlG4E+bYfqU-a20LtCjw*UYD literal 0 HcmV?d00001 diff --git a/img/configuration_form.png b/img/configuration_form.png index 6c939585c18d8ef9ab6ea4b1e5ac11dcd0b1ee2c..e716832eb64005fdacdfb69a4f0177ac954e5e36 100644 GIT binary patch literal 64644 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

(}?*h4qf?`C&cE{N^=JE&`yGfi-aW{$rbXBcB}X zFRsN;3yq!qgS_WS9F={g1kopuYLM%${w zlPRpst5c`u#-{jC<0Q$&6Mj#S*m4Ouw-0@%)`F~P!Mh2x*TA+0TgmBZBR{md8Q_z> zIxqFPVJwR}lKOUA`@Vl5_--eMP)q4vn$O;5e!#%KsRg8PrJ1pvb@OMAmjIi1?Z*8; zW?RMv0y-a3>I%h4KJ>-odZIYjMmPMl$-Ar{Rra}T&9iIqolc8Gcw?d^;qQfnZET!@7$vAT3@3S!U>M1wM9Cjqv91E?T57%M6kQt*~1C`x>mG7`Y!%h%4I9~2p^t(I6 zXdMA!cR`i9ZPN?)x=iYQkvW_#5rcioS*WfZDnDYiXxPO0sf7#gA1+qLi^($|Po<{| zKE)GjO|zN#?_3bt7Yn?P&-pPg_sYSz&)$=ci~OxHrPDiQE}rMpNXd6n=jl$-)H^Sh zwyANP<@-!aU#sO0jH^Z7*B)a{iwhs>r>Z(UH|jWU>s3CZU?-dp{oE3M-tal3I)UE> z%<-4|zESCcxb&H69r$&JY6i$;ZJ`1XZ~BazER*-%87iuCVPmf_730(WBPC8Svie8P z{8l8DyF(Vpu>+XZfqmH#5KQLr*jmwTC2Xqx52$)wW(QGd!_FA$7|3|>p$32Q-%^NZ zMPS_8IwUKf*UM)sQDvJ_dG`-qgRl|)orFNio3#a?|J?De=$}6lq=5naTWvww^EdWv z{}ZzfZc)B_w|gde9|c(bkeH|y4K3|wAt2SBWv>pCdMNnf1;XD7TNwVS4g0?8!YbR2 zKHgsL4_qBC@VFmka>hOD#+860#NK!U)#pC|S)5O=?Bc=!NWp*g1AX^a1T`>1;=!?P z2~dBRE2fla)|qW?Zdz;r=sxjHXf7%!(o!o5AkzxU&dx|OtA;FgNVkIz zW_xl>PD>dbe1|SL?YUYQl@DVO$*|D6%<5{WH}IX3$lp)OR&tuY8_|j6|2dWzqhFsI zrL)d38M~nSSViO6-xG=ksYf(5H&04S({K;1I2~mGRv~E~LV$d@X4U1#ziK6EN?wey z4|H#)-77^EzefE$yToy4fMkw_>Og*3sP{$Vb3 zWb%=(1H$`&&)pVlI`P>ulaY?Xc!JHwgQi zy5ZMw!%j_FQxpg82nw>|4f?}E%GBoZfzX$)lpgIx%r5Q2E)M3B7_}RdZvZ`?`4Vp9 zfBKf_+xrY9L)mkrX7-{Ub0@Z>?C|QX_KcsC>~fp@3`;ENJGrD9-~~fCibQ)({∈ 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 ^^TWP4M0u*V4jDM#2 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 IQP=l>0kAC49{>OV From 21adaa15df6e98948494cd4181d313026fcf4f3d Mon Sep 17 00:00:00 2001 From: Tiago Bember Simeao Date: Mon, 30 Jul 2018 10:54:19 -0400 Subject: [PATCH 22/30] Adding support to event-relative piping variables --- CHANGELOG.md | 3 +- ExternalModule.php | 157 ++++++++++++++++++++++++++++++--------------- README.md | 4 +- config.json | 8 +-- css/config.css | 2 +- js/config.js | 2 +- 6 files changed, 116 insertions(+), 60 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 81e1b1f..b03b07a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,10 +2,11 @@ All notable changes to the Form Render Skip Logic module will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). -## [3.2.0] - 2018-07-27 +## [3.2.0] - 2018-07-30 ### Added - Added support for migrating FRSL v2.x.x configurations to FRSL v3.x.x configurations automatically (Dileep Rajput) - Added support for equations on Advanced control mode (Tiago Bember Simeao) +- Added support to event-relative control fields (Tiago Bember Simeao) ## [3.1.1] - 2018-06-04 ### Changed diff --git a/ExternalModule.php b/ExternalModule.php index 43b2da0..04fd53c 100644 --- a/ExternalModule.php +++ b/ExternalModule.php @@ -25,6 +25,8 @@ * ExternalModule class for REDCap Form Render Skip Logic. */ class ExternalModule extends AbstractExternalModule { + protected static $accessMatrix; + /** * @inheritdoc */ @@ -106,10 +108,10 @@ function redcap_module_system_enable($version) { /** * Gets forms access matrix. * - * @param string $arm - * The arm name. + * @param int $event_id + * The current event ID. * @param int $record - * The data entry record ID. + * The current record ID. * * @return array * The forms access matrix. The array is keyed as follows: @@ -117,23 +119,37 @@ function redcap_module_system_enable($version) { * -- event ID * --- instrument name: TRUE/FALSE */ - function getFormsAccessMatrix($arm, $record = null) { + function getFormsAccessMatrix($event_id = null, $record) { + if (isset(self::$accessMatrix)) { + return self::$accessMatrix; + } + global $Proj; - // Getting events of the current arm. - $events = array_keys($Proj->events[$arm]['events']); + if ($event_id) { + $events = array($event_id); + } + else { + // Getting events of the current arm. + $arm = $event_id ? $Proj->eventInfo[$event_id]['arm_num'] : $this->getNumericQueryParam('arm', 1); + $events = array_keys($Proj->events[$arm]['events']); + } $target_forms = array(); $settings = $this->getFormattedSettings($Proj->project_id); $control_fields = array(); - $control_fields_keys = array(); + $control_fields_keys = array($Proj->table_pk); $i = 0; foreach ($settings['control_fields'] as $cf) { - if ($cf['control_mode'] == 'default' && (!$cf['control_event_id'] || !$cf['control_field_key'])) { - // Checking for required fields in default mode. - continue; + if ($cf['control_mode'] == 'default') { + if (!$cf['control_field_key']) { + // Checking for required fields in default mode. + continue; + } + + $control_fields_keys[] = $cf['control_field_key']; } if ($cf['control_mode'] == 'advanced' && !$cf['control_piping']) { @@ -141,7 +157,6 @@ function getFormsAccessMatrix($arm, $record = null) { continue; } - $control_fields_keys[] = $cf['control_field_key']; if (empty($cf['control_default_value']) && !is_numeric($cf['control_default_value'])) { $cf['control_default_value'] = ''; } @@ -155,7 +170,7 @@ function getFormsAccessMatrix($arm, $record = null) { } $control_fields[$i] = $cf + $bl; - $target_events = $bl['target_events_select'] ? $bl['target_events'] : $events; + $target_events = $bl['target_events_select'] ? array_intersect($bl['target_events'], $events) : $events; foreach ($target_events as $event_id) { if (!isset($target_forms[$event_id])) { @@ -175,7 +190,7 @@ function getFormsAccessMatrix($arm, $record = null) { } } - $control_data = REDCap::getData($Proj->project_id, 'array', $record, $control_field_keys); + $control_data = REDCap::getData($Proj->project_id, 'array', $record, $control_field_keys, $events); if ($record && !isset($control_data[$record])) { // Handling new record case. $control_data = array($record => array()); @@ -185,53 +200,55 @@ function getFormsAccessMatrix($arm, $record = null) { $forms_access = array(); foreach ($control_data as $id => $data) { $control_values = array(); - foreach ($control_fields as $i => $cf) { - $ev = $cf['control_event_id']; - $fd = $cf['control_field_key']; - $a = $cf['control_default_value']; + foreach ($control_fields as $i => $cf) { $b = $cf['condition_value']; + $control_values[$i] = array(); if ($cf['control_mode'] == 'advanced') { - $piped = Piping::pipeSpecialTags($cf['control_piping'], $Proj->project_id, $id, null, null, null, true); - $piped = Piping::replaceVariablesInLabel($piped, $id, null, 1, array(), false); + // On advanced mode, it is required to run Piping for each + // event in order to handle relative variables. + foreach ($events as $ev) { + $a = $cf['control_default_value']; - if ($piped !== '') { - $piped = preg_replace('/]*piping_receiver[^>]*>/', '"', str_replace('', '"', $piped)); - $piped = strval(LogicTester::evaluateCondition(Calculate::formatCalcToPHP($piped))); + $piped = Piping::pipeSpecialTags($cf['control_piping'], $Proj->project_id, $id, $ev, null, null, true); + $piped = Piping::replaceVariablesInLabel($piped, $id, $ev, 1, array(), false); if ($piped !== '') { - $a = $piped; + $piped = Calculate::formatCalcToPHP($piped); + + // The trick here is to enable Piping with span + // wrappers and then replace them with quotes, so + // the strings (empty or not) will properly be + // quoted in the formula. + $piped = preg_replace('/]*piping_receiver[^>]*>/', '"', str_replace('', '"', $piped)); + $piped = strval(LogicTester::evaluateCondition($piped)); + + if ($piped !== '') { + $a = $piped; + } } + + $control_values[$i][$ev] = $this->_calculateCondition($a, $b, $cf['condition_operator']); } } else { - if (isset($data[$ev][$fd]) && Records::formHasData($id, $Proj->metadata[$fd]['form_name'], $ev)) { - $a = $data[$ev][$fd]; - } - } + $fd = $cf['control_field_key']; - switch ($cf['condition_operator']) { - case '>': - $matches = $a > $b; - break; - case '>=': - $matches = $a >= $b; - break; - case '<': - $matches = $a < $b; - break; - case '<=': - $matches = $a <= $b; - break; - case '<>': - $matches = $a !== $b; - break; - default: - $matches = $a === $b; + if ($ev = $cf['control_event_id']) { + $a = $this->_getDataIfExists($id, $ev, $fd, $data, $cf['control_default_value']); + $matches = $this->_calculateCondition($a, $b, $cf['condition_operator']); + $control_values[$i] = array_combine($events, array_fill(0, count($events), $matches)); + } + else { + // If event has not been specified, we need to get the + // the control field for each event. + foreach ($events as $ev) { + $a = $this->_getDataIfExists($id, $ev, $fd, $data, $cf['control_default_value']); + $control_values[$i][$ev] = $this->_calculateCondition($a, $b, $cf['condition_operator']); + } + } } - - $control_values[$i] = $matches; } $forms_access[$id] = array(); @@ -246,7 +263,7 @@ function getFormsAccessMatrix($arm, $record = null) { $access = false; foreach ($target_forms[$event_id][$form] as $i) { - if ($control_values[$i]) { + if ($control_values[$i][$event_id]) { // If one condition is satisfied, the form // should be displayed. $access = true; @@ -260,6 +277,7 @@ function getFormsAccessMatrix($arm, $record = null) { } } + self::$accessMatrix = $forms_access; return $forms_access; } @@ -282,9 +300,8 @@ function getFormsAccessMatrix($arm, $record = null) { protected function loadFRSL($location, $record = null, $event_id = null, $instrument = null) { global $Proj; - $arm = $event_id ? $Proj->eventInfo[$event_id]['arm_num'] : $this->getNumericQueryParam('arm', 1); $next_step_path = ''; - $forms_access = $this->getFormsAccessMatrix($arm, $record); + $forms_access = $this->getFormsAccessMatrix($event_id, $record); if ($record && $event_id && $instrument) { $instruments = $Proj->eventsForms[$event_id]; @@ -310,6 +327,7 @@ protected function loadFRSL($location, $record = null, $event_id = null, $instru // Access denied to the current page. if (!$forms_access[$record][$event_id][$instrument]) { if (!$next_step_path) { + $arm = $event_id ? $Proj->eventInfo[$event_id]['arm_num'] : $this->getNumericQueryParam('arm', 1); $next_step_path = APP_PATH_WEBROOT . 'DataEntry/record_home.php?pid=' . $Proj->project_id . '&id=' . $record . '&arm=' . $arm; } @@ -340,8 +358,7 @@ protected function loadFRSL($location, $record = null, $event_id = null, $instru protected function overrideSurveysStatuses($record, $event_id) { global $Proj; - $arm = $Proj->eventInfo[$event_id]['arm_num']; - $forms_access = $this->getFormsAccessMatrix($arm, $record); + $forms_access = $this->getFormsAccessMatrix($event_id, $record); foreach ($forms_access[$record][$event_id] as $form => $value) { if ($value || empty($Proj->forms[$form]['survey_id'])) { @@ -506,6 +523,42 @@ protected function _getFormattedSettings($settings, $values, $inherited_deltas = return $formatted; } + /** + * Auxiliary function to calculate condition. + */ + function _calculateCondition($a, $b, $op = '=') { + switch ($op) { + case '>': + return $a > $b; + case '>=': + return $a >= $b; + case '<': + return $a < $b; + case '<=': + return $a <= $b; + case '<>': + return $a !== $b; + } + + return $a === $b; + } + + /** + * Auxiliary function to get field data if exits. + */ + function _getDataIfExists($record, $event_id, $field_name, $data, $default = '') { + if (!isset($data[$event_id][$field_name])) { + return $default; + } + + global $Proj; + + if (!Records::formHasData($record, $Proj->metadata[$field_name]['form_name'], $event_id)) { + return $default; + } + + return $data[$event_id][$field_name]; + } /** * migrates stored module settings from v2.x.x to v3.x.x if needed. diff --git a/README.md b/README.md index 3031fc7..68ed6a8 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,9 @@ The top level entry in the configuration is a Control Field. A control field is Each control field can govern the display of a set of forms. You can define multiple control fields as long as each controls a separate set of forms. -Each control field can have multiple conditions. Each condition compares the control field to a string or number. If the condition evaluates as true, the forms listed under the condition will be displayed. If the condition is false and no other true condition displays them, the forms will be hidden. Be careful that the values in the conditions of a control field are mutually exclusive or the results could be unexpected. +Each control field can have multiple conditions. Each condition compares the control field to a string or number. If the condition evaluates as true, the forms listed under the condition will be displayed. If the condition is false and no other true condition displays them, the forms will be hidden. + +Obs.: if multiple conditions are applied to the same instrument, the form is displayed if *at least* one of the conditions is met. All forms _not_ named under a condition will be displayed at all times. Optionally, each condition can specify a list of events that restrict the behavior of this rule. diff --git a/config.json b/config.json index 446a30a..f89bbf8 100644 --- a/config.json +++ b/config.json @@ -70,14 +70,14 @@ ] }, { - "key": "control_event_id", + "key": "control_field_key", "name": "Field", - "type": "event-list" + "type": "field-list" }, { - "key": "control_field_key", + "key": "control_event_id", "name": "Field", - "type": "field-list" + "type": "event-list" }, { "key": "control_piping", diff --git a/css/config.css b/css/config.css index f91af39..4a9e60f 100644 --- a/css/config.css +++ b/css/config.css @@ -1,4 +1,4 @@ -#external-modules-configure-modal.frsl tr[field="control_field_key"], +#external-modules-configure-modal.frsl tr[field="control_event_id"], #external-modules-configure-modal.frsl tr[field="condition_value"] { position: absolute; right: 10000px; diff --git a/js/config.js b/js/config.js index 217bbb5..e006650 100644 --- a/js/config.js +++ b/js/config.js @@ -66,7 +66,7 @@ $(document).ready(function() { $(selectorShow).parent().parent().show(); $(selectorHide).parent().parent().hide(); - place2ndColumnField($('[name="control_field_key' + suffix + '"]').parent().parent()); + place2ndColumnField($('[name="control_event_id' + suffix + '"]').parent().parent()); }; var $checkboxes = $modal.find('tr[field="target_events_select"] .external-modules-input-element'); From 0daa057c7fc50be6ee4fcb8d44ea5a301f055101 Mon Sep 17 00:00:00 2001 From: Tiago Bember Simeao Date: Mon, 30 Jul 2018 11:04:00 -0400 Subject: [PATCH 23/30] Defining prefix constant to make it available to other modules. --- ExternalModule.php | 9 ++++++++- config.json | 1 + 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/ExternalModule.php b/ExternalModule.php index 04fd53c..d311fd0 100644 --- a/ExternalModule.php +++ b/ExternalModule.php @@ -25,7 +25,14 @@ * ExternalModule class for REDCap Form Render Skip Logic. */ class ExternalModule extends AbstractExternalModule { - protected static $accessMatrix; + static protected $accessMatrix; + + /** + * @inheritdoc + */ + function redcap_every_page_before_render($project_id) { + define('FORM_RENDER_SKIP_LOGIC_PREFIX', $this->PREFIX); + } /** * @inheritdoc diff --git a/config.json b/config.json index f89bbf8..32e6381 100644 --- a/config.json +++ b/config.json @@ -3,6 +3,7 @@ "namespace": "FormRenderSkipLogic\\ExternalModule", "description": "This module hides and shows instruments based on the values of REDCap form fields. Multiple control fields can be defined to control the display of non-overlapping sets of forms.", "permissions": [ + "redcap_every_page_before_render", "redcap_every_page_top", "redcap_data_entry_form_top", "redcap_survey_page_top", From 5752465d22ca812f2f9aa046abb9ef3ee9d1e51e Mon Sep 17 00:00:00 2001 From: Tiago Bember Simeao Date: Mon, 30 Jul 2018 11:08:57 -0400 Subject: [PATCH 24/30] Adding missing default value for param. --- ExternalModule.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ExternalModule.php b/ExternalModule.php index d311fd0..a5219a0 100644 --- a/ExternalModule.php +++ b/ExternalModule.php @@ -126,7 +126,7 @@ function redcap_module_system_enable($version) { * -- event ID * --- instrument name: TRUE/FALSE */ - function getFormsAccessMatrix($event_id = null, $record) { + function getFormsAccessMatrix($event_id = null, $record = null) { if (isset(self::$accessMatrix)) { return self::$accessMatrix; } From a9597659e7dc6a5704f844cb0f259cf33ff64455 Mon Sep 17 00:00:00 2001 From: Tiago Bember Simeao Date: Wed, 1 Aug 2018 15:48:20 -0400 Subject: [PATCH 25/30] Fixing method to process Advanced mode. --- ExternalModule.php | 157 +++++++++++++++++---------------------------- 1 file changed, 59 insertions(+), 98 deletions(-) diff --git a/ExternalModule.php b/ExternalModule.php index a5219a0..98e8a12 100644 --- a/ExternalModule.php +++ b/ExternalModule.php @@ -51,7 +51,7 @@ function redcap_every_page_top($project_id) { } $location = substr(PAGE, 10, strlen(PAGE) - 14); - $this->loadFRSL($location, $this->getNumericQueryParam('id')); + $this->loadFRSL($location, $this->getQueryParam('id')); } /** @@ -59,7 +59,7 @@ function redcap_every_page_top($project_id) { */ function redcap_data_entry_form_top($project_id, $record = null, $instrument, $event_id, $group_id = null) { if (empty($record)) { - $record = $this->getNumericQueryParam('id'); + $record = $this->getQueryParam('id'); } $this->loadFRSL('data_entry_form', $record, $event_id, $instrument); @@ -70,7 +70,7 @@ function redcap_data_entry_form_top($project_id, $record = null, $instrument, $e */ function redcap_survey_page_top($project_id, $record = null, $instrument, $event_id, $group_id = null, $survey_hash, $response_id = null, $repeat_instance = 1) { if (empty($record)) { - $record = $this->getNumericQueryParam('id'); + $record = $this->getQueryParam('id'); } $this->overrideSurveysStatuses($record, $event_id); @@ -138,45 +138,47 @@ function getFormsAccessMatrix($event_id = null, $record = null) { } else { // Getting events of the current arm. - $arm = $event_id ? $Proj->eventInfo[$event_id]['arm_num'] : $this->getNumericQueryParam('arm', 1); + $arm = $event_id ? $Proj->eventInfo[$event_id]['arm_num'] : $this->getQueryParam('arm', 1); $events = array_keys($Proj->events[$arm]['events']); } - $target_forms = array(); $settings = $this->getFormattedSettings($Proj->project_id); + $events_names = $Proj->getUniqueEventNames(); - $control_fields = array(); - $control_fields_keys = array($Proj->table_pk); + $controls = array(); + $fields_utilized = array($Proj->table_pk); - $i = 0; - foreach ($settings['control_fields'] as $cf) { + $target_forms = array(); + foreach ($settings['control_fields'] as $i => $cf) { if ($cf['control_mode'] == 'default') { + // Checking for required fields in default mode. if (!$cf['control_field_key']) { - // Checking for required fields in default mode. continue; } - $control_fields_keys[] = $cf['control_field_key']; + $controls[$i] = array('type' => 'default', 'field' => $cf['control_field_key'], 'event' => $cf['control_event_id']); + $fields_utilized[] = $cf['control_field_key']; } - - if ($cf['control_mode'] == 'advanced' && !$cf['control_piping']) { + elseif ($cf['control_mode'] == 'advanced') { // Checking for required fields in advanced mode. - continue; - } + if (!$cf['control_piping']) { + continue; + } - if (empty($cf['control_default_value']) && !is_numeric($cf['control_default_value'])) { - $cf['control_default_value'] = ''; + $controls[$i] = array('type' => 'advanced', 'logic' => $cf['control_piping']); + $fields_utilized = array_merge($fields_utilized, array_keys(getBracketedFields($cf['control_piping'], true, true, true))); + } + else { + continue; } - $branching_logic = $cf['branching_logic']; - unset($cf['branching_logic']); + $control[$i]['default'] = $cf['control_default_value']; - foreach ($branching_logic as $bl) { + foreach ($cf['branching_logic'] as $bl) { if (empty($bl['target_forms'])) { continue; } - $control_fields[$i] = $cf + $bl; $target_events = $bl['target_events_select'] ? array_intersect($bl['target_events'], $events) : $events; foreach ($target_events as $event_id) { @@ -189,79 +191,57 @@ function getFormsAccessMatrix($event_id = null, $record = null) { $target_forms[$event_id][$form] = array(); } - $target_forms[$event_id][$form][] = $i; + $target_forms[$event_id][$form][] = array( + 'a' => $i, + 'b' => $bl['condition_value'], + 'op' => empty($bl['condition_operator']) ? '=' : $bl['condition_operator'], + ); } } - - $i++; } } - $control_data = REDCap::getData($Proj->project_id, 'array', $record, $control_field_keys, $events); + $control_data = REDCap::getData($Proj->project_id, 'array', $record, $fields_utilized, null, null, + false, false, false, false, false, false, false, false, false, array(), + false, false, false, false, false, false, 'EVENT', false, false, true); + if ($record && !isset($control_data[$record])) { // Handling new record case. - $control_data = array($record => array()); + $data = array_combine(array_keys($Proj->metadata), array_fill(0, count($Proj->metadata), '')); + $data = array_combine(array_keys($Proj->eventInfo), array_fill(0, count($Proj->eventInfo), $data)); + + $control_data = array($record => $data); } // Building forms access matrix. $forms_access = array(); foreach ($control_data as $id => $data) { - $control_values = array(); - - foreach ($control_fields as $i => $cf) { - $b = $cf['condition_value']; - $control_values[$i] = array(); - - if ($cf['control_mode'] == 'advanced') { - // On advanced mode, it is required to run Piping for each - // event in order to handle relative variables. - foreach ($events as $ev) { - $a = $cf['control_default_value']; + $forms_access[$id] = array(); - $piped = Piping::pipeSpecialTags($cf['control_piping'], $Proj->project_id, $id, $ev, null, null, true); - $piped = Piping::replaceVariablesInLabel($piped, $id, $ev, 1, array(), false); + foreach ($events as $event_id) { + $forms_access[$id][$event] = array(); - if ($piped !== '') { - $piped = Calculate::formatCalcToPHP($piped); + // Calculating the control values for the current record and + // current event. + foreach ($controls as $i => $control) { + $controls[$i]['value'] = $controls[$i]['default']; - // The trick here is to enable Piping with span - // wrappers and then replace them with quotes, so - // the strings (empty or not) will properly be - // quoted in the formula. - $piped = preg_replace('/]*piping_receiver[^>]*>/', '"', str_replace('', '"', $piped)); - $piped = strval(LogicTester::evaluateCondition($piped)); + if ($control['type'] == 'default') { + // Getting 1st operand for default mode. + $source_event = empty($control['event']) ? $event_id : $control['event']; - if ($piped !== '') { - $a = $piped; - } + if (isset($data[$source_event][$control['field']])) { + $controls[$i]['value'] = $data[$source_event][$control['field']]; } - - $control_values[$i][$ev] = $this->_calculateCondition($a, $b, $cf['condition_operator']); - } - } - else { - $fd = $cf['control_field_key']; - - if ($ev = $cf['control_event_id']) { - $a = $this->_getDataIfExists($id, $ev, $fd, $data, $cf['control_default_value']); - $matches = $this->_calculateCondition($a, $b, $cf['condition_operator']); - $control_values[$i] = array_combine($events, array_fill(0, count($events), $matches)); } else { - // If event has not been specified, we need to get the - // the control field for each event. - foreach ($events as $ev) { - $a = $this->_getDataIfExists($id, $ev, $fd, $data, $cf['control_default_value']); - $control_values[$i][$ev] = $this->_calculateCondition($a, $b, $cf['condition_operator']); - } + $logic = Piping::pipeSpecialTags($control['logic'], $Proj->project_id, $id, $event_id, 1, null, true); + $logic = Calculate::formatCalcToPHP($logic, $Proj); + $logic = LogicTester::logicPrependEventName($logic, $events_names[$event_id]); + + $controls[$i]['value'] = (string) LogicTester::evaluateCondition($logic, $data); } } - } - - $forms_access[$id] = array(); - - foreach ($events as $event_id) { - $forms_access[$id][$event] = array(); foreach ($Proj->eventsForms[$event_id] as $form) { $access = true; @@ -269,10 +249,8 @@ function getFormsAccessMatrix($event_id = null, $record = null) { if (isset($target_forms[$event_id][$form])) { $access = false; - foreach ($target_forms[$event_id][$form] as $i) { - if ($control_values[$i][$event_id]) { - // If one condition is satisfied, the form - // should be displayed. + foreach ($target_forms[$event_id][$form] as $cond) { + if ($this->_calculateCondition($controls[$cond['a']]['value'], $cond['b'], $cond['op'])) { $access = true; break; } @@ -334,7 +312,7 @@ protected function loadFRSL($location, $record = null, $event_id = null, $instru // Access denied to the current page. if (!$forms_access[$record][$event_id][$instrument]) { if (!$next_step_path) { - $arm = $event_id ? $Proj->eventInfo[$event_id]['arm_num'] : $this->getNumericQueryParam('arm', 1); + $arm = $event_id ? $Proj->eventInfo[$event_id]['arm_num'] : $this->getQueryParam('arm', 1); $next_step_path = APP_PATH_WEBROOT . 'DataEntry/record_home.php?pid=' . $Proj->project_id . '&id=' . $record . '&arm=' . $arm; } @@ -404,7 +382,7 @@ function getFormattedSettings($project_id = null) { } /** - * Gets numaric URL query parameter. + * Gets URL query parameter. * * @param string $param * The parameter name @@ -415,8 +393,8 @@ function getFormattedSettings($project_id = null) { * The parameter from URL if available. The default value provided is * returned otherwise. */ - function getNumericQueryParam($param, $default = null) { - return empty($_GET[$param]) || !is_numeric($_GET[$param]) ? $default : $_GET[$param]; + function getQueryParam($param, $default = null) { + return empty($_GET[$param]) ? $default : $_GET[$param]; } /** @@ -550,23 +528,6 @@ function _calculateCondition($a, $b, $op = '=') { return $a === $b; } - /** - * Auxiliary function to get field data if exits. - */ - function _getDataIfExists($record, $event_id, $field_name, $data, $default = '') { - if (!isset($data[$event_id][$field_name])) { - return $default; - } - - global $Proj; - - if (!Records::formHasData($record, $Proj->metadata[$field_name]['form_name'], $event_id)) { - return $default; - } - - return $data[$event_id][$field_name]; - } - /** * migrates stored module settings from v2.x.x to v3.x.x if needed. */ From 001a68ebb7bb78702af5d3e376092b06b3be5d43 Mon Sep 17 00:00:00 2001 From: Tiago Bember Simeao Date: Thu, 2 Aug 2018 14:02:02 -0400 Subject: [PATCH 26/30] Handling conflicts of equations with empty smart variables. --- ExternalModule.php | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/ExternalModule.php b/ExternalModule.php index 98e8a12..0d72ed3 100644 --- a/ExternalModule.php +++ b/ExternalModule.php @@ -213,6 +213,8 @@ function getFormsAccessMatrix($event_id = null, $record = null) { $control_data = array($record => $data); } + $fake_field = uniqid('frsl_aux_'); + // Building forms access matrix. $forms_access = array(); foreach ($control_data as $id => $data) { @@ -235,10 +237,17 @@ function getFormsAccessMatrix($event_id = null, $record = null) { } } else { - $logic = Piping::pipeSpecialTags($control['logic'], $Proj->project_id, $id, $event_id, 1, null, true); + $logic = Piping::pipeSpecialTags(str_replace("''", '""', $control['logic']), $Proj->project_id, $id, $event_id, 1, null, true); + + // If a smart variable is empty, it is converted into + // a dummy wildcard so REDCap calculation will handle + // it properly. + $logic = str_replace("''", '[' . $fake_field . ']', $logic); + $logic = Calculate::formatCalcToPHP($logic, $Proj); $logic = LogicTester::logicPrependEventName($logic, $events_names[$event_id]); + $data[$event_id] += array($fake_field => ''); $controls[$i]['value'] = (string) LogicTester::evaluateCondition($logic, $data); } } From 0d446407e9acb829120e16762cf845118eed7f60 Mon Sep 17 00:00:00 2001 From: Tiago Bember Simeao Date: Thu, 2 Aug 2018 15:27:12 -0400 Subject: [PATCH 27/30] Adding comments to the complex parts. --- ExternalModule.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/ExternalModule.php b/ExternalModule.php index 0d72ed3..4eccaa3 100644 --- a/ExternalModule.php +++ b/ExternalModule.php @@ -213,6 +213,8 @@ function getFormsAccessMatrix($event_id = null, $record = null) { $control_data = array($record => $data); } + // This field will be used to avoid conflicts between empty smart vars + // piping and formulas calculation. $fake_field = uniqid('frsl_aux_'); // Building forms access matrix. @@ -237,7 +239,10 @@ function getFormsAccessMatrix($event_id = null, $record = null) { } } else { - $logic = Piping::pipeSpecialTags(str_replace("''", '""', $control['logic']), $Proj->project_id, $id, $event_id, 1, null, true); + // Ensuring that only smart vars piping will produce + // single quoted null values (''). + $logic = str_replace("''", '""', $control['logic']); + $logic = Piping::pipeSpecialTags($logic, $Proj->project_id, $id, $event_id, 1, null, true); // If a smart variable is empty, it is converted into // a dummy wildcard so REDCap calculation will handle From b76fc99154741306840366eb0e151bb32fa1cfe5 Mon Sep 17 00:00:00 2001 From: Tiago Bember Simeao Date: Thu, 2 Aug 2018 15:35:30 -0400 Subject: [PATCH 28/30] Escaping return of getQueryParam(). --- ExternalModule.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ExternalModule.php b/ExternalModule.php index 4eccaa3..aee7720 100644 --- a/ExternalModule.php +++ b/ExternalModule.php @@ -408,7 +408,7 @@ function getFormattedSettings($project_id = null) { * returned otherwise. */ function getQueryParam($param, $default = null) { - return empty($_GET[$param]) ? $default : $_GET[$param]; + return empty($_GET[$param]) ? $default : REDCap::escapeHtml($_GET[$param]); } /** From 4120ade38cb66c07097ba6f9eecc64a450111473 Mon Sep 17 00:00:00 2001 From: Philip Chase Date: Wed, 8 Aug 2018 17:02:11 -0400 Subject: [PATCH 29/30] Add Zenodo DOI to README --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 68ed6a8..44f5733 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # REDCap Form Render Skip Logic (FRSL) +[![DOI](https://zenodo.org/badge/97271445.svg)](https://zenodo.org/badge/latestdoi/97271445) + This REDCap module hides and shows instruments based on the values of REDCap form fields i.e. a branching logic for instruments. ## Motivation From 40df03afd434e595405ab3429857923a3afd15d5 Mon Sep 17 00:00:00 2001 From: Philip Chase Date: Wed, 8 Aug 2018 17:05:18 -0400 Subject: [PATCH 30/30] Update Changelog for release 3.2.0 --- CHANGELOG.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b03b07a..8339dfd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,11 +2,13 @@ All notable changes to the Form Render Skip Logic module will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). -## [3.2.0] - 2018-07-30 +## [3.2.0] - 2018-08-08 ### Added -- Added support for migrating FRSL v2.x.x configurations to FRSL v3.x.x configurations automatically (Dileep Rajput) -- Added support for equations on Advanced control mode (Tiago Bember Simeao) -- Added support to event-relative control fields (Tiago Bember Simeao) +- Add support for migrating FRSL v2.x.x configurations to FRSL v3.x.x configurations automatically (Dileep Rajput) +- Add support for equations on Advanced control mode (Tiago Bember Simeao) +- Add support to event-relative control fields (Tiago Bember Simeao) +- Add Zenodo DOI to README (Philip Chase) + ## [3.1.1] - 2018-06-04 ### Changed