From d37a188f145798b2b206554a96f3f2ac22eeb72f Mon Sep 17 00:00:00 2001 From: Tim Otten Date: Thu, 24 Oct 2019 20:57:34 -0700 Subject: [PATCH] HTMLInputCoder - Add more variants for encoding arrays --- CRM/Utils/API/HTMLInputCoder.php | 68 +++++++++++++++++++++++++++++++- 1 file changed, 66 insertions(+), 2 deletions(-) diff --git a/CRM/Utils/API/HTMLInputCoder.php b/CRM/Utils/API/HTMLInputCoder.php index c0f5cdecc8..4c69f64bb8 100644 --- a/CRM/Utils/API/HTMLInputCoder.php +++ b/CRM/Utils/API/HTMLInputCoder.php @@ -146,7 +146,39 @@ class CRM_Utils_API_HTMLInputCoder extends CRM_Utils_API_AbstractFieldCoder { } } elseif ($castToString || is_string($values)) { - $values = str_replace(['<', '>'], ['<', '>'], $values); + $values = $this->encodeValue($values); + } + } + + public function encodeValue($value) { + return str_replace(['<', '>'], ['<', '>'], $value); + } + + /** + * Perform in-place decode on strings (in a list of records). + * + * @param array $rows + * Ex in: $rows[0] = ['first_name' => 'A&W']. + * Ex out: $rows[0] = ['first_name' => 'A&W']. + */ + public function encodeRows(&$rows) { + foreach ($rows as $rid => $row) { + $this->encodeRow($rows[$rid]); + } + } + + /** + * Perform in-place encode on strings (in a single record). + * + * @param array $row + * Ex in: ['first_name' => 'A&W']. + * Ex out: ['first_name' => 'A&W']. + */ + public function encodeRow(&$row) { + foreach ($row as $k => $v) { + if (is_string($v) && !$this->isSkippedField($k)) { + $row[$k] = $this->encodeValue($v); + } } } @@ -161,7 +193,39 @@ class CRM_Utils_API_HTMLInputCoder extends CRM_Utils_API_AbstractFieldCoder { } } elseif ($castToString || is_string($values)) { - $values = str_replace(['<', '>'], ['<', '>'], $values); + $values = $this->decodeValue($values); + } + } + + public function decodeValue($value) { + return str_replace(['<', '>'], ['<', '>'], $value); + } + + /** + * Perform in-place decode on strings (in a list of records). + * + * @param array $rows + * Ex in: $rows[0] = ['first_name' => 'A&W']. + * Ex out: $rows[0] = ['first_name' => 'A&W']. + */ + public function decodeRows(&$rows) { + foreach ($rows as $rid => $row) { + $this->decodeRow($rows[$rid]); + } + } + + /** + * Perform in-place decode on strings (in a single record). + * + * @param array $row + * Ex in: ['first_name' => 'A&W']. + * Ex out: ['first_name' => 'A&W']. + */ + public function decodeRow(&$row) { + foreach ($row as $k => $v) { + if (is_string($v) && !$this->isSkippedField($k)) { + $row[$k] = $this->decodeValue($v); + } } } -- 2.25.1