<?php
namespace Bidcoz\Bundle\FrontendBundle\Controller;
use Bidcoz\Bundle\CoreBundle\Controller\CoreController;
use Bidcoz\Bundle\CoreBundle\Entity\Campaign;
use Bidcoz\Bundle\CoreBundle\Entity\Organization;
use Bidcoz\Bundle\CoreBundle\Entity\Sponsorship\Sponsorship;
use Bidcoz\Bundle\CoreBundle\Entity\User;
use Bidcoz\Bundle\FrontendBundle\Form\Type\SponsorshipType;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
/**
* @Route("/{orgSlug}/{campaignSlug}/sponsors")
* @IsGranted("VIEW", subject="organization")
* @IsGranted("FRONT_END", subject="campaign")
*/
class SponsorshipController extends CoreController
{
/**
* @Route("", name="all_sponsors", methods={"GET"})
*/
public function searchAction(Organization $organization, Campaign $campaign)
{
$sponsorships = $this->getRepository('Sponsorship\Sponsorship')->findActiveForCampaign($campaign);
$sponsorshipLevels = $this->getRepository('Sponsorship\SponsorshipLevel')->findAllActiveForCampaign($campaign);
// View All shows every visible sponsor (no frequency logic). Image-tier
// sponsors come first, grouped by level from the highest display rate
// down, alphabetical within each level; Base (name-only) sponsors follow
// in a single alphabetical list.
$visible = array_filter($sponsorships, function (Sponsorship $sponsorship) {
return $sponsorship->isVisible();
});
$nameOf = function (Sponsorship $sponsorship) {
return strtolower($sponsorship->getCompany()
? $sponsorship->getCompany()->getName()
: ($sponsorship->getDonor() ? $sponsorship->getDonor()->getName() : ''));
};
$byName = function (Sponsorship $a, Sponsorship $b) use ($nameOf) {
return $nameOf($a) <=> $nameOf($b);
};
$imageByLevel = [];
$baseSponsors = [];
foreach ($visible as $sponsorship) {
if ($sponsorship->isNameOnly()) {
$baseSponsors[] = $sponsorship;
} elseif ($sponsorship->getImage()) {
$imageByLevel[$sponsorship->getLevel()->getId()][] = $sponsorship;
}
}
usort($baseSponsors, $byName);
// findAllActiveForCampaign() orders by slots ASC; reverse for high → low.
$sponsorGroups = [];
foreach (array_reverse($sponsorshipLevels) as $level) {
if ((int) $level->getSlots() <= 1) {
continue; // Base level is handled as name-only below.
}
if (empty($imageByLevel[$level->getId()])) {
continue;
}
$group = $imageByLevel[$level->getId()];
usort($group, $byName);
$sponsorGroups[] = ['level' => $level, 'sponsors' => $group];
}
return $this->render('@BidcozFrontend/Sponsorship/all.html.twig', [
'organization' => $organization,
'campaign' => $campaign,
'sponsorGroups' => $sponsorGroups,
'baseSponsors' => $baseSponsors,
'hasSponsors' => count($sponsorGroups) > 0 || count($baseSponsors) > 0,
]);
}
/**
* @Route("/advertise", name="campaign_sponsor")
*/
public function createAction(Request $request, Organization $organization, Campaign $campaign)
{
$user = $this->getUser();
$sponsorship = $this->createSponsorship($campaign, $user);
$form = $this->getSponsorshipForm($campaign, $sponsorship);
if ('POST' === $request->getMethod()) {
if (!$user) {
$this->messageAccessDeniedException('You must login or create an account to create a sponsorship');
}
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$this->getEntityManager()->persist($sponsorship);
$this->getPurchaseManager()->createSponsorshipPurchase($campaign, $user, $sponsorship);
$this->getEntityManager()->flush();
return $this->redirectToRoute('account_campaign_purchases', [
'orgSlug' => $organization->getSlug(),
'campaignSlug' => $campaign->getSlug(),
]);
}
}
return $this->render('@BidcozFrontend/Sponsorship/new.html.twig', [
'organization' => $organization,
'campaign' => $campaign,
'sponsorship' => $sponsorship,
'levels' => $this->getRepository('Sponsorship\SponsorshipLevel')->findAllActiveForCampaign($campaign),
'form' => $form->createView(),
]);
}
protected function createSponsorship(Campaign $campaign, User $user = null)
{
$sponsorship = new Sponsorship($campaign);
$sponsorship->setActive(false);
if ($user) {
$sponsorship->setDonor($user);
}
return $sponsorship;
}
protected function getSponsorshipForm(Campaign $campaign, Sponsorship $sponsorship)
{
return $this->createForm(SponsorshipType::class, $sponsorship, [
'campaign' => $campaign,
]);
}
}