<?php
namespace Bidcoz\Bundle\FrontendBundle\Controller\Auction;
use Bidcoz\Bundle\CoreBundle\Controller\CoreController;
use Bidcoz\Bundle\CoreBundle\Entity\Auction\FundANeed;
use Bidcoz\Bundle\CoreBundle\Entity\Campaign;
use Bidcoz\Bundle\CoreBundle\Entity\Organization;
use Bidcoz\Bundle\FrontendBundle\Filter\ItemFilterType;
use Bidcoz\Bundle\FrontendBundle\Filter\Order\ItemOrderType;
use Doctrine\ORM\QueryBuilder;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Symfony\Component\Form\Form;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
/**
* @Route("/{orgSlug}/{campaignSlug}/fund-a-need")
* @IsGranted("VIEW", subject="organization")
* @IsGranted("FRONT_END", subject="campaign")
*/
class FundANeedController extends CoreController
{
/**
* @Route("/list", name="fund_a_need_catalog")
*/
public function catalogAction(Request $request, Organization $organization, Campaign $campaign, FundANeed $fundANeed)
{
$qb = $this->getRepository('Auction\Item')->getAuctionQueryBuilder($fundANeed, true, false);
$filterForm = $this->getItemFilterForm($fundANeed);
$hasFilter = $this->applyFilters($request, $filterForm, $qb);
$orderForm = $this->getItemOrderForm($fundANeed);
$hasOrder = $this->applyOrder($request, $orderForm, $qb);
$items = $this->getPagination($qb);
return $this->render('@BidcozFrontend/Auction/catalog.html.twig', [
'type' => 'fund-a-need',
'title' => $campaign->getFundANeedDisplayName().' Catalog',
'organization' => $organization,
'campaign' => $campaign,
'auction' => $fundANeed,
'filterForm' => $filterForm->createView(),
'orderForm' => $orderForm->createView(),
'items' => $items,
'hasFilter' => $hasFilter || $hasOrder,
'requireCC' => !$this->isGranted('WITH_CC', $campaign),
]);
}
protected function getItemFilterForm(FundANeed $fundANeed)
{
return $this->createForm(ItemFilterType::class, null, [
'auction' => $fundANeed,
'permission_manager' => $this->getAuctionPermissionManager(),
]);
}
protected function getItemOrderForm(FundANeed $fundANeed)
{
return $this->createForm(ItemOrderType::class);
}
protected function applyOrder(Request $request, Form $orderForm, QueryBuilder $qb)
{
try {
if ($request->query->has($orderForm->getName())) {
$orderForm->submit($request->query->get($orderForm->getName()));
$sortKey = $orderForm->get('order')->getData();
$orderQuery = ItemOrderType::getMap()[$sortKey];
$fieldsAndOrder = explode(',', $orderQuery);
foreach ($fieldsAndOrder as $idx => $fieldAndOrder) {
[$field, $order] = explode(':', $fieldAndOrder);
if (0 === $idx) {
$qb->orderBy($field, $order);
} else {
$qb->addorderBy($field, $order);
}
}
return true;
}
} catch (\Exception $e) {
}
return false;
}
}