public function newAction(Request $request)
 {
     $locationType = $this->get('campaignchain.core.form.type.location');
     $locationType->setBundleName('campaignchain/location-website');
     $locationType->setModuleIdentifier('campaignchain-website');
     $form = $this->createFormBuilder()->add('URL', 'url', array('label' => 'Website URL', 'constraints' => array(new Url(array('checkDNS' => true)))))->getForm();
     $form->handleRequest($request);
     if ($form->isValid()) {
         $locationURL = $form->getData()['URL'];
         $locationName = ParserUtil::getHTMLTitle($locationURL, $locationURL);
         $locationService = $this->get('campaignchain.core.location');
         $locationModule = $locationService->getLocationModule('campaignchain/location-website', 'campaignchain-website');
         $location = new Location();
         $location->setLocationModule($locationModule);
         $location->setName($locationName);
         $location->setUrl($locationURL);
         // Get the Website's favicon as Channel image if possible.
         $favicon = ParserUtil::getFavicon($locationURL);
         if ($favicon) {
             $locationImage = $favicon;
         } else {
             //                $locationImage = $this->container->get('templating.helper.assets')
             //                    ->getUrl(
             //                        'bundles/campaignchainlocationwebsite/images/icons/256x256/website.png',
             //                        null
             //                    );
             $locationImage = null;
         }
         $location->setImage($locationImage);
         $wizard = $this->get('campaignchain.core.channel.wizard');
         $wizard->setName($location->getName());
         $repository = $this->getDoctrine()->getRepository('CampaignChainCoreBundle:Location');
         if (!$repository->findBy(array('url' => $location->getUrl()))) {
             $wizard->addLocation($location->getUrl(), $location);
             try {
                 $channel = $wizard->persist();
                 $wizard->end();
                 $this->get('session')->getFlashBag()->add('success', "The Website '" . $location->getUrl() . "' has been connected.");
                 return $this->redirect($this->generateUrl('campaignchain_core_location'));
             } catch (\Exception $e) {
                 $this->addFlash('warning', "An error occured during the creation of the website location");
                 $this->get('logger')->addError($e->getMessage());
             }
         } else {
             $this->addFlash('warning', "The website  '" . $location->getUrl() . "' already exists.");
         }
     }
     //return $this->redirect($this->generateUrl(
     //  'campaignchain_channel_website_page_new',
     //array('id' => $channel->getLocations()[0]->getId())));
     return $this->render('CampaignChainCoreBundle:Base:new.html.twig', array('page_title' => 'Connect Website', 'form' => $form->createView()));
 }
 public function loginAction()
 {
     $oauth = $this->get('campaignchain.security.authentication.client.oauth.authentication');
     $status = $oauth->authenticate(self::RESOURCE_OWNER, $this->applicationInfo);
     $profile = $oauth->getProfile();
     if ($status) {
         try {
             $em = $this->getDoctrine()->getManager();
             $em->getConnection()->beginTransaction();
             $wizard = $this->get('campaignchain.core.channel.wizard');
             $wizard->setName($profile->displayName);
             // Get the location module.
             $locationService = $this->get('campaignchain.core.location');
             $locationModule = $locationService->getLocationModule('campaignchain/location-twitter', 'campaignchain-twitter-user');
             $location = new Location();
             $location->setIdentifier($profile->identifier);
             $location->setName($profile->displayName);
             $location->setLocationModule($locationModule);
             $location->setImage($profile->photoURL);
             $location->setUrl($profile->profileURL);
             $wizard->addLocation($location->getIdentifier(), $location);
             $channel = $wizard->persist();
             $wizard->end();
             $oauth->setLocation($channel->getLocations()[0]);
             $twitterUser = new TwitterUser();
             $twitterUser->setLocation($channel->getLocations()[0]);
             $twitterUser->setIdentifier($profile->identifier);
             $twitterUser->setDisplayName($profile->firstName);
             $twitterUser->setUsername($profile->displayName);
             $twitterUser->setProfileImageUrl($profile->photoURL);
             $twitterUser->setProfileUrl($profile->profileURL);
             $em->persist($twitterUser);
             // schedule job to get metrics from now on
             if ($channel->getLocations()[0]->getLocationModule()->getIdentifier() === 'campaignchain-twitter-user') {
                 $this->get('campaignchain.job.report.location.twitter')->schedule($channel->getLocations()[0]);
             }
             $em->flush();
             $em->getConnection()->commit();
             $this->addFlash('success', 'The Twitter location <a href="#">' . $profile->displayName . '</a> was connected successfully.');
         } catch (\Exception $e) {
             $em->getConnection()->rollback();
             throw $e;
         }
     } else {
         // A channel already exists that has been connected with this Facebook account
         $this->addFlash('warning', 'A location has already been connected for this Twitter account.');
     }
     return $this->render('CampaignChainChannelTwitterBundle:Create:login.html.twig', ['redirect' => $this->generateUrl('campaignchain_core_location')]);
 }
 public function loginAction(Request $request)
 {
     $oauth = $this->get('campaignchain.security.authentication.client.oauth.authentication');
     $status = $oauth->authenticate(self::RESOURCE_OWNER, $this->applicationInfo);
     $profile = $oauth->getProfile();
     if ($status) {
         try {
             $em = $this->getDoctrine()->getManager();
             $em->getConnection()->beginTransaction();
             $wizard = $this->get('campaignchain.core.channel.wizard');
             $wizard->setName($profile->displayName);
             // Get the location module.
             $locationService = $this->get('campaignchain.core.location');
             $locationModule = $locationService->getLocationModule(self::LOCATION_BUNDLE, self::LOCATION_MODULE);
             $location = new Location();
             $location->setIdentifier($profile->identifier);
             $location->setName($profile->displayName);
             $location->setUrl($profile->profileURL);
             $location->setImage($profile->photoURL);
             $location->setLocationModule($locationModule);
             $wizard->addLocation($location->getIdentifier(), $location);
             $channel = $wizard->persist();
             $wizard->end();
             $oauth->setLocation($channel->getLocations()[0]);
             $user = new XingUser();
             $user->setLocation($channel->getLocations()[0]);
             $user->setIdentifier($profile->identifier);
             $user->setDisplayName($profile->displayName);
             $user->setFirstName($profile->firstName);
             $user->setLastName($profile->lastName);
             if (isset($profile->emailVerified)) {
                 $user->setEmail($profile->emailVerified);
             } else {
                 $user->setEmail($profile->email);
             }
             $user->setProfileImageUrl($profile->photoURL);
             $em->persist($user);
             $em->flush();
             $em->getConnection()->commit();
             $this->get('session')->getFlashBag()->add('success', 'The Xing location <a href="#">' . $profile->displayName . '</a> was connected successfully.');
         } catch (\Exception $e) {
             $em->getConnection()->rollback();
             throw $e;
         }
     } else {
         $this->get('session')->getFlashBag()->add('warning', 'A location has already been connected for this Xing account.');
     }
     return $this->render('CampaignChainChannelXingBundle:Create:login.html.twig', array('redirect' => $this->generateUrl('campaignchain_core_location')));
 }
 public function newAction(Request $request)
 {
     $locationType = $this->get('campaignchain.core.form.type.location');
     $locationType->setBundleName('campaignchain/location-ezplatform');
     $locationType->setModuleIdentifier('campaignchain-ezplatform-user');
     $form = $this->createFormBuilder()->add('location_name', 'text', array('label' => 'Location name', 'attr' => array('placeholder' => 'For example, "Our corporate website"')))->add('url', 'url', array('label' => 'REST API base URL', 'attr' => array('placeholder' => 'For example, "http://www.example.com/api/ezp/v2/"')))->add('username', 'text', array('attr' => array('placeholder' => 'An eZ Platform user with access to the REST API')))->add('password', 'repeated', array('required' => false, 'type' => 'password', 'first_name' => 'password', 'second_name' => 'password_again', 'invalid_message' => 'The password fields must match.'))->getForm();
     $form->handleRequest($request);
     try {
         if ($form->isValid()) {
             $em = $this->getDoctrine()->getManager();
             $em->getConnection()->beginTransaction();
             $locationName = $form->getData()['location_name'];
             $url = $form->getData()['url'];
             $username = $form->getData()['username'];
             $password = $form->getData()['password'];
             /*
              * TODO: Check whether URL exists
              * TODO: Check that credentials are correct
              * TODO: Check whether provided URL points to a valid eZ REST API
              */
             $client = $this->container->get('campaignchain.channel.ezplatform.rest.client');
             $connection = $client->connect($url, $username, $password);
             $locationService = $this->get('campaignchain.core.location');
             $locationModule = $locationService->getLocationModule('campaignchain/location-ezplatform', 'campaignchain-ezplatform-user');
             $location = new Location();
             $location->setLocationModule($locationModule);
             $location->setName($locationName);
             $location->setUrl($url);
             $wizard = $this->get('campaignchain.core.channel.wizard');
             $wizard->setName($location->getName());
             $wizard->addLocation($location->getUrl(), $location);
             $channel = $wizard->persist();
             $wizard->end();
             $user = new EZPlatformUser();
             $user->setLocation($channel->getLocations()[0]);
             $user->setUsername($username);
             $user->setPassword($password);
             $em->persist($user);
             $em->flush();
             $em->getConnection()->commit();
             $this->addFlash('success', 'The eZ Platform <a href="' . $url . '">' . $locationName . '</a> was connected successfully.');
             return $this->redirect($this->generateUrl('campaignchain_core_location'));
         }
     } catch (\Exception $e) {
         $em->getConnection()->rollback();
         throw $e;
     }
     return $this->render('CampaignChainCoreBundle:Base:new.html.twig', array('page_title' => 'Connect eZ Platform Instance', 'form' => $form->createView()));
 }
 public function processContentLocation(Location $location, $data)
 {
     $sid = $data['slideshow'];
     $location->setIdentifier($sid);
     $location->setName($this->availableSlideshows[$sid]['title']);
     $location->setUrl($this->availableSlideshows[$sid]['url']);
     return $location;
 }
Esempio n. 6
0
 /**
  * Finds a Location by the URL and automatically creates the Location if it
  * does not exist and if the respective Location module supports auto
  * generation of Locations.
  **
  * @param $url
  * @param $operation Operation
  * @return bool|Location|null|object
  */
 public function findLocationByUrl($url, $operation, $alias = null)
 {
     $url = ParserUtil::sanitizeUrl($url);
     /*
      * If not a Location, then see if the URL is inside a connected
      * Channel's top-level Locations. To do so, check if one of these
      * criteria apply:
      * - The Location URL matches the beginning of the CTA URL
      * - The Location identifier is included in the CTA URL as well
      *   as the domain
      */
     if (ParserUtil::urlExists($url)) {
         $urlParts = parse_url($url);
         if ($urlParts['scheme'] == 'http') {
             $urlAltScheme = str_replace('http://', 'https://', $url);
         } elseif ($urlParts['scheme'] == 'https') {
             $urlAltScheme = str_replace('https://', 'http://', $url);
         }
         $repository = $this->em->getRepository('CampaignChainCoreBundle:Location');
         $query = $repository->createQueryBuilder('location')->where("(:url LIKE CONCAT('%', location.url, '%')) OR " . "(:url_alt_scheme LIKE CONCAT('%', location.url, '%')) OR " . "(" . "location.identifier IS NOT NULL AND " . ":url LIKE CONCAT('%', location.identifier, '%') AND " . "location.url LIKE :host" . ")")->andWhere('location.parent IS NULL')->setParameter('url', $url)->setParameter('url_alt_scheme', $urlAltScheme)->setParameter('host', $urlParts['host'] . '%')->getQuery();
         /** @var Location $matchingLocation */
         $matchingLocation = $query->getOneOrNullResult();
         if ($matchingLocation) {
             /*
              * Create a new Location based on the tracking alias
              * within the matching Location's Channel.
              *
              * If no tracking alias was provided, we take the
              * default LocationModule to create a new Location.
              */
             if (!$alias) {
                 // Done if the URL is exactly the same in the matching Location.
                 if ($matchingLocation->getUrl() == $url || $matchingLocation->getUrl() == $urlAltScheme) {
                     return $matchingLocation;
                 }
                 // Let's move on to create a new Location with the default module.
                 $locationService = $this->container->get('campaignchain.core.location');
                 /** @var LocationModule $locationModule */
                 $locationModule = $locationService->getLocationModule(self::DEFAULT_LOCATION_BUNDLE_NAME, self::DEFAULT_LOCATION_MODULE_IDENTIFIER);
                 if (!$locationModule) {
                     throw new \Exception('No Location module found for bundle "' . $matchingLocation->getChannel()->getBundle()->getName() . ' and module ' . $matchingLocation->getChannel()->getChannelModule()->getIdentifier() . '"');
                 }
             } else {
                 /*
                  * Get the Location module within the matching Location's
                  * Channel and with the given tracking alias.
                  */
                 /** @var LocationModule $locationModule */
                 $locationModule = $this->getLocationModuleByTrackingAlias($matchingLocation->getChannel()->getChannelModule(), $alias);
                 // Done if the matching Location also matches the alias and URL.
                 if ($matchingLocation->getLocationModule() == $locationModule && ($matchingLocation->getUrl() == $url || $matchingLocation->getUrl() == $urlAltScheme)) {
                     return $matchingLocation;
                 }
                 /*
                  * See if there is already another Location that matches the
                  * aliase's Location module and the URL.
                  */
                 $repository = $this->em->getRepository('CampaignChainCoreBundle:Location');
                 $query = $repository->createQueryBuilder('location')->where('location.locationModule = :locationModule')->andWhere('(location.url = :url OR location.url = :url_alt_scheme')->setParameter('locationModule', $locationModule)->setParameter('url', $url)->setParameter('url_alt_scheme', $urlAltScheme)->getQuery();
                 /** @var Location $location */
                 $location = $query->getOneOrNullResult();
                 // We found an existing Location, we're done.
                 if ($location) {
                     return $location;
                 }
                 if (!$locationModule) {
                     throw new \Exception('Cannot map tracking alias "' . $alias . '" to a "' . 'Location module that belongs to Channel module "' . $matchingLocation->getChannel()->getBundle()->getName() . '/' . $matchingLocation->getChannel()->getChannelModule()->getIdentifier() . '"');
                 }
             }
             /*
              * If the matching Location provides auto-generation of Locations,
              * then let's create a new child Location.
              */
             $ctaServiceName = $locationModule->getServices()['job_cta'];
             if ($ctaServiceName) {
                 // Create the new Location
                 $location = new Location();
                 $location->setUrl($url);
                 $location->setOperation($operation);
                 $location->setChannel($matchingLocation->getChannel());
                 $location->setParent($matchingLocation);
                 // Update the Location module to be the current
                 // one.
                 $location->setLocationModule($locationModule);
                 // Let the module's service process the new
                 // Location.
                 $ctaService = $this->container->get($ctaServiceName);
                 return $ctaService->execute($location);
             } else {
                 throw new \Exception('No CTA Job service defined for Location module ' . 'of bundle "' . $locationModule->getBundle()->getName() . '" ' . 'and module "' . $locationModule->getIdentifier() . '"');
             }
         } else {
             return false;
         }
     }
     throw new \Exception('The URL ' . $url . ' does not exist.');
 }
 public function createLocationAction(Request $request)
 {
     $selectedIds = $request->get('google-analytics-profile-id', []);
     if (empty($selectedIds)) {
         $this->addFlash('warning', 'Please select at least one Google Analytics property');
         return $this->redirectToRoute('campaignchain_channel_google_analytics_list_properties');
     }
     /** @var Token $token */
     $token = $request->getSession()->get('token');
     $em = $this->getDoctrine()->getManager();
     $token = $em->merge($token);
     $websiteChannelModule = $em->getRepository('CampaignChainCoreBundle:ChannelModule')->findOneBy(['identifier' => 'campaignchain-website']);
     $googleAnalyticsChannelModule = $em->getRepository('CampaignChainCoreBundle:ChannelModule')->findOneBy(['identifier' => 'campaignchain-google-analytics']);
     foreach ($selectedIds as $analyticsId) {
         list($accountId, $propertyId, $profileId) = explode('|', $analyticsId);
         $analyticsClient = $this->get('campaignchain_report_google_analytics.service_client')->getService($token);
         /** @var \Google_Service_Analytics_Profile $profile */
         $profile = $analyticsClient->management_profiles->get($accountId, $propertyId, $profileId);
         $wizard = $this->get('campaignchain.core.channel.wizard');
         $wizard->start(new Channel(), $googleAnalyticsChannelModule);
         $wizard->setName($profile->getName());
         // Get the location module.
         $locationService = $this->get('campaignchain.core.location');
         $locationModule = $locationService->getLocationModule('campaignchain/location-google-analytics', 'campaignchain-google-analytics');
         $location = new Location();
         $location->setIdentifier($profile->getId());
         $location->setName($profile->getName());
         $location->setLocationModule($locationModule);
         $google_base_url = 'https://www.google.com/analytics/web/#report/visitors-overview/';
         $location->setUrl($google_base_url . 'a' . $profile->getAccountId() . 'w' . $profile->getInternalWebPropertyId() . 'p' . $profile->getId());
         $em->persist($location);
         try {
             $em->flush();
         } catch (UniqueConstraintViolationException $e) {
             //This GA endpoint is already connected
             $this->addFlash('warning', 'The Google Analytics Property <a href="#">' . $profile->getName() . '</a> is already connected.');
             continue;
         }
         $wizard->addLocation($location->getIdentifier(), $location);
         $wizard->persist();
         $wizard->end();
         //Check if the if the belonging website location exists, if not create a new website location
         $website = $em->getRepository('CampaignChainCoreBundle:Location')->findOneByUrl($profile->getWebsiteUrl());
         //Create website location that belongs to the GA location
         if (!$website) {
             $websiteLocationModule = $locationService->getLocationModule('campaignchain/location-website', 'campaignchain-website');
             $websiteLocationName = ParserUtil::getHTMLTitle($profile->getWebsiteUrl());
             $websiteLocation = new Location();
             $websiteLocation->setLocationModule($websiteLocationModule);
             $websiteLocation->setName($websiteLocationName);
             $websiteLocation->setUrl($profile->getWebsiteUrl());
             $em->persist($websiteLocation);
             $wizard->start(new Channel(), $websiteChannelModule);
             $wizard->setName($websiteLocationName);
             $wizard->addLocation($profile->getWebsiteUrl(), $websiteLocation);
             $wizard->persist();
             $website = $websiteLocation;
         }
         $entityToken = clone $token;
         $entityToken->setLocation($location);
         $entityToken->setApplication($token->getApplication());
         $em->persist($entityToken);
         $analyticsProfile = new Profile();
         $analyticsProfile->setAccountId($profile->getAccountId());
         $analyticsProfile->setPropertyId($profile->getWebPropertyId());
         $analyticsProfile->setProfileId($profile->getId());
         $analyticsProfile->setIdentifier($profile->getId());
         $analyticsProfile->setDisplayName($profile->getName());
         $analyticsProfile->setLocation($location);
         $analyticsProfile->setBelongingLocation($website);
         $em->persist($analyticsProfile);
         $em->flush();
         $this->addFlash('success', 'The Google Analytics Property <a href="#">' . $profile->getName() . '</a> was connected successfully.');
     }
     return $this->redirectToRoute('campaignchain_core_location');
 }
 public function processActivityLocation(Location $location)
 {
     $location->setUrl(self::LINK_ADMIN_CAMPAIGNS);
     return $location;
 }
 public function handleCompanyPageCreation(Location $location)
 {
     $this->channelWizard->setName($location->getName());
     $pagesData = $this->channelWizard->get('pagesData');
     $pageData = $pagesData[$location->getIdentifier()];
     $companyLink = 'https://www.linkedin.com/company/' . $pageData['id'];
     $location->setUrl($companyLink);
     $page = new Page();
     $page->setLocation($location);
     $page->setIdentifier($pageData['id']);
     $page->setDisplayName($pageData['name']);
     $page->setDescription($pageData['description']);
     $page->setLink($companyLink);
     $page->setWebsiteLink($pageData['websiteUrl']);
     // Remember the user object in the Wizard.
     $this->channelWizard->set($page->getIdentifier(), $page);
     $flashBagMsg = $this->channelWizard->get('flashBagMsg');
     $flashBagMsg .= '<li>Page: <a href="' . $page->getLink() . '">' . $page->getDisplayName() . '</a></li>';
     $this->channelWizard->set('flashBagMsg', $flashBagMsg);
 }
 public function processContentLocation(Location $location, $data)
 {
     $location->setIdentifier($this->remoteWebinar['webinarKey']);
     $location->setName($this->remoteWebinar['subject']);
     $location->setUrl($this->remoteWebinar['registrationUrl']);
     return $location;
 }
 public function newAction(Request $request)
 {
     $locationType = $this->get('campaignchain.core.form.type.location');
     $locationType->setBundleName('campaignchain/location-slideshare');
     $locationType->setModuleIdentifier('campaignchain-slideshare');
     $form = $this->createFormBuilder()->add('username', 'text')->add('password', 'repeated', array('required' => false, 'type' => 'password', 'first_name' => 'password', 'second_name' => 'password_again', 'invalid_message' => 'The password fields must match.'))->getForm();
     $form->handleRequest($request);
     try {
         if ($form->isValid()) {
             $em = $this->getDoctrine()->getManager();
             $em->getConnection()->beginTransaction();
             $locationUsername = $form->getData()['username'];
             $locationPassword = $form->getData()['password'];
             /*
             $oauthApp = $this->get('campaignchain.security.authentication.client.oauth.application');
             $application = $oauthApp->getApplication(self::RESOURCE_OWNER);
             $ts = time();
             $client = new \Guzzle\Http\Client;
             $request = $client->createRequest('GET', 'https://www.slideshare.net/api/2/get_user_tags');
             $query = $request->getQuery();
             $query->set('api_key', $application->getKey());
             $query->set('ts',  $ts);
             $query->set('hash', sha1($application->getSecret().$ts));
             $query->set('username', $locationUsername);
             $query->set('password', $locationPassword);
             $response = $request->send();
             
             $xml = $response->xml();
             */
             $oauthApp = $this->get('campaignchain.security.authentication.client.oauth.application');
             $application = $oauthApp->getApplication(self::RESOURCE_OWNER);
             $client = $this->container->get('campaignchain.channel.slideshare.rest.client');
             $connection = $client->connect($application->getKey(), $application->getSecret(), $locationUsername, $locationPassword);
             $xml = $connection->getUserTags();
             if (isset($xml->Message) && strtolower($xml->Message) == 'failed user authentication') {
                 throw new \Exception('The credentials provided are invalid');
             }
             $locationURL = 'http://www.slideshare.net/' . $locationUsername;
             $locationService = $this->get('campaignchain.core.location');
             $locationModule = $locationService->getLocationModule('campaignchain/location-slideshare', 'campaignchain-slideshare-user');
             $location = new Location();
             $location->setLocationModule($locationModule);
             $location->setName($locationUsername);
             $location->setUrl($locationURL);
             /*
              * If user uploaded an image, use that as the Location image,
              * otherwise, take the SlideShare default profile image.
              */
             $slideShareUserImage = 'http://cdn.slidesharecdn.com/profile-photo-' . $locationUsername . '-96x96.jpg';
             try {
                 getimagesize($slideShareUserImage);
             } catch (\Exception $e) {
                 $slideShareUserImage = 'http://public.slidesharecdn.com/b/images/user-96x96.png';
             }
             $location->setImage($slideShareUserImage);
             $wizard = $this->get('campaignchain.core.channel.wizard');
             $wizard->setName($location->getName());
             $wizard->addLocation($location->getUrl(), $location);
             $channel = $wizard->persist();
             $wizard->end();
             $slideshareUser = new SlideShareUser();
             $slideshareUser->setLocation($channel->getLocations()[0]);
             $slideshareUser->setIdentifier($locationUsername);
             $slideshareUser->setPassword($locationPassword);
             $slideshareUser->setDisplayName($locationUsername);
             $em->persist($slideshareUser);
             $em->flush();
             $em->getConnection()->commit();
             $this->get('session')->getFlashBag()->add('success', 'The Slideshare location <a href="#">' . $locationUsername . '</a> was connected successfully.');
             return $this->redirect($this->generateUrl('campaignchain_core_location'));
         }
     } catch (\Exception $e) {
         $em->getConnection()->rollback();
         throw $e;
     }
     return $this->render('CampaignChainCoreBundle:Base:new.html.twig', array('page_title' => 'Connect SlideShare Account', 'form' => $form->createView()));
 }