src/Bidcoz/Bundle/FrontendBundle/Controller/SponsorshipController.php line 85

Open in your IDE?
  1. <?php
  2. namespace Bidcoz\Bundle\FrontendBundle\Controller;
  3. use Bidcoz\Bundle\CoreBundle\Controller\CoreController;
  4. use Bidcoz\Bundle\CoreBundle\Entity\Campaign;
  5. use Bidcoz\Bundle\CoreBundle\Entity\Organization;
  6. use Bidcoz\Bundle\CoreBundle\Entity\Sponsorship\Sponsorship;
  7. use Bidcoz\Bundle\CoreBundle\Entity\User;
  8. use Bidcoz\Bundle\FrontendBundle\Form\Type\SponsorshipType;
  9. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  10. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
  11. use Symfony\Component\HttpFoundation\Request;
  12. use Symfony\Component\Routing\Annotation\Route;
  13. /**
  14.  * @Route("/{orgSlug}/{campaignSlug}/sponsors")
  15.  * @IsGranted("VIEW", subject="organization")
  16.  * @IsGranted("FRONT_END", subject="campaign")
  17.  */
  18. class SponsorshipController extends CoreController
  19. {
  20.     /**
  21.      * @Route("", name="all_sponsors", methods={"GET"})
  22.      */
  23.     public function searchAction(Organization $organizationCampaign $campaign)
  24.     {
  25.         $sponsorships      $this->getRepository('Sponsorship\Sponsorship')->findActiveForCampaign($campaign);
  26.         $sponsorshipLevels $this->getRepository('Sponsorship\SponsorshipLevel')->findAllActiveForCampaign($campaign);
  27.         // View All shows every visible sponsor (no frequency logic). Image-tier
  28.         // sponsors come first, grouped by level from the highest display rate
  29.         // down, alphabetical within each level; Base (name-only) sponsors follow
  30.         // in a single alphabetical list.
  31.         $visible array_filter($sponsorships, function (Sponsorship $sponsorship) {
  32.             return $sponsorship->isVisible();
  33.         });
  34.         $nameOf = function (Sponsorship $sponsorship) {
  35.             return strtolower($sponsorship->getCompany()
  36.                 ? $sponsorship->getCompany()->getName()
  37.                 : ($sponsorship->getDonor() ? $sponsorship->getDonor()->getName() : ''));
  38.         };
  39.         $byName = function (Sponsorship $aSponsorship $b) use ($nameOf) {
  40.             return $nameOf($a) <=> $nameOf($b);
  41.         };
  42.         $imageByLevel  = [];
  43.         $baseSponsors  = [];
  44.         foreach ($visible as $sponsorship) {
  45.             if ($sponsorship->isNameOnly()) {
  46.                 $baseSponsors[] = $sponsorship;
  47.             } elseif ($sponsorship->getImage()) {
  48.                 $imageByLevel[$sponsorship->getLevel()->getId()][] = $sponsorship;
  49.             }
  50.         }
  51.         usort($baseSponsors$byName);
  52.         // findAllActiveForCampaign() orders by slots ASC; reverse for high → low.
  53.         $sponsorGroups = [];
  54.         foreach (array_reverse($sponsorshipLevels) as $level) {
  55.             if ((int) $level->getSlots() <= 1) {
  56.                 continue; // Base level is handled as name-only below.
  57.             }
  58.             if (empty($imageByLevel[$level->getId()])) {
  59.                 continue;
  60.             }
  61.             $group $imageByLevel[$level->getId()];
  62.             usort($group$byName);
  63.             $sponsorGroups[] = ['level' => $level'sponsors' => $group];
  64.         }
  65.         return $this->render('@BidcozFrontend/Sponsorship/all.html.twig', [
  66.             'organization'  => $organization,
  67.             'campaign'      => $campaign,
  68.             'sponsorGroups' => $sponsorGroups,
  69.             'baseSponsors'  => $baseSponsors,
  70.             'hasSponsors'   => count($sponsorGroups) > || count($baseSponsors) > 0,
  71.         ]);
  72.     }
  73.     /**
  74.      * @Route("/advertise", name="campaign_sponsor")
  75.      */
  76.     public function createAction(Request $requestOrganization $organizationCampaign $campaign)
  77.     {
  78.         $user        $this->getUser();
  79.         $sponsorship $this->createSponsorship($campaign$user);
  80.         $form        $this->getSponsorshipForm($campaign$sponsorship);
  81.         if ('POST' === $request->getMethod()) {
  82.             if (!$user) {
  83.                 $this->messageAccessDeniedException('You must login or create an account to create a sponsorship');
  84.             }
  85.             $form->handleRequest($request);
  86.             if ($form->isSubmitted() && $form->isValid()) {
  87.                 $this->getEntityManager()->persist($sponsorship);
  88.                 $this->getPurchaseManager()->createSponsorshipPurchase($campaign$user$sponsorship);
  89.                 $this->getEntityManager()->flush();
  90.                 return $this->redirectToRoute('account_campaign_purchases', [
  91.                     'orgSlug'      => $organization->getSlug(),
  92.                     'campaignSlug' => $campaign->getSlug(),
  93.                 ]);
  94.             }
  95.         }
  96.         return $this->render('@BidcozFrontend/Sponsorship/new.html.twig', [
  97.             'organization' => $organization,
  98.             'campaign'     => $campaign,
  99.             'sponsorship'  => $sponsorship,
  100.             'levels'       => $this->getRepository('Sponsorship\SponsorshipLevel')->findAllActiveForCampaign($campaign),
  101.             'form'         => $form->createView(),
  102.         ]);
  103.     }
  104.     protected function createSponsorship(Campaign $campaignUser $user null)
  105.     {
  106.         $sponsorship = new Sponsorship($campaign);
  107.         $sponsorship->setActive(false);
  108.         if ($user) {
  109.             $sponsorship->setDonor($user);
  110.         }
  111.         return $sponsorship;
  112.     }
  113.     protected function getSponsorshipForm(Campaign $campaignSponsorship $sponsorship)
  114.     {
  115.         return $this->createForm(SponsorshipType::class, $sponsorship, [
  116.             'campaign' => $campaign,
  117.         ]);
  118.     }
  119. }