Civi::url() - Add support for vars
authorTim Otten <totten@civicrm.org>
Fri, 21 Jul 2023 05:20:41 +0000 (22:20 -0700)
committerTim Otten <totten@civicrm.org>
Mon, 24 Jul 2023 08:12:30 +0000 (01:12 -0700)
Civi.php
Civi/Core/Url.php

index 83a264cb942ad5a5543b43185aedbb333a587ac2..c2a025d38eebdc528e9bf8d91efb6561ac99208c 100644 (file)
--- a/Civi.php
+++ b/Civi.php
@@ -247,6 +247,10 @@ class Civi {
    * Ex: Link to a static asset (resource-file) in an extension.
    *   $url = Civi::url('ext://org.civicrm.search_kit/css/crmSearchTasks.css');
    *
+   * Ex: Link with variable substitution
+   *   $url = Civi::url('frontend://civicrm/ajax/api4/[entity]/[action]')
+   *      ->addVars(['entity' => 'Foo', 'action' => 'bar']);
+   *
    * NOTE: CiviCRM is integrated into many environments, and they handle URL-construction different ways.
    * For example, in Joomla+WordPress, there are separate sub-applications for the public-facing
    * frontend UI (`/`) and the staff-facing backend UI (`/wp-admin/` or `/administrator/`) -- each follows
index 5bcb72dc5f188589a113321d86a28e960d2ac41b..6e9a1e0a47da82e282bf52658450d701f7cc576f 100644 (file)
@@ -64,6 +64,13 @@ final class Url {
    */
   private $ssl = NULL;
 
+  /**
+   * List of values to mix-in to the final/rendered URL.
+   *
+   * @var string[]|null
+   */
+  private $vars;
+
   /**
    * @param string $logicalUri
    * @param string|null $flags
@@ -237,6 +244,31 @@ final class Url {
     return $this;
   }
 
+  /**
+   * @return string[]|null
+   */
+  public function getVars(): ?array {
+    return $this->vars;
+  }
+
+  /**
+   * @param string[]|null $vars
+   */
+  public function setVars(?array $vars): Url {
+    $this->vars = $vars;
+    return $this;
+  }
+
+  /**
+   * @param string[] $vars
+   *
+   * @return $this
+   */
+  public function addVars(array $vars): Url {
+    $this->vars = array_merge($this->vars ?: [], $vars);
+    return $this;
+  }
+
   /**
    * @param string $flags
    *   A series of flag-letters. Any of the following:
@@ -339,6 +371,14 @@ final class Url {
       $result = 'http:' . substr($result, 6);
     }
 
+    if ($this->vars !== NULL) {
+      // Replace variables
+      $result = preg_replace_callback('/\[(\w+)\]/', function($m) {
+        $var = $m[1];
+        return isset($this->vars[$var]) ? urlencode($this->vars[$var]) : "[$var]";
+      }, $result);
+    }
+
     return $this->htmlEscape ? htmlentities($result) : $result;
   }