/** * {@inheritDoc} */ public function setSupportedFeatures($supportedFeatures) { $this->__initializer__ && $this->__initializer__->__invoke($this, 'setSupportedFeatures', array($supportedFeatures)); return parent::setSupportedFeatures($supportedFeatures); }
/** * Get a list of integration helper classes * * @param array|string $specificIntegrations * @param array $withFeatures * @param bool $alphabetical * @param null|int $pluginFilter * @param bool|false $publishedOnly * * @return mixed */ public function getIntegrationObjects($specificIntegrations = null, $withFeatures = null, $alphabetical = false, $pluginFilter = null, $publishedOnly = false) { static $integrations = array(), $available = array(), $byFeatureList = array(), $byPlugin = array(); // Build the service classes if (empty($available)) { $em = $this->factory->getEntityManager(); $available = array(); // Get currently installed integrations $integrationSettings = $this->getIntegrationSettings(); // And we'll be scanning the addon bundles for additional classes, so have that data on standby $plugins = $this->factory->getPluginBundles(); // Get a list of already installed integrations $pluginModel = $this->factory->getModel('plugin'); $integrationRepo = $em->getRepository('MauticPluginBundle:Integration'); //get a list of plugins for filter $installedPlugins = $pluginModel->getEntities(array('hydration_mode' => 'hydrate_array', 'index' => 'bundle')); $newIntegrations = array(); // Scan the plugins for integration classes foreach ($plugins as $plugin) { // Do not list the integration if the bundle has not been "installed" if (!isset($installedPlugins[$plugin['bundle']])) { continue; } if (is_dir($plugin['directory'] . '/Integration')) { $finder = new Finder(); $finder->files()->name('*Integration.php')->in($plugin['directory'] . '/Integration')->ignoreDotFiles(true); $id = $installedPlugins[$plugin['bundle']]['id']; $byPlugin[$id] = array(); $pluginReference = $em->getReference('MauticPluginBundle:Plugin', $id); $pluginNamespace = str_replace('MauticPlugin', '', $plugin['bundle']); foreach ($finder as $file) { $integrationName = substr($file->getBaseName(), 0, -15); if (!isset($integrationSettings[$integrationName])) { $newIntegration = new Integration(); $newIntegration->setName($integrationName)->setPlugin($pluginReference); $integrationSettings[$integrationName] = $newIntegration; // Initiate the class in order to get the features supported $class = "\\MauticPlugin\\" . $pluginNamespace . "\\Integration\\" . $integrationName . "Integration"; $reflectionClass = new \ReflectionClass($class); if ($reflectionClass->isInstantiable()) { $integrations[$integrationName] = new $class($this->factory); $features = $integrations[$integrationName]->getSupportedFeatures(); $newIntegration->setSupportedFeatures($features); // Go ahead and stash it since it's built already $integrations[$integrationName]->setIntegrationSettings($newIntegration); $newIntegrations[] = $newIntegration; unset($newIntegration); } else { // Something is bad so ignore continue; } } /** @var \Mautic\PluginBundle\Entity\Integration $settings */ $settings = $integrationSettings[$integrationName]; $available[$integrationName] = array('integration' => $integrationName, 'settings' => $settings, 'namespace' => $pluginNamespace); // Sort by feature and plugin for later $features = $settings->getSupportedFeatures(); foreach ($features as $feature) { if (!isset($byFeatureList[$feature])) { $byFeatureList[$feature] = array(); } $byFeatureList[$feature][] = $integrationName; } $byPlugin[$id][] = $integrationName; } // Save newly found integrations if (!empty($newIntegrations)) { $integrationRepo->saveEntities($newIntegrations); unset($newIntegrations); } } } } // Ensure appropriate formats if ($specificIntegrations !== null && !is_array($specificIntegrations)) { $specificIntegrations = array($specificIntegrations); } if ($withFeatures !== null && !is_array($withFeatures)) { $withFeatures = array($withFeatures); } // Build the integrations wanted if (!empty($pluginFilter)) { // Filter by plugin $filteredIntegrations = $byPlugin[$pluginFilter]; } elseif (!empty($specificIntegrations)) { // Filter by specific integrations $filteredIntegrations = $specificIntegrations; } else { // All services by default $filteredIntegrations = array_keys($available); } // Filter by features if (!empty($withFeatures)) { $integrationsWithFeatures = array(); foreach ($withFeatures as $feature) { if (isset($byFeatureList[$feature])) { $integrationsWithFeatures = $integrationsWithFeatures + $byFeatureList[$feature]; } } $filteredIntegrations = array_intersect($filteredIntegrations, $integrationsWithFeatures); } $returnServices = array(); // Build the classes if not already foreach ($filteredIntegrations as $integrationName) { if (!isset($available[$integrationName]) || $publishedOnly && !$available[$integrationName]['settings']->isPublished()) { continue; } if (!isset($integrations[$integrationName])) { $integration = $available[$integrationName]; $class = "\\MauticPlugin\\" . $integration['namespace'] . "\\Integration\\" . $integrationName . "Integration"; $reflectionClass = new \ReflectionClass($class); if ($reflectionClass->isInstantiable()) { $integrations[$integrationName] = new $class($this->factory); $integrations[$integrationName]->setIntegrationSettings($integration['settings']); } else { $integrations[$integrationName] = false; } } $returnServices[$integrationName] = $integrations[$integrationName]; } if (empty($alphabetical)) { // Sort by priority uasort($returnServices, function ($a, $b) { $aP = (int) $a->getPriority(); $bP = (int) $b->getPriority(); if ($aP === $bP) { return 0; } return $aP < $bP ? -1 : 1; }); } else { // Sort by display name uasort($returnServices, function ($a, $b) { $aName = $a->getDisplayName(); $bName = $b->getDisplayName(); return strcasecmp($aName, $bName); }); } return $returnServices; }