Skip to content
Snippets Groups Projects
Commit 6e53d638 authored by jaapjansma's avatar jaapjansma
Browse files

Fixed regression bug with the caching of custom fields.

parent af937059
No related branches found
Tags 1.24.1
No related merge requests found
Version 1.39 (not yet released)
Version 1.38.1
------------
* Fixed regression bug with the caching of custom fields.
Version 1.38
------------
......
<?php
/**
* @author Jaap Jansma <jaap.jansma@civicoop.org>
* @license AGPL-3.0
*/
namespace Civi\ActionProvider;
use Symfony\Component\DependencyInjection\ContainerBuilder;
class Config extends \Symfony\Component\DependencyInjection\Container {
/**
* Returns the name of the custom group
*
* @param int $custom_group_id
* @return string
*/
public function getCustomGroupName($custom_group_id) {
$customGroupNames = $this->getParameter('custom_group_names');
return $customGroupNames[$custom_group_id];
}
/**
* Returns the custom field api data.
* @param $custom_field_id
* @return array
*/
public function getCustomField($custom_field_id) {
$customFields = $this->getParameter('custom_fields');
return $customFields[$custom_field_id];
}
/**
* Returns with custom fields of a certain group.
*
* @param $custom_group_id
* @return array
*/
public function getCustomFieldsOfCustomGroup($custom_group_id) {
$customFieldsPerGroup = $this->getParameter('custom_fields_per_group');
return $customFieldsPerGroup[$custom_group_id];
}
public static function buildConfigContainer(ContainerBuilder $containerBuilder) {
$customGroupNames = array();
$customGroupPerExtends = array();
$customFields = array();
$customFieldsPerGroup = array();
$customGroupApi = civicrm_api3('CustomGroup', 'get', ['options' => ['limit' => 0]]);
foreach($customGroupApi['values'] as $customGroup) {
$customGroupNames[$customGroup['id']] = $customGroup['name'];
$customGroupPerExtends[$customGroup['extends']][] = $customGroup;
}
$customFieldsApi = civicrm_api3('CustomField', 'get', ['options' => ['limit' => 0]]);
foreach($customFieldsApi['values'] as $customField) {
$customFields[$customField['id']] = $customField;
$customFieldsPerGroup[$customField['custom_group_id']][] = $customField;
}
$containerBuilder->setParameter('custom_group_names', $customGroupNames);
$containerBuilder->setParameter('custom_groups_per_extends', $customGroupPerExtends);
$containerBuilder->setParameter('custom_fields_per_group', $customFieldsPerGroup);
$containerBuilder->setParameter('custom_fields', $customFields);
}
}
......@@ -23,20 +23,19 @@ class ConfigContainer {
}
/**
* @return \Symfony\Component\DependencyInjection\Container
* @return \Civi\ActionProvider\Config
*/
public static function getInstance() {
if (!self::$configContainer) {
$file = self::getCacheFile();
$containerConfigCache = new ConfigCache($file, false);
if (!$containerConfigCache->isFresh()) {
if (!file_exists($file)) {
$containerBuilder = self::createContainer();
$containerBuilder->compile();
$dumper = new PhpDumper($containerBuilder);
$containerConfigCache->write(
$dumper->dump(['class' => 'CachedActionProviderConfigContainer']),
$containerBuilder->getResources()
);
file_put_contents($file, $dumper->dump([
'class' => 'CachedActionProviderConfigContainer',
'base_class' => '\Civi\ActionProvider\Config',
]));
}
require_once $file;
self::$configContainer = new \CachedActionProviderConfigContainer();
......@@ -49,13 +48,9 @@ class ConfigContainer {
*/
public static function clearCache() {
$file = self::getCacheFile();
$metaFile = $file.'.meta';
if (file_exists($file)) {
unlink($file);
}
if (file_exists($metaFile)) {
unlink($metaFile);
}
}
/**
......@@ -79,7 +74,8 @@ class ConfigContainer {
* @return string
*/
public static function getCacheFile() {
return \Civi::paths()->getPath("[civicrm.compile]/CachedActionProviderConfigContainer.php");
$envId = \CRM_Core_Config_Runtime::getId();
return \Civi::paths()->getPath("[civicrm.compile]/CachedActionProviderConfigContainer.{$envId}.php");
}
/**
......@@ -90,7 +86,7 @@ class ConfigContainer {
protected static function createContainer() {
$containerBuilder = new ContainerBuilder();
CustomField::buildConfigContainer($containerBuilder);
Config::buildConfigContainer($containerBuilder);
// Dipsatch an symfony event so that extensions could listen to this event
// and hook int the building of the config container.
......
......@@ -3,7 +3,6 @@
namespace Civi\ActionProvider\Utils;
use Civi\ActionProvider\ConfigContainer;
use Civi\ActionProvider\Parameter\ParameterBag;
use Civi\ActionProvider\Parameter\ParameterBagInterface;
use \Civi\ActionProvider\Parameter\Specification;
use \Civi\ActionProvider\Parameter\OptionGroupSpecification;
......@@ -11,18 +10,12 @@ use \Civi\ActionProvider\Parameter\OptionGroupSpecification;
use Civi\ActionProvider\Parameter\SpecificationBag;
use Civi\ActionProvider\Parameter\SpecificationGroup;
use CRM_ActionProvider_ExtensionUtil as E;
use Symfony\Component\DependencyInjection\ContainerBuilder;
/**
* Helper class to add a configuration specification from custom field
*/
class CustomField {
static $customGroupNames = array();
static $customFields = array();
/**
* Gets the data type of the custom field.
*/
......@@ -38,9 +31,7 @@ class CustomField {
* @return string
*/
public static function getCustomGroupName($custom_group_id) {
$config = ConfigContainer::getInstance();
$customGroupNames = $config->getParameter('custom_group_names');
return $customGroupNames[$custom_group_id];
return ConfigContainer::getInstance()->getCustomGroupName($custom_group_id);
}
/**
......@@ -50,11 +41,9 @@ class CustomField {
* @return string
*/
public static function getCustomFieldName($custom_field_id) {
$config = ConfigContainer::getInstance();
$customFields = $config->getParameter('custom_fields');
$custom_group_name = self::getCustomGroupName($customFields[$custom_field_id]['custom_group_id']);
$name = 'custom_'.$custom_group_name.'_'.$customFields[$custom_field_id]['name'];
$customField = ConfigContainer::getInstance()->getCustomField($custom_field_id);
$custom_group_name = self::getCustomGroupName($customField['custom_group_id']);
$name = 'custom_'.$custom_group_name.'_'.$customField['name'];
return $name;
}
......@@ -70,8 +59,6 @@ class CustomField {
* @return Specification|null
*/
public static function getSpecFromCustomField($customField, $titlePrefix='', $useRequiredFromCustomField=false) {
self::$customFields[$customField['id']] = $customField;
$name = self::getCustomFieldName($customField['id']);
$apiFieldName = 'custom_'.$customField['id'];
$type = self::getTypeForCustomField($customField);
......@@ -110,10 +97,9 @@ class CustomField {
* @throws \CiviCRM_API3_Exception
*/
public static function getSpecForCustomGroup($customGroupId, $customGroupName, $customGroupTitle) {
$config = ConfigContainer::getInstance();
$customFieldsPerGroup = $config->getParameter('custom_fields_per_group');
$customFields = ConfigContainer::getInstance()->getCustomFieldsOfCustomGroup($customGroupId);
$customGroupSpecBag = new SpecificationBag();
foreach ($customFieldsPerGroup[$customGroupId] as $customField) {
foreach ($customFields as $customField) {
if ($customField['is_active']) {
$spec = self::getSpecFromCustomField($customField, '', FALSE);
if ($spec) {
......@@ -150,27 +136,4 @@ class CustomField {
return $apiParams;
}
public static function buildConfigContainer(ContainerBuilder $containerBuilder) {
$customGroupNames = array();
$customGroupPerExtends = array();
$customFields = array();
$customFieldsPerGroup = array();
$customGroupApi = civicrm_api3('CustomGroup', 'get', ['options' => ['limit' => 0]]);
foreach($customGroupApi['values'] as $customGroup) {
$customGroupNames[$customGroup['id']] = $customGroup['name'];
$customGroupPerExtends[$customGroup['extends']][] = $customGroup;
}
$customFieldsApi = civicrm_api3('CustomField', 'get', ['options' => ['limit' => 0]]);
foreach($customFieldsApi['values'] as $customField) {
$customFields[] = $customField;
$customFieldsPerGroup[$customField['custom_group_id']][] = $customField;
}
$containerBuilder->setParameter('custom_group_names', $customGroupNames);
$containerBuilder->setParameter('custom_groups_per_extends', $customGroupPerExtends);
$containerBuilder->setParameter('custom_fields_per_group', $customFieldsPerGroup);
$containerBuilder->setParameter('custom_fields', $customFields);
}
}
......@@ -13,8 +13,8 @@
<url desc="Documentation">https://lab.civicrm.org/jaapjansma/action-provider/wikis/home</url>
<url desc="Licensing">http://www.gnu.org/licenses/agpl-3.0.html</url>
</urls>
<releaseDate>2020-12-05</releaseDate>
<version>1.39-dev</version>
<releaseDate>2020-12-06</releaseDate>
<version>1.38.1</version>
<develStage>stable</develStage>
<compatibility>
<ver>4.7</ver>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment