From b1454b31a4ae10f943fdce63b849f905b18afdd5 Mon Sep 17 00:00:00 2001 From: Ryan Cramer Date: Wed, 7 Mar 2018 08:11:42 -0500 Subject: [PATCH] Add ProcessField detection for invalid Page field showIf/requiredIf dependencies per processwire/processwire-issues#509 --- .../Process/ProcessField/ProcessField.module | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/wire/modules/Process/ProcessField/ProcessField.module b/wire/modules/Process/ProcessField/ProcessField.module index be9ae340..073aae66 100644 --- a/wire/modules/Process/ProcessField/ProcessField.module +++ b/wire/modules/Process/ProcessField/ProcessField.module @@ -1836,6 +1836,10 @@ class ProcessField extends Process implements ConfigurableModule { if($name == 'name' && (!$this->field->id || $value !== $this->field->name)) { if(!$this->isAllowedName($value)) continue; } + + if(($name == 'showIf' || $name == 'requiredIf') && strlen($value)) { + $this->checkInputfieldDependencySetting($inputfield); + } $this->field->set($name, $value); @@ -1869,6 +1873,36 @@ class ProcessField extends Process implements ConfigurableModule { } } + /** + * Check a showIf or requiredIf setting for potential problems + * + * @param Inputfield $inputfield Inputfield containing the setting (showIf/requiredIf) + * + */ + protected function checkInputfieldDependencySetting(Inputfield $inputfield) { + $label = sprintf($this->_('Error in setting ā€œ%sā€'), $inputfield->getSetting('label')); + $value = $inputfield->attr('value'); + $valueLabel = ' ' . sprintf($this->_('(you specified ā€œ%sā€)'), $value); + if(empty($value)) return; + try { + $selectors = new Selectors($value); + } catch(\Exception $e) { + $this->error("$label - " . $this->_('Unable to validate') . $valueLabel); + return; + } + foreach($selectors as $selector) { + foreach($selector->fields() as $f) { + if(strpos($f, '.')) continue; + if(!strlen($selector->value())) continue; + $f = $this->wire('fields')->get($f); + if(!$f || !$f->type instanceof FieldtypePage) continue; + $v = implode('', $selector->values()); + if(ctype_digit("$v")) continue; // validates + $this->error("$label - " . $this->_('This will not work because values must be page IDs') . $valueLabel); + } + } + } + /** * Saves the submitted checkboxes from the "Overrides" tab *