src/Bidcoz/Bundle/FrontendBundle/Controller/Auction/AuctionController.php line 30

Open in your IDE?
  1. <?php
  2. namespace Bidcoz\Bundle\FrontendBundle\Controller\Auction;
  3. use Bidcoz\Bundle\CoreBundle\Controller\CoreController;
  4. use Bidcoz\Bundle\CoreBundle\Entity\Auction\Auction;
  5. use Bidcoz\Bundle\CoreBundle\Entity\Auction\Bid;
  6. use Bidcoz\Bundle\CoreBundle\Entity\Auction\ItemSaleType;
  7. use Bidcoz\Bundle\CoreBundle\Entity\Auction\WatchListItem;
  8. use Bidcoz\Bundle\CoreBundle\Entity\Campaign;
  9. use Bidcoz\Bundle\CoreBundle\Entity\Organization;
  10. use Bidcoz\Bundle\FrontendBundle\Filter\ItemFilterType;
  11. use Bidcoz\Bundle\FrontendBundle\Filter\Order\ItemOrderType;
  12. use Doctrine\ORM\QueryBuilder;
  13. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  14. use Symfony\Component\Form\Form;
  15. use Symfony\Component\HttpFoundation\Request;
  16. use Symfony\Component\Routing\Annotation\Route;
  17. /**
  18.  * @Route("/{orgSlug}/{campaignSlug}/auction")
  19.  * @IsGranted("VIEW", subject="organization")
  20.  * @IsGranted("FRONT_END", subject="campaign")
  21.  */
  22. class AuctionController extends CoreController
  23. {
  24.     /**
  25.      * @Route("/list", name="auction_catalog")
  26.      */
  27.     public function catalogAction(Request $requestOrganization $organizationCampaign $campaignAuction $auction)
  28.     {
  29.         $qb $this->getRepository('Auction\Item')->getAuctionQueryBuilder($auctiontruefalse);
  30.         $filterForm $this->getItemFilterForm($auction);
  31.         $hasFilter  $this->applyFilters($request$filterForm$qb);
  32.         $orderForm $this->getItemOrderForm($auction);
  33.         $hasOrder  $this->applyOrder($request$orderForm$qb);
  34.         $activeTab $this->applyTabFilter($request$qb);
  35.         $items $this->getPagination($qb);
  36.         return $this->render('@BidcozFrontend/Auction/catalog.html.twig', [
  37.             'type'         => 'auction',
  38.             'title'        => 'Auction Catalog',
  39.             'organization' => $organization,
  40.             'campaign'     => $campaign,
  41.             'auction'      => $auction,
  42.             'filterForm'   => $filterForm->createView(),
  43.             'orderForm'    => $orderForm->createView(),
  44.             'items'        => $items,
  45.             'activeTab'    => $activeTab,
  46.             'hasFilter'    => $hasFilter || $hasOrder || 'all' !== $activeTab,
  47.             'requireCC'    => !$this->isGranted('WITH_CC'$campaign),
  48.         ]);
  49.     }
  50.     /**
  51.      * Applies the catalog pill-tab filter (All Items / Auction / Fixed Price /
  52.      * Active Bids / No Bids Yet) to the query. Returns the resolved active tab.
  53.      */
  54.     protected function applyTabFilter(Request $requestQueryBuilder $qb): string
  55.     {
  56.         $tab              $request->query->get('tab''all');
  57.         $activeBidsExists 'SELECT tb.id FROM '.Bid::class.' tb WHERE tb.item = i AND tb.active = true';
  58.         switch ($tab) {
  59.             case 'auction':
  60.                 $qb->andWhere('i.saleType = :tab_sale_type')
  61.                     ->setParameter('tab_sale_type'ItemSaleType::AUCTION);
  62.                 break;
  63.             case 'fixed':
  64.                 $qb->andWhere('i.saleType = :tab_sale_type')
  65.                     ->setParameter('tab_sale_type'ItemSaleType::FIXED_PRICE);
  66.                 break;
  67.             case 'active-bids':
  68.                 $qb->andWhere($qb->expr()->exists($activeBidsExists));
  69.                 break;
  70.             case 'no-bids':
  71.                 $qb->andWhere('i.saleType = :tab_sale_type')
  72.                     ->setParameter('tab_sale_type'ItemSaleType::AUCTION)
  73.                     ->andWhere($qb->expr()->not($qb->expr()->exists($activeBidsExists)));
  74.                 break;
  75.             case 'watchlist':
  76.                 $user $this->getUser();
  77.                 if ($user) {
  78.                     $qb->andWhere($qb->expr()->exists(
  79.                         'SELECT tw.id FROM '.WatchListItem::class.' tw WHERE tw.item = i AND tw.user = :tab_wl_user'
  80.                     ))->setParameter('tab_wl_user'$user);
  81.                 } else {
  82.                     $tab 'all';
  83.                 }
  84.                 break;
  85.             default:
  86.                 $tab 'all';
  87.                 break;
  88.         }
  89.         return $tab;
  90.     }
  91.     protected function getItemFilterForm(Auction $auction)
  92.     {
  93.         return $this->createForm(ItemFilterType::class, null, [
  94.             'auction'            => $auction,
  95.             'permission_manager' => $this->getAuctionPermissionManager(),
  96.         ]);
  97.     }
  98.     protected function getItemOrderForm(Auction $auction)
  99.     {
  100.         return $this->createForm(ItemOrderType::class);
  101.     }
  102.     protected function applyOrder(Request $requestForm $orderFormQueryBuilder $qb)
  103.     {
  104.         try {
  105.             if ($request->query->has($orderForm->getName())) {
  106.                 $orderForm->submit($request->query->get($orderForm->getName()));
  107.                 $sortKey        $orderForm->get('order')->getData();
  108.                 $orderQuery     ItemOrderType::getMap()[$sortKey];
  109.                 $fieldsAndOrder explode(','$orderQuery);
  110.                 foreach ($fieldsAndOrder as $idx => $fieldAndOrder) {
  111.                     [$field$order] = explode(':'$fieldAndOrder);
  112.                     // If sorting by bid count, remove fixed priced items
  113.                     if ('bidCount' === $field) {
  114.                         $qb->andWhere($qb->expr()->neq('i.saleType'':fixed_price_sale_type'));
  115.                     }
  116.                     if (=== $idx) {
  117.                         $qb->orderBy($field$order);
  118.                     } else {
  119.                         $qb->addorderBy($field$order);
  120.                     }
  121.                 }
  122.                 return true;
  123.             }
  124.         } catch (\Exception $e) {
  125.         }
  126.         return false;
  127.     }
  128. }