src/Controller/Frontend/Properties/PropertyController.php line 285

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Frontend\Properties;
  3. use App\Entity\Properties\Area;
  4. use App\Entity\Properties\Feature;
  5. use App\Entity\Properties\Image;
  6. use App\Entity\Properties\Property;
  7. use App\Entity\Properties\Type;
  8. use App\Form\Frontend\Properties\PropertyEnquiryForm;
  9. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  10. use Symfony\Component\HttpFoundation\Request;
  11. use Symfony\Component\HttpFoundation\Response;
  12. use Symfony\Component\Routing\Annotation\Route;
  13. use Doctrine\ORM\EntityManagerInterface;
  14. use Knp\Component\Pager\PaginatorInterface;
  15. use App\Helper\ConfigHelper;
  16. use App\Helper\ContentHelper;
  17. use App\Helper\MailerHelper;
  18. use Doctrine\ORM\QueryBuilder;
  19. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  20. use Symfony\Component\Form\Extension\Core\Type\SubmitType;
  21. final class PropertyController extends AbstractController
  22. {
  23.     public function __construct(EntityManagerInterface $entityManagerPaginatorInterface $paginatorConfigHelper $configHelperContentHelper $contentHelperMailerHelper $mailerHelper)
  24.     {
  25.         $this->em $entityManager;
  26.         $this->paginator $paginator;
  27.         $this->configHelper $configHelper;
  28.         $this->contentHelper $contentHelper;
  29.         $this->mailerHelper $mailerHelper;
  30.         $this->paginator $paginator;
  31.     }
  32.     /**
  33.     * @Route("/lettings", name="frontend_properties_lettings")
  34.     */
  35.     public function lettings(Request $request): Response
  36.     {
  37.         // Filter arrays
  38.         $propertyFilter = [];
  39.         $propertyLookup = [
  40.             "listingType" => "letting",
  41.             "showOnWebsite" => true
  42.         ];
  43.         // Filtering by bedrooms (exact amount)
  44.         if(is_numeric($request->query->get('bedrooms')))
  45.         {
  46.             $propertyFilter['min_bedrooms'] = $request->query->get('bedrooms');
  47.             $propertyLookup[] = ["bedrooms""gte"$request->query->get('bedrooms')];
  48.             $propertyFilter['max_bedrooms'] = $request->query->get('bedrooms');
  49.             $propertyLookup[] = ["bedrooms""lte"$request->query->get('bedrooms')];
  50.         }
  51.         // Filtering by min bedrooms
  52.         if(is_numeric($request->query->get('min_bedrooms')))
  53.         {
  54.             $propertyFilter['min_bedrooms'] = $request->query->get('min_bedrooms');
  55.             $propertyLookup[] = ["bedrooms""gte"$request->query->get('min_bedrooms')];
  56.         }
  57.         // Filtering by max bedrooms
  58.         if(is_numeric($request->query->get('max_bedrooms')))
  59.         {
  60.             $propertyFilter['max_bedrooms'] = $request->query->get('max_bedrooms');
  61.             $propertyLookup[] = ["bedrooms""lte"$request->query->get('max_bedrooms')];
  62.         }
  63.         // Filtering by bathrooms
  64.         if(is_numeric($request->query->get('bathrooms')))
  65.         {
  66.             $propertyFilter['bathrooms'] = $request->query->get('bathrooms');
  67.             $propertyLookup[] = ["bathrooms""eq"$request->query->get('bathrooms')];
  68.         }
  69.         // Filtering by min price
  70.         if(is_numeric($request->query->get('min_price')))
  71.         {
  72.             $propertyFilter['min_price'] = $request->query->get('min_price');
  73.             $propertyLookup[] = ["monthlyRentalPrice""gte"$request->query->get('min_price') * 10];
  74.         }
  75.         // Filtering by max price
  76.         if(is_numeric($request->query->get('max_price')))
  77.         {
  78.             $propertyFilter['max_price'] = $request->query->get('max_price');
  79.             $propertyLookup[] = ["monthlyRentalPrice""lte"$request->query->get('max_price') * 10];
  80.         }
  81.         // Filtering by type
  82.         if(is_numeric($request->query->get('type')))
  83.         {
  84.             $theType $this->em->getRepository(Type::class)->findOneFiltered(["id" => $request->query->get('type')]);
  85.             if($theType)
  86.             {
  87.                 $propertyFilter['type'] = $theType;
  88.                 $propertyLookup[] = ["type""eq"$theType];
  89.             }
  90.         }
  91.         // Filtering by area
  92.         if(is_numeric($request->query->get('area')))
  93.         {
  94.             $theArea $this->em->getRepository(Area::class)->findOneFiltered(["id" => $request->query->get('area')]);
  95.             if($theArea)
  96.             {
  97.                 $propertyFilter['area'] = $theArea;
  98.                 $propertyLookup[] = ["area""eq"$theArea];
  99.             }
  100.         }
  101.         // Get properties
  102.         $properties $this->paginator->paginate($this->em->getRepository(Property::class)->buildQuery($propertyLookup), $request->query->getInt('page'1), 16);
  103.         // Get all property types
  104.         $allTypes $this->em->getRepository(Type::class)->findFiltered([]);
  105.         // Get all areas
  106.         $allAreas $this->em->getRepository(Area::class)->findFiltered([]);
  107.         // Render view
  108.         return $this->render('Frontend/Properties/lettings.html.twig', [
  109.             'properties' => $properties,
  110.             'propertyFilter' => $propertyFilter,
  111.             'allTypes' => $allTypes,
  112.             'allAreas' => $allAreas
  113.         ]);
  114.     }
  115.     /**
  116.     * @Route("/sales", name="frontend_properties_sales")
  117.     */
  118.     public function sales(Request $request): Response
  119.     {
  120.         // Filter arrays
  121.         $propertyFilter = [];
  122.         $propertyLookup = [
  123.             "listingType" => "sale",
  124.             "showOnWebsite" => true
  125.         ];
  126.         // Filtering by bedrooms (exact amount)
  127.         if(is_numeric($request->query->get('bedrooms')))
  128.         {
  129.             $propertyFilter['min_bedrooms'] = $request->query->get('bedrooms');
  130.             $propertyLookup[] = ["bedrooms""gte"$request->query->get('bedrooms')];
  131.             $propertyFilter['max_bedrooms'] = $request->query->get('bedrooms');
  132.             $propertyLookup[] = ["bedrooms""lte"$request->query->get('bedrooms')];
  133.         }
  134.         // Filtering by min bedrooms
  135.         if(is_numeric($request->query->get('min_bedrooms')))
  136.         {
  137.             $propertyFilter['min_bedrooms'] = $request->query->get('min_bedrooms');
  138.             $propertyLookup[] = ["bedrooms""gte"$request->query->get('min_bedrooms')];
  139.         }
  140.         // Filtering by max bedrooms
  141.         if(is_numeric($request->query->get('max_bedrooms')))
  142.         {
  143.             $propertyFilter['max_bedrooms'] = $request->query->get('max_bedrooms');
  144.             $propertyLookup[] = ["bedrooms""lte"$request->query->get('max_bedrooms')];
  145.         }
  146.         // Filtering by bathrooms
  147.         if(is_numeric($request->query->get('bathrooms')))
  148.         {
  149.             $propertyFilter['bathrooms'] = $request->query->get('bathrooms');
  150.             $propertyLookup[] = ["bathrooms""eq"$request->query->get('bathrooms')];
  151.         }
  152.         // Filtering by min price
  153.         if(is_numeric($request->query->get('min_price')))
  154.         {
  155.             $propertyFilter['min_price'] = $request->query->get('min_price');
  156.             $propertyLookup[] = ["salesPrice""gte"$request->query->get('min_price') * 10];
  157.         }
  158.         // Filtering by max price
  159.         if(is_numeric($request->query->get('max_price')))
  160.         {
  161.             $propertyFilter['max_price'] = $request->query->get('max_price');
  162.             $propertyLookup[] = ["salesPrice""lte"$request->query->get('max_price') * 10];
  163.         }
  164.         // Filtering by type
  165.         if(is_numeric($request->query->get('type')))
  166.         {
  167.             $theType $this->em->getRepository(Type::class)->findOneFiltered(["id" => $request->query->get('type')]);
  168.             if($theType)
  169.             {
  170.                 $propertyFilter['type'] = $theType;
  171.                 $propertyLookup[] = ["type""eq"$theType];
  172.             }
  173.         }
  174.         // Filtering by area
  175.         if(is_numeric($request->query->get('area')))
  176.         {
  177.             $theArea $this->em->getRepository(Area::class)->findOneFiltered(["id" => $request->query->get('area')]);
  178.             if($theArea)
  179.             {
  180.                 $propertyFilter['area'] = $theArea;
  181.                 $propertyLookup[] = ["area""eq"$theArea];
  182.             }
  183.         }
  184.         // Get properties
  185.         $properties $this->paginator->paginate($this->em->getRepository(Property::class)->buildQuery($propertyLookup), $request->query->getInt('page'1), 16);
  186.         // Get all property types
  187.         $allTypes $this->em->getRepository(Type::class)->findFiltered([]);
  188.         // Get all areas
  189.         $allAreas $this->em->getRepository(Area::class)->findFiltered([]);
  190.         // Render view
  191.         return $this->render('Frontend/Properties/sales.html.twig', [
  192.             'properties' => $properties,
  193.             'propertyFilter' => $propertyFilter,
  194.             'allTypes' => $allTypes,
  195.             'allAreas' => $allAreas
  196.         ]);
  197.     }
  198.     /**
  199.     * @Route("/property/{property_reference}", name="frontend_properties_viewproperty")
  200.     */
  201.     public function viewProperty(Request $requestint $property_reference 0): Response
  202.     {
  203.         // Get the property
  204.         $property $this->em->getRepository(Property::class)->findOneFiltered([
  205.             "reference" => $property_reference,
  206.             "showOnWebsite" => true
  207.         ]);
  208.         // Not found?
  209.         if(!$property)
  210.             throw new NotFoundHttpException("Property not found");
  211.         // Get images
  212.         $images $this->em->getRepository(Image::class)->findFiltered([
  213.             'property' => $property
  214.         ], [
  215.             "displayOrder" => "ASC"
  216.         ]);
  217.         // Get features (via property features)
  218.         $features $this->em->getRepository(Feature::class)->setup(function(string $aliasQueryBuilder $qb){
  219.             // Join propertyFeature
  220.             $qb->join($alias '.propertyFeatures''pf');
  221.             return $qb;
  222.         })->findFiltered([
  223.             'pf.property' => $property
  224.         ], []);
  225.         // Get similar propertoes
  226.         $similarProperties $this->em->getRepository(Property::class)->findFiltered([
  227.             "showOnWebsite" => true,
  228.             "listingType" => $property->getListingType(),
  229.             ["id""neq"$property->getId()],
  230.             ["or", [
  231.                 ["area""eq"$property->getArea()],
  232.                 ["bedrooms""eq"$property->getBedrooms()]
  233.             ]]
  234.         ], [], 3);
  235.         // Render view
  236.         return $this->render('Frontend/Properties/viewProperty.html.twig', [
  237.             'property' => $property,
  238.             'features' => $features,
  239.             'images' => $images,
  240.             'similarProperties' => $similarProperties
  241.         ]);
  242.     }
  243.     /**
  244.     * @Route("/property/{property_reference}/enquire", name="frontend_properties_propertyenquiry")
  245.     */
  246.     public function propertyEnquiry(Request $requestint $property_reference 0): Response
  247.     {
  248.         // Get the property
  249.         $property $this->em->getRepository(Property::class)->findOneFiltered([
  250.             "reference" => $property_reference,
  251.             "showOnWebsite" => true
  252.         ]);
  253.         // Not found?
  254.         if(!$property)
  255.             throw new NotFoundHttpException("Property not found");
  256.         // Get type form
  257.         $propertyEnquiryForm $this->createForm(PropertyEnquiryForm::class, [])
  258.             ->add('save'SubmitType::class, array(
  259.                 'label' => "Submit",
  260.                 'attr' => array(
  261.                     'class' => 'btn btn-primary'
  262.                 )
  263.             ));
  264.         // Handle the form
  265.         $propertyEnquiryForm->handleRequest($request);
  266.         // Form submitted
  267.         if($propertyEnquiryForm->isSubmitted())
  268.         {
  269.             // All valid?
  270.             if($propertyEnquiryForm->isValid())
  271.             {
  272.                 // Send the email
  273.                 $this->mailerHelper->send($this->configHelper->getValue('email_from'), "Property Enquiry: " implode(", "$property->getFullAddress()), "propertyEnquiry.html.twig", [
  274.                     "submitted" => [
  275.                         "name" => $propertyEnquiryForm->get('name')->getData(),
  276.                         "email" => $propertyEnquiryForm->get('email')->getData(),
  277.                         "phone" => $propertyEnquiryForm->get('phone')->getData(),
  278.                         "message" => $propertyEnquiryForm->get('message')->getData()
  279.                     ],
  280.                     "property" => $property
  281.                 ]);
  282.                 // Redirect
  283.                 return $this->redirect($this->generateUrl('frontend_properties_propertyenquiry_success', [
  284.                     "property_reference" => $property->getReference()
  285.                 ]));
  286.             }
  287.         }
  288.         // Render view
  289.         return $this->render('Frontend/Properties/propertyEnquiry.html.twig', [
  290.             'property' => $property,
  291.             'propertyEnquiryForm' => $propertyEnquiryForm->createView()
  292.         ]);
  293.     }
  294.     /**
  295.     * @Route("/property/{property_reference}/enquire/success", name="frontend_properties_propertyenquiry_success")
  296.     */
  297.     public function propertyEnquirySuccess(Request $requestint $property_reference 0): Response
  298.     {
  299.         // Render view
  300.         return $this->render('Frontend/Properties/propertyEnquirySuccess.html.twig');
  301.     }
  302. }