(REF) CRM_Utils_Array - Add pathSync() helper
authorTim Otten <totten@civicrm.org>
Tue, 28 Sep 2021 21:32:39 +0000 (14:32 -0700)
committerTim Otten <totten@civicrm.org>
Tue, 28 Sep 2021 22:26:08 +0000 (15:26 -0700)
CRM/Utils/Array.php

index bbc931c38f91e27c54393b4f359c6dfdd1b164f3..f507f7978b8d382a5707b3f327b6587a4c8ee302 100644 (file)
@@ -1167,6 +1167,38 @@ class CRM_Utils_Array {
     }
   }
 
+  /**
+   * Attempt to synchronize or fill aliased items.
+   *
+   * If $canonPath is set, copy to $altPath; or...
+   * If $altPath is set, copy to $canonPath.
+   *
+   * @param array $params
+   *   Data-tree
+   * @param string[] $canonPath
+   *   Preferred path
+   * @param string[] $altPath
+   *   Old/alternate/deprecated path.
+   * @param callable|null $filter
+   *   Optional function to filter the value as it passes through (canonPath=>altPath or altPath=>canonPath).
+   *   function(mixed $v, bool $isCanon): mixed
+   */
+  public static function pathSync(&$params, $canonPath, $altPath, ?callable $filter = NULL) {
+    $MISSING = new \stdClass();
+
+    $v = static::pathGet($params, $canonPath, $MISSING);
+    if ($v !== $MISSING) {
+      static::pathSet($params, $altPath, $filter ? $filter($v, TRUE) : $v);
+      return;
+    }
+
+    $v = static::pathGet($params, $altPath, $MISSING);
+    if ($v !== $MISSING) {
+      static::pathSet($params, $canonPath, $filter ? $filter($v, FALSE) : $v);
+      return;
+    }
+  }
+
   /**
    * Convert a simple dictionary into separate key+value records.
    *