Fix input type for smarty number formatting
authorColeman Watts <coleman@civicrm.org>
Sat, 8 Jan 2022 22:10:02 +0000 (17:10 -0500)
committerColeman Watts <coleman@civicrm.org>
Sun, 9 Jan 2022 22:21:37 +0000 (17:21 -0500)
Some smarty templates pass NULL to crmMoney, so it needs to handle that possibilty

CRM/Core/Smarty/plugins/modifier.crmMoney.php
Civi/Core/Format.php

index cc403067890f4b5fe5b15f5a7f06fabaeee92497..ec5a6a93b6f485d4ef0d9f19ddf0d39689c28869 100644 (file)
@@ -18,7 +18,7 @@
 /**
  * Format the given monetary amount (and currency) for display
  *
- * @param float $amount
+ * @param string|int|float $amount
  *   The monetary amount up for display.
  * @param string|null $currency
  *   The (optional) currency.
index 52d85865a4baebc01e1330e3d3b10a47d6490454..2ea33946ad2b7bf104f876dae0ed6eb6e81cc5aa 100644 (file)
@@ -23,7 +23,7 @@ class Format {
   /**
    * Get formatted money
    *
-   * @param string $amount
+   * @param string|int|float $amount
    * @param string|null $currency
    *   Currency, defaults to site currency if not provided.
    * @param string|null $locale
@@ -33,7 +33,15 @@ class Format {
    * @noinspection PhpDocMissingThrowsInspection
    * @noinspection PhpUnhandledExceptionInspection
    */
-  public function money(string $amount, ?string $currency = NULL, ?string $locale = NULL): string {
+  public function money($amount, ?string $currency = NULL, ?string $locale = NULL): string {
+    // Empty value => empty string
+    if (is_null($amount) || $amount === '' || $amount === FALSE) {
+      return '';
+    }
+    // Verify the amount is a number or numeric string/object
+    elseif ($amount === TRUE || !is_numeric((string) $amount)) {
+      throw new \CRM_Core_Exception('Invalid value for type money');
+    }
     if (!$currency) {
       $currency = Civi::settings()->get('defaultCurrency');
     }