Afform - Ensure container elements like <div> always have #children even if empty
authorColeman Watts <coleman@civicrm.org>
Mon, 24 Oct 2022 02:51:13 +0000 (22:51 -0400)
committerColeman Watts <coleman@civicrm.org>
Mon, 24 Oct 2022 02:51:13 +0000 (22:51 -0400)
ext/afform/core/CRM/Afform/ArrayHtml.php
ext/afform/core/tests/phpunit/Civi/Afform/AfformGetTest.php

index 44eec67092b702e60291d11f3cf12d11fa9f80fb..2425de090a2c0dbd11487878777fa98c3ff06dba 100644 (file)
@@ -236,6 +236,10 @@ class CRM_Afform_ArrayHtml {
           $arr['#children'] = $this->convertNodesToArray($node->childNodes);
         }
       }
+      // Empty containers should still get a #children attribute
+      elseif (in_array($node->tagName, ['div', 'fieldset'], TRUE)) {
+        $arr['#children'] = [];
+      }
       return $arr;
     }
     elseif ($node instanceof DOMText) {
index 3218f02869556f6937c5cdcd472e2be36fb6a6f5..f84eae063d1588dd712e9de4e709e4e02d67657d 100644 (file)
@@ -55,6 +55,22 @@ class AfformGetTest extends \PHPUnit\Framework\TestCase implements HeadlessInter
     $this->assertArrayNotHasKey('base_module', $result);
   }
 
+  public function testGetLayoutWithEmptyNode() {
+    Afform::create(FALSE)
+      ->addValue('name', $this->formName)
+      ->addValue('title', 'Test Form')
+      ->addValue('layout', '<af-form><af-entity name="a"></af-entity><div></div></af-form>')
+      ->execute();
+
+    $layout = Afform::get(FALSE)
+      ->addWhere('name', '=', $this->formName)
+      ->execute()->single()['layout'];
+
+    // Ensure container elements like <div> always have #children even if empty
+    $this->assertEquals([], $layout[0]['#children'][1]['#children']);
+    $this->assertArrayNotHasKey('#children', $layout[0]['#children'][0]);
+  }
+
   public function testAfformAutocomplete(): void {
     $title = uniqid();
     Afform::create()