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->setImage($profile->photoURL); $location->setLocationModule($locationModule); $wizard->addLocation($location->getIdentifier(), $location); $channel = $wizard->persist(); $wizard->end(); $oauth->setLocation($channel->getLocations()[0]); $user = new MailChimpUser(); $user->setLocation($channel->getLocations()[0]); $user->setIdentifier($profile->identifier); $user->setUsername($profile->username); $user->setDisplayName($profile->displayName); $user->setFirstName($profile->firstName); $user->setLastName($profile->lastName); $user->setEmail($profile->email); $user->setProfileImageUrl($profile->photoURL); $user->setAddress($profile->address); $user->setCity($profile->city); $user->setCountry($profile->country); $user->setZip($profile->zip); $user->setPhone($profile->phone); $user->setWebsiteUrl($profile->webSiteURL); $em->persist($user); $em->flush(); $em->getConnection()->commit(); $this->get('session')->getFlashBag()->add('success', 'The MailChimp 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 MailChimp account.'); } return $this->render('CampaignChainChannelMailChimpBundle:Create:login.html.twig', array('redirect' => $this->generateUrl('campaignchain_core_location'))); }
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 processContentLocation(Location $location, $data) { $sid = $data['slideshow']; $location->setIdentifier($sid); $location->setName($this->availableSlideshows[$sid]['title']); $location->setUrl($this->availableSlideshows[$sid]['url']); return $location; }
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 processContentLocation(Location $location, $data) { $remoteNewsletter = $this->getRemoteNewsletter($data); $location->setIdentifier($remoteNewsletter['id']); $location->setName($remoteNewsletter['title']); $location->setUrl($remoteNewsletter['archive_url_long']); return $location; }
/** * @return Location[] */ public function getParsedLocationsFromLinkedIn() { $channel = $this->channelWizard->getChannel(); $profile = $this->channelWizard->get('profile'); $locations = []; $locationName = $profile->displayName; if (!empty($profile->username)) { $locationName .= ' (' . $profile->username . ')'; } // Get the location module for the user stream. $locationModuleUser = $this->locationService->getLocationModule('campaignchain/location-linkedin', 'campaignchain-linkedin-user'); // Create the location instance for the user stream. $locationUser = new Location(); $locationUser->setIdentifier($profile->identifier); $locationUser->setName($locationName); $locationUser->setLocationModule($locationModuleUser); if (!$profile->photoURL || strlen($profile->photoURL) == 0) { $locationUser->setImage($this->assetsHelper->getUrl('/bundles/campaignchainchannellinkedin/ghost_person.png')); } else { $locationUser->setImage($profile->photoURL); } $locationUser->setChannel($channel); $locationModuleUser->addLocation($locationUser); $locations[$profile->identifier] = $locationUser; $tokens = $this->channelWizard->get('tokens'); /** @var Token $userToken */ $userToken = array_values($tokens)[0]; $connection = $this->client->getConnectionByToken($userToken); $companies = $connection->getCompanies(); //there is only a user page if (empty($companies)) { return $locations; } // Get the location module for the page stream. $locationModulePage = $this->locationService->getLocationModule('campaignchain/location-linkedin', 'campaignchain-linkedin-page'); $wizardPages = []; foreach ($companies as $company) { $newToken = new Token(); $newToken->setAccessToken($userToken->getAccessToken()); $newToken->setApplication($userToken->getApplication()); $newToken->setTokenSecret($userToken->getTokenSecret()); $tokens[$company['id']] = $newToken; $this->channelWizard->set('tokens', $tokens); $companyData = $connection->getCompanyProfile($company['id']); $locationPage = new Location(); $locationPage->setChannel($channel); $locationPage->setName($companyData['name']); $locationPage->setIdentifier($companyData['id']); if (isset($companyData['squareLogoUrl'])) { $locationPage->setImage($companyData['squareLogoUrl']); } else { $locationPage->setImage($this->assetsHelper->getUrl('/bundles/campaignchainchannellinkedin/ghost_person.png')); } $locationPage->setLocationModule($locationModulePage); $locationModulePage->addLocation($locationPage); $locations[$companyData['id']] = $locationPage; $wizardPages[$companyData['id']] = $companyData; } $this->channelWizard->set('pagesData', $wizardPages); return $locations; }
/** * After a new Activity was created, this method makes it possible to alter * the data of the Content's Location (not the Activity's Location!) as per * the data provided for the Content. * * Called in these views: * - new * * @param Location $location Location of the Content. * @param $data Form submit data of the Content. * @return Location */ public function processContentLocation(Location $location, $data) { $connection = $this->getRestApiConnectionByLocation(); $remoteContentObject = $connection->getContentObject($data['content_object']); $location->setIdentifier($remoteContentObject['_id']); $location->setName($remoteContentObject['Name']); return $location; }
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 addLocationAction(Request $request) { $wizard = $this->get('campaignchain.core.channel.wizard'); $channel = $wizard->getChannel(); $profile = $wizard->get('profile'); $locations = []; $locationName = $profile->displayName; $username = $profile->username; if (!empty($username)) { $locationName .= ' (' . $username . ')'; } // Get the location module for the user stream. $locationService = $this->get('campaignchain.core.location'); $locationModuleUser = $locationService->getLocationModule('campaignchain/location-facebook', 'campaignchain-facebook-user'); // Create the location instance for the user stream. $locationUser = new Location(); $locationUser->setChannel($channel); $locationUser->setName($locationName); $locationUser->setIdentifier($profile->identifier); $locationUser->setImage($profile->photoURL); $locationUser->setLocationModule($locationModuleUser); $locationModuleUser->addLocation($locationUser); $locations[$profile->identifier] = $locationUser; // Connect to Facebook to retrieve pages related to the user. $tokens = $wizard->get('tokens'); $client = $this->container->get('campaignchain.channel.facebook.rest.client'); $connection = $client->connect($tokens[$profile->identifier]->getAccessToken()); if ($connection) { // TODO: Check whether user has manage_pages permission with /me/permissions // check if the user owns Facebook pages $response = $connection->api('/me/accounts'); $pagesData = $response['data']; if (is_array($pagesData) && count($pagesData)) { // TODO: Should we check whether the Facebook page has actually been published (through is_published), because if not, then posting to it won't make sense? Same with can_post and perms from /me/accounts? // Get the location module for the page stream. $locationModulePage = $locationService->getLocationModule('campaignchain/location-facebook', 'campaignchain-facebook-page'); // User owns pages, so let's build the form and ask him whether to create channels for each of them // with the respective channel name foreach ($pagesData as $pageData) { // Save the token in the Wizard. $tokens = $wizard->get('tokens'); $newToken = new Token(); $newToken->setAccessToken($pageData['access_token']); $application = $tokens[$wizard->get('facebook_user_id')]->getApplication(); $newToken->setApplication($application); $tokens[$pageData['id']] = $newToken; $wizard->set('tokens', $tokens); // Get the page picture $pageConnection = $client->connect($pageData['access_token']); $pagePicture = $pageConnection->api('/' . $pageData['id'] . '/picture', 'GET', ['redirect' => false, 'type' => 'large']); $pageData['picture_url'] = $pagePicture['data']['url']; // Create the location instance for the page stream. $locationPage = new Location(); $locationPage->setChannel($channel); $locationPage->setName($pageData['name']); $locationPage->setIdentifier($pageData['id']); $locationPage->setImage($pageData['picture_url']); $locationPage->setLocationModule($locationModulePage); $locationModulePage->addLocation($locationPage); $locations[$pageData['id']] = $locationPage; $wizardPages[$pageData['id']] = $pageData; } $wizard->set('pagesData', $wizardPages); } } $data = []; $form = $this->createFormBuilder($data); foreach ($locations as $identifier => $location) { // Has the page already been added as a location? $repository = $this->getDoctrine()->getRepository('CampaignChainCoreBundle:Location'); $pageExists = $repository->findOneBy(['identifier' => $identifier, 'locationModule' => $location->getLocationModule()]); // Compose the checkbox form field. $form->add($identifier, CheckboxType::class, ['label' => '<img class="campaignchain-location-image-input-prepend" src="' . $location->getImage() . '"> ' . $location->getName(), 'required' => false, 'data' => true, 'mapped' => false, 'disabled' => $pageExists, 'attr' => ['align_with_widget' => true]]); // If a location has already been added before, remove it from this process. // TODO: Also assign existing locations to the new FB user. if ($pageExists) { unset($locations[$identifier]); } } $form = $form->getForm(); $form->handleRequest($request); if ($form->isValid()) { // Find out which locations should be added, i.e. which respective checkbox is active. foreach ($locations as $identifier => $location) { if (!$form->get($identifier)->getData()) { unset($locations[$identifier]); $wizard->removeLocation($identifier); } } // If there's at least one location to be added, then have the user configure it. if (is_array($locations) && count($locations)) { $wizard->setLocations($locations); return $this->redirectToRoute('campaignchain_channel_facebook_location_configure', ['step' => 0]); } else { $this->addFlash('warning', 'No new location has been added.'); return $this->redirectToRoute('campaignchain_core_location'); } } return $this->render('CampaignChainCoreBundle:Base:new.html.twig', ['page_title' => 'Add Facebook Locations', 'form' => $form->createView()]); }