X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=ext%2Fafform%2Fcore%2Fafform.php;h=49b3ba9f9977a3ed085f98e7e5e955a7fc2baff8;hb=69be62073c1e99c5a52db4fcb4d5415dcaac5d79;hp=89c7dc090529f47e7aee4979be22a030188dd880;hpb=14b26ac5837b06a1eafadf5fbf7b7024967b17ba;p=civicrm-core.git diff --git a/ext/afform/core/afform.php b/ext/afform/core/afform.php index 89c7dc0905..49b3ba9f99 100644 --- a/ext/afform/core/afform.php +++ b/ext/afform/core/afform.php @@ -127,6 +127,40 @@ function afform_civicrm_upgrade($op, CRM_Queue_Queue $queue = NULL) { */ function afform_civicrm_managed(&$entities) { _afform_civix_civicrm_managed($entities); + + /** @var \CRM_Afform_AfformScanner $scanner */ + if (\Civi::container()->has('afform_scanner')) { + $scanner = \Civi::service('afform_scanner'); + } + else { + // This might happen at oddballs points - e.g. while you're in the middle of re-enabling the ext. + // This AfformScanner instance only lives during this method call, and it feeds off the regular cache. + $scanner = new CRM_Afform_AfformScanner(); + } + + foreach ($scanner->getMetas() as $afform) { + if (empty($afform['is_dashlet']) || empty($afform['name'])) { + continue; + } + $entities[] = [ + 'module' => E::LONG_NAME, + 'name' => 'afform_dashlet_' . $afform['name'], + 'entity' => 'Dashboard', + 'update' => 'always', + // ideal cleanup policy might be to (a) deactivate if used and (b) remove if unused + 'cleanup' => 'always', + 'params' => [ + 'version' => 3, + // Q: Should we loop through all domains? + 'domain_id' => CRM_Core_BAO_Domain::getDomain()->id, + 'is_active' => TRUE, + 'name' => $afform['name'], + 'label' => $afform['title'] ?? ts('(Untitled)'), + 'directive' => _afform_angular_module_name($afform['name'], 'dash'), + 'permission' => "@afform:" . $afform['name'], + ], + ]; + } } /** @@ -150,8 +184,7 @@ function afform_civicrm_caseTypes(&$caseTypes) { function afform_civicrm_angularModules(&$angularModules) { _afform_civix_civicrm_angularModules($angularModules); - $afforms = \Civi\Api4\Afform::get() - ->setCheckPermissions(FALSE) + $afforms = \Civi\Api4\Afform::get(FALSE) ->setSelect(['name', 'requires', 'module_name', 'directive_name']) ->execute(); @@ -352,15 +385,16 @@ function _af_fill_field_metadata($entityType, DOMElement $afField) { $params = [ 'action' => 'create', 'where' => [['name', '=', $afField->getAttribute('name')]], - 'select' => ['title', 'input_type', 'input_attrs', 'options'], + 'select' => ['label', 'input_type', 'input_attrs', 'options'], 'loadOptions' => TRUE, ]; if (in_array($entityType, CRM_Contact_BAO_ContactType::basicTypes(TRUE))) { $params['values'] = ['contact_type' => $entityType]; $entityType = 'Contact'; } - $getFields = civicrm_api4($entityType, 'getFields', $params); - // Merge field definition data with whatever's already in the markup + // Merge field definition data with whatever's already in the markup. + // If the admin has chosen to include this field on the form, then it's OK for us to get metadata about the field - regardless of user's other permissions. + $getFields = civicrm_api4($entityType, 'getFields', $params + ['checkPermissions' => FALSE]); $deep = ['input_attrs']; foreach ($getFields as $fieldInfo) { $existingFieldDefn = trim(pq($afField)->attr('defn') ?: ''); @@ -508,6 +542,23 @@ function afform_civicrm_permission_check($permission, &$granted, $contactId) { } } +/** + * Implements hook_civicrm_permissionList(). + * + * @see CRM_Utils_Hook::permissionList() + */ +function afform_civicrm_permissionList(&$permissions) { + $scanner = Civi::service('afform_scanner'); + foreach ($scanner->getMetas() as $name => $meta) { + $permissions['@afform:' . $name] = [ + 'group' => 'afform', + 'title' => ts('Afform: Inherit permission of %1', [ + 1 => $name, + ]), + ]; + } +} + /** * Clear any local/in-memory caches based on afform data. */