Afform.get - Return computed fields, `has_local` and `has_packaged`
authorTim Otten <totten@civicrm.org>
Tue, 10 Dec 2019 06:05:10 +0000 (22:05 -0800)
committerCiviCRM <info@civicrm.org>
Wed, 16 Sep 2020 02:13:20 +0000 (19:13 -0700)
ext/afform/core/CRM/Afform/AfformScanner.php
ext/afform/core/Civi/Api4/Action/Afform/Get.php
ext/afform/core/Civi/Api4/Afform.php
ext/afform/core/Civi/Api4/Utils/AfformSaveTrait.php
ext/afform/mock/tests/phpunit/api/v4/AfformTest.php

index 6a6c79734317455046e180c2ccc16664badf9b72..f0cc0f6f4d24308d196707c34619a60b73965cdc 100644 (file)
@@ -152,6 +152,21 @@ class CRM_Afform_AfformScanner {
     }
   }
 
+  public function getComputedFields($name) {
+    // Ex: $allPaths['viewIndividual'][0] == '/var/www/foo/afform/view-individual'].
+    $allPaths = $this->findFilePaths()[$name];
+    // $activeLayoutPath = $this->findFilePath($name, self::LAYOUT_FILE);
+    // $activeMetaPath = $this->findFilePath($name, self::METADATA_FILE);
+    $localLayoutPath = $this->createSiteLocalPath($name, self::LAYOUT_FILE);
+    $localMetaPath = $this->createSiteLocalPath($name, self::METADATA_FILE);
+
+    $fields = [];
+    $fields['has_local'] = file_exists($localLayoutPath) || file_exists($localMetaPath);
+    $fields['has_packaged'] = ($fields['has_local'] && count($allPaths) > 1)
+      || (!$fields['has_local'] && count($allPaths) > 0);
+    return $fields;
+  }
+
   /**
    * @param string $formName
    *   Ex: 'view-individual'
index 92d5df45644d43fd24b144b71a5bf8e384a16f79..13288cc7394bbbb9f4d8467f684ad20d30b9fdcb 100644 (file)
@@ -19,6 +19,7 @@ class Get extends \Civi\Api4\Generic\BasicGetAction {
     $values = [];
     foreach ($names as $name) {
       $record = $scanner->getMeta($name);
+      $record = array_merge($record, $scanner->getComputedFields($name));
       $layout = $this->_isFieldSelected('layout') ? $scanner->getLayout($name) : NULL;
       if ($layout !== NULL) {
         // FIXME check for validity?
index 8bfecf5b1b7d42f8842e5cb73748fb66ff8afe50..9dc720ddf86cf8f17e67a312e1bd1f87706525e4 100644 (file)
@@ -86,7 +86,7 @@ class Afform extends AbstractEntity {
 
   public static function getFields() {
     return new BasicGetFieldsAction('Afform', __FUNCTION__, function($self) {
-      return [
+      $fields = [
         [
           'name' => 'name',
         ],
@@ -111,6 +111,17 @@ class Afform extends AbstractEntity {
           'name' => 'layout',
         ],
       ];
+
+      if ($self->getAction() === 'get') {
+        $fields[] = [
+          'name' => 'has_local',
+        ];
+        $fields[] = [
+          'name' => 'has_packaged',
+        ];
+      }
+
+      return $fields;
     });
   }
 
index ed39450d079193041a06f88ec2c954b3ceed2cdb..700146ce951c970fcd8c03650715bffc3eb3c282 100644 (file)
@@ -35,6 +35,8 @@ trait AfformSaveTrait {
       $fields = \Civi\Api4\Afform::getfields()->setCheckPermissions(FALSE)->addSelect('name')->execute()->column('name');
       unset($fields[array_search('layout', $fields)]);
       unset($fields[array_search('name', $fields)]);
+      unset($fields[array_search('has_local', $fields)]);
+      unset($fields[array_search('has_packaged', $fields)]);
       $orig = \Civi\Api4\Afform::get()->setCheckPermissions(FALSE)->addWhere('name', '=', $item['name'])->setSelect($fields)->execute()->first();
     }
 
index 45bc30c2dc6b8f8b3482343347668bb5cc10b25c..c8645bf17b4524fb3cddf99f5ffe81692121337c 100644 (file)
@@ -59,6 +59,8 @@ class api_v4_AfformTest extends api_v4_AfformTestCase {
     $this->assertEquals($get($originalMetadata, 'description'), $get($result[0], 'description'), $message);
     $this->assertEquals($get($originalMetadata, 'server_route'), $get($result[0], 'server_route'), $message);
     $this->assertTrue(is_array($result[0]['layout']), $message);
+    $this->assertEquals(TRUE, $get($result[0], 'has_packaged'), $message);
+    $this->assertEquals(FALSE, $get($result[0], 'has_local'), $message);
 
     $message = 'After updating with Afform.create, the revised data should be returned';
     $result = Civi\Api4\Afform::update()
@@ -75,6 +77,8 @@ class api_v4_AfformTest extends api_v4_AfformTestCase {
     $this->assertEquals('The temporary description', $get($result[0], 'description'), $message);
     $this->assertEquals($get($originalMetadata, 'server_route'), $get($result[0], 'server_route'), $message);
     $this->assertTrue(is_array($result[0]['layout']), $message);
+    $this->assertEquals(TRUE, $get($result[0], 'has_packaged'), $message);
+    $this->assertEquals(TRUE, $get($result[0], 'has_local'), $message);
 
     Civi\Api4\Afform::revert()->addWhere('name', '=', $formName)->execute();
     $message = 'After reverting, the final Afform.get should return default data';
@@ -84,6 +88,8 @@ class api_v4_AfformTest extends api_v4_AfformTestCase {
     $this->assertEquals($get($originalMetadata, 'description'), $get($result[0], 'description'), $message);
     $this->assertEquals($get($originalMetadata, 'server_route'), $get($result[0], 'server_route'), $message);
     $this->assertTrue(is_array($result[0]['layout']), $message);
+    $this->assertEquals(TRUE, $get($result[0], 'has_packaged'), $message);
+    $this->assertEquals(FALSE, $get($result[0], 'has_local'), $message);
   }
 
   public function getFormatExamples() {