Afform - Add modified_date
authorcolemanw <coleman@civicrm.org>
Thu, 19 Oct 2023 13:32:01 +0000 (09:32 -0400)
committercolemanw <coleman@civicrm.org>
Mon, 6 Nov 2023 20:16:18 +0000 (15:16 -0500)
ext/afform/core/CRM/Afform/AfformScanner.php
ext/afform/core/Civi/Api4/Afform.php
ext/afform/core/tests/phpunit/Civi/Afform/AfformGetTest.php

index b93b54d21ed751adc54a2db3004fbeebbc33e242..b965765c5770d961b2679c7519cceed9d2ec561c 100644 (file)
@@ -141,6 +141,7 @@ class CRM_Afform_AfformScanner {
    */
   public function getMeta(string $name, bool $getLayout = FALSE): ?array {
     $defn = [];
+    $mtime = NULL;
 
     $jsonFile = $this->findFilePath($name, self::METADATA_JSON);
     $htmlFile = $this->findFilePath($name, self::LAYOUT_FILE);
@@ -149,15 +150,18 @@ class CRM_Afform_AfformScanner {
     // Json takes priority because local overrides are always saved in that format.
     if ($jsonFile !== NULL) {
       $defn = json_decode(file_get_contents($jsonFile), 1);
+      $mtime = filemtime($jsonFile);
     }
     // Extensions may provide afform definitions in php files
     else {
       $phpFile = $this->findFilePath($name, self::METADATA_PHP);
       if ($phpFile !== NULL) {
         $defn = include $phpFile;
+        $mtime = filemtime($phpFile);
       }
     }
     if ($htmlFile !== NULL) {
+      $mtime = max($mtime, filemtime($htmlFile));
       if ($getLayout) {
         // If the defn file included a layout, the html file overrides
         $defn['layout'] = file_get_contents($htmlFile);
@@ -168,6 +172,7 @@ class CRM_Afform_AfformScanner {
       return NULL;
     }
     $defn['name'] = $name;
+    $defn['modified_date'] = date('Y-m-d H:i:s', $mtime);
     return $defn;
   }
 
index 214ed88e5a6c7b6c501b10ed5c803eac42f550d1..cac1f9f799374c5290fe8f82922979c01ecc76c7 100644 (file)
@@ -243,6 +243,12 @@ class Afform extends Generic\AbstractEntity {
           'data_type' => 'Array',
           'description' => 'HTML form layout; format is controlled by layoutFormat param',
         ],
+        [
+          'name' => 'modified_date',
+          'title' => E::ts('Date Modified'),
+          'data_type' => 'Timestamp',
+          'readonly' => TRUE,
+        ],
       ];
       // Calculated fields returned by get action
       if ($self->getAction() === 'get') {
index fa5766e857bd03cf5419ebe97adda40ac6cb8ebf..2478ea0695d2953faee8ae4c584c42fe02074ffc 100644 (file)
@@ -34,6 +34,10 @@ class AfformGetTest extends \PHPUnit\Framework\TestCase implements HeadlessInter
     $this->assertEquals($this->formName, $result['name']);
     $this->assertArrayNotHasKey('directive_name', $result);
     $this->assertArrayNotHasKey('has_base', $result);
+    // Check modified date is reasonable
+    $this->assertGreaterThan('2023-01-01 12:00:00', $result['modified_date']);
+    // Hopefully this test won't need updating for the next 2000 years or so...
+    $this->assertLessThan('4000-01-01 12:00:00', $result['modified_date']);
 
     // Select * should also return regular fields only
     $result = Afform::get()