From 10f465e3eba9edd41171bd81c7d00aa81b9df340 Mon Sep 17 00:00:00 2001 From: Ryan Cramer Date: Fri, 23 Oct 2020 11:12:15 -0400 Subject: [PATCH] Fix issue processwire/processwire-issues#1258 --- .../Process/ProcessField/ProcessField.module | 29 ++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/wire/modules/Process/ProcessField/ProcessField.module b/wire/modules/Process/ProcessField/ProcessField.module index 27c1d315..28cd7237 100644 --- a/wire/modules/Process/ProcessField/ProcessField.module +++ b/wire/modules/Process/ProcessField/ProcessField.module @@ -2065,6 +2065,33 @@ class ProcessField extends Process implements ConfigurableModule { return $allowed; } + /** + * Compare two diff context arrays and return the differences + * + * @param array $a1 + * @param array $a2 + * @return array + * + */ + protected function diffContextArray(array $a1, array $a2) { + $diff = array(); + foreach($a1 as $k => $v) { + if(is_array($v)) { + if(!isset($a2[$k]) || !is_array($a2[$k])) { + $diff[$k] = $v; + } else { + $_diff = $this->diffContextArray($v, $a2[$k]); + if(count($_diff)) $diff[$k] = $_diff; + } + } else if(!array_key_exists($k, $a2)) { + $diff[$k] = $v; + } else if($a2[$k] !== $v) { + $diff[$k] = $v; + } + } + return $diff; + } + /** * Save field in the context of a fieldgroup only * @@ -2077,7 +2104,7 @@ class ProcessField extends Process implements ConfigurableModule { $this->fields->saveFieldgroupContext($this->field, $this->fieldgroup, $this->contextNamespace); $this->saveRemoveOverrides(); $newContextArray = $this->fieldgroup->getFieldContextArray($this->field->id); - $diffContextArray = array_diff_assoc($newContextArray, $oldContextArray); + $diffContextArray = $this->diffContextArray($newContextArray, $oldContextArray); if(count($diffContextArray)) { $this->fieldChangedContext($this->field, $this->fieldgroup, $diffContextArray); }