Esempio n. 1
0
 /**
  * Merges a config from integration_list with feature settings
  *
  * @param array $config
  *
  * @return array|mixed
  */
 public function mergeConfigToFeatureSettings($config = array())
 {
     $featureSettings = $this->settings->getFeatureSettings();
     if (isset($config['config']) && (empty($config['integration']) || !empty($config['integration']) && $config['integration'] == $this->getName())) {
         $featureSettings = array_merge($featureSettings, $config['config']);
     }
     return $featureSettings;
 }
 /**
  * {@inheritDoc}
  */
 public function __toString()
 {
     $this->__initializer__ && $this->__initializer__->__invoke($this, '__toString', array());
     return parent::__toString();
 }
Esempio n. 3
0
 /**
  * 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;
 }