src/Controller/Front/AnimalController.php line 251
<?php
namespace App\Controller\Front;
use App\Entity\Animal;
use App\Entity\AnimalPoll;
use App\Entity\AnimalPollStatus;
use App\Entity\AnimalSearch;
use App\Entity\BlogCategory;
use App\Entity\BlogNote;
use App\Entity\KidAcceptance;
use App\Entity\LifeStyle;
use App\Entity\NotAccepting;
use App\Entity\PreferableLive;
use App\Entity\Rotator;
use App\Entity\RotatorPlace;
use App\Entity\RotatorType;
use App\Entity\Sex;
use App\Entity\Species;
use App\Entity\TimeCareNeeded;
use App\Repository\AnimalPollRepository;
use App\Repository\AnimalPollStatusRepository;
use App\Repository\AnimalRepository;
use App\Repository\AnimalSearchRepository;
use App\Repository\BlogCategoryRepository;
use App\Repository\BlogNoteRepository;
use App\Repository\KidAcceptanceRepository;
use App\Repository\LifeStyleRepository;
use App\Repository\PreferableLiveRepository;
use App\Repository\RotatorRepository;
use App\Repository\SpeciesRepository;
use App\Repository\TimeCareNeededRepository;
use App\Service\AdoptionPollService;
use App\Service\AnimalService;
use App\Service\ImageService;
use Doctrine\Persistence\ManagerRegistry;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\Generator\UrlGenerator;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
use Symfony\Component\Serializer\Serializer;
class AnimalController extends AbstractController
{
const
ANIMAL_SEARCH_COOKIE = 'animalSearch',
ANIMAL_SEARCH_SEED = 'animalOrderSeed';
private $_aTranslate = [
'pies' => Species::TYPE_DOG,
'kot' => Species::TYPE_CAT,
'samica' => 'Żeńska',
'samiec' => 'Męska',
'maly' => 'Mały',
'sredni' => 'Średni',
'duzy' => 'Duży',
'kanapowiec' => 'home',
'srednio-aktywny' => 'middle-active',
'bardzo-aktywny' => 'very-active',
'od-0-do-4-lat' => 'to5',
'od-0-do-5-lat' => 'to5',
'od-5-do-10-lat' => 'to10',
'powyzej-10-lat' => 'over10',
'do-6-godzin' => 'to6',
'zawsze-ktos-jest-w-domu' => 'always',
'powyzej-6-godzin' => 'over6',
'ponad-6-godzin' => 'over6',
];
#[Route('/adopciaki/wszystkie/{page}', 'animals_all')]
public function allAnimalsAction(Request $request, ManagerRegistry $doctrine, PaginatorInterface $paginator, $page = 1)
{
$searchCriteria = [
'isPublished' => true,
];
$animalsQb = $doctrine->getRepository(Animal::class)->findAllAdvancedSearchQb(
$searchCriteria,
false,
$this->getOrderSeed($request)
);
if($request->isXmlHttpRequest()) {
$page = $request->query->get('page');
return $this->render(
'front/animal/list.html.twig',
[
'animals' => $paginator->paginate($animalsQb, $page, 20)
]
);
}
return $this->render(
'front/animal/index.html.twig',
[
'animals' => $paginator->paginate($animalsQb, $page, 20)
]
);
}
#[Route('/adopciaki/szukaj/{page}')]
public function searchAction(Request $request, ManagerRegistry $doctrine, PaginatorInterface $paginator, $page = 1)
{
$search = $request->get('search');
$animalsQb = $doctrine->getRepository(Animal::class)->searchByName($search);
if($request->isXmlHttpRequest()) {
$page = $request->query->get('page');
return $this->render(
'front/animal/list.html.twig',
[
'animals' => $paginator->paginate($animalsQb, $page, 20)
]
);
}
return $this->render(
'front/animal/index.html.twig',
[
'animals' => $paginator->paginate($animalsQb, $page, 20)
]
);
}
#[Route('/adopciaki/adoptowane/{page}')]
public function adoptedAction(Request $request, ManagerRegistry $doctrine, PaginatorInterface $paginator, $page = 1)
{
$animalsQb = $doctrine->getRepository(Animal::class)->findAllAdvancedSearchQb([], true, $this->getOrderSeed($request));
if($request->isXmlHttpRequest()) {
$page = $request->query->get('page');
return $this->render(
'front/animal/list.html.twig',
[
'animals' => $paginator->paginate($animalsQb, $page, 20)
]
);
}
return $this->render(
'front/animal/index.html.twig',
[
'animals' => $paginator->paginate($animalsQb, $page, 20)
//'searchForm' => $searchForm->createView(),
]
);
}
#[Route('/adopciaki/koty/{page}')]
public function allCatsAction(Request $request, ManagerRegistry $doctrine, PaginatorInterface $paginator, $page = 1)
{
$searchCriteria = [
'species' => 2,
'isPublished' => true,
];
$animalsQb = $doctrine->getRepository(Animal::class)->findAllAdvancedSearchQb(
$searchCriteria,
false,
$this->getOrderSeed($request)
);
if($request->isXmlHttpRequest()) {
$page = $request->query->get('page');
return $this->render(
'front/animal/list.html.twig',
[
'animals' => $paginator->paginate($animalsQb, $page, 20)
]
);
}
return $this->render(
'front/animal/index.html.twig',
[
'animals' => $paginator->paginate($animalsQb, $page, 20)
]
);
}
#[Route('/adopciaki/psy/{page}')]
public function allDogsAction(Request $request, ManagerRegistry $doctrine, PaginatorInterface $paginator, $page = 1)
{
$searchCriteria = [
'species' => 1,
'isPublished' => true,
];
$animalsQb = $doctrine->getRepository(Animal::class)->findAllAdvancedSearchQb(
$searchCriteria,
false,
$this->getOrderSeed($request)
);
if($request->isXmlHttpRequest()) {
$page = $request->query->get('page');
return $this->render(
'front/animal/list.html.twig',
[
'animals' => $paginator->paginate($animalsQb, $page, 20)
]
);
}
return $this->render(
'front/animal/index.html.twig',
[
'animals' => $paginator->paginate($animalsQb, $page, 20)
]
);
}
#[Route('/adopciak/{id}/{name}', name: 'base_front_animal_single')]
public function singleAction($id, AnimalService $animalService, ManagerRegistry $doctrine)
{
$animal = $animalService->getSingleAnimal($id, false);
$similarAnimals = $animalService->getSimilarAnimals($animal);
$notes = $doctrine->getRepository(BlogNote::class)->findBy(['animal' => $animal, 'isPublished' => true]);
// $poll = $doctrine->getRepository(AnimalPoll::class)->findBy(
// ['createdBy' => $this->getUser()],
// ['id' => 'DESC']
// );
return $this->render(
'front/animal/single.html.twig',
[
'animal' => $animal,
// 'poll' => $poll,
'notes' => $notes,
'similarAnimals' => $similarAnimals
]
);
}
#[Route('/adopciaki/{page}')]
public function indexAction(Request $request, ManagerRegistry $doctrine, AnimalService $animalService, PaginatorInterface $paginator, $page = 1)
{
$searchCriteria = $this->_getSearchCriteria($request, $animalService, $doctrine);
$animalsQb = $doctrine->getRepository(Animal::class)->findAllAdvancedSearchQb(
$searchCriteria,
false,
$this->getOrderSeed($request)
);
if($request->isXmlHttpRequest()) {
$page = $request->query->get('page');
return $this->render(
'front/animal/list.html.twig',
[
'animals' => $paginator->paginate($animalsQb, $page, 20),
'searchCriteria' => $searchCriteria
]
);
}
return $this->render(
'front/animal/index.html.twig',
[
'animals' => $paginator->paginate($animalsQb, $page, 20),
'searchCriteria' => []
]
);
}
#[Route('/{id}/ankieta/{animalPollToken}/{step}')]
public function pollAction(Request $request, AdoptionPollService $adoptionPollService, $id, $animalPollToken = 0, $step = 0)
{
$animalPoll = $adoptionPollService->preparePollEntity($id, $animalPollToken);
$returnForm = $adoptionPollService->prepareForm($animalPoll);
//synchronize steps if necessary
if (!$request->isMethod('POST') && $step != $animalPoll->getCurrentStep()) {
return $this->redirectToRoute(
$request->get('_route'),
['id' => $id, 'step' => $animalPoll->getCurrentStep(), 'animalPollToken' => $animalPoll->getToken()]
);
}
if ($request->isXmlHttpRequest()) {
return new JsonResponse(['msg' => 'saved'], 200);
}
return $this->render(
'front/animal/poll.html.twig',
[
'pollForm' => $returnForm->createView(),
'animalPoll' => $animalPoll,
'animal' => $this->getAnimalRepository()->find($id),
]
);
}
#[Route('/catalog600x600.csv')]
public function productCatalogAction()
{
$router = $this->get('router');
$rows = array();
$aHeaderData = $this->getCatalogHeaderData();
$rows[] = implode(',', $aHeaderData);
$animals = $this->getAnimalRepository()->getWithNoRejectedPolls();
foreach ($animals as $animal) {
$file = $animal->getFbSqImageId();
$kidAcceptance = $this->getKidAcceptanceForCatalog($animal);
if (!$animal->getPreferableLives()->first()) {
$sPreferableLive = 'Dom z ogrodem';
} else {
$sPreferableLive = $animal->getPreferableLives()->first()->getName();
}
$data = [
$animal->getId(),
'in stock',
'new',
'"'.str_replace(array("\r", "\n"), "", strip_tags($animal->getShortDescription())).'"',
$router->generate('base_file_index', ['id' => $file], UrlGenerator::ABSOLUTE_URL),
$router->generate(
'base_front_animal_single',
['id' => $animal->getId(), 'name' => $animal->getName()],
UrlGenerator::ABSOLUTE_URL
),
$animal->getName(),
'0 PLN',
'Adopciaki',
'Animals & Pet Supplies',
$animal->getSpecies()->getName(),
$animal->getLifestyle()->getName(),
$sPreferableLive,
'"'.$kidAcceptance.'"',
$animal->getTimeCareNeeded()->getName(),
];
$rows[] = implode(',', $data);
}
$content = implode("\n", $rows);
$response = new Response();
$response->headers->set('Content-Type', "text/plain;charset=utf-8");
$response->headers->set('Content-Disposition', 'inline;filename="catalog600x600.csv"');
$response->headers->set('Pragma', "no-cache");
$response->headers->set('Expires', "0");
$response->headers->set('Content-Transfer-Encoding', "binary");
$response->sendHeaders();
$response->setContent($content);
return $response;
}
#[Route('/catalog1280x628.csv')]
public function productCatalogLargeFBAction()
{
$router = $this->get('router');
$rows = array();
$aHeaderData = $this->getCatalogHeaderData();
$rows[] = implode(',', $aHeaderData);
$animals = $this->getAnimalRepository()->getWithNoRejectedPolls();
foreach ($animals as $animal) {
$kidAcceptance = $this->getKidAcceptanceForCatalog($animal);
$file = $animal->getFbLargeImageId();
if (!$animal->getPreferableLives()->first()) {
$sPreferableLive = 'Dom z ogrodem';
} else {
$sPreferableLive = $animal->getPreferableLives()->first()->getName();
}
$data = [
$animal->getId(),
'in stock',
'new',
'"'.str_replace(array("\r", "\n"), "", strip_tags($animal->getShortDescription())).'"',
$router->generate('base_file_index', ['id' => $file], UrlGenerator::ABSOLUTE_URL),
$router->generate(
'base_front_animal_single',
['id' => $animal->getId(), 'name' => $animal->getName()],
UrlGenerator::ABSOLUTE_URL
),
$animal->getName(),
'0 PLN',
'Adopciaki',
'Animals & Pet Supplies',
$animal->getSpecies()->getName(),
$animal->getLifestyle()->getName(),
$sPreferableLive,
'"'.$kidAcceptance.'"',
$animal->getTimeCareNeeded()->getName(),
];
$rows[] = implode(',', $data);
}
$content = implode("\n", $rows);
$response = new Response();
$response->headers->set('Content-Type', "text/plain;charset=utf-8");
$response->headers->set('Content-Disposition', 'inline;filename="catalog1280x628.csv"');
$response->headers->set('Pragma', "no-cache");
$response->headers->set('Expires', "0");
$response->headers->set('Content-Transfer-Encoding', "binary");
$response->sendHeaders();
$response->setContent($content);
return $response;
}
private function getKidAcceptanceForCatalog($animal)
{
$aData = [];
$kidAcceptances = $animal->getKidAcceptances();
if ($kidAcceptances->isEmpty()) {
return '0';
}
$aNameVal = [
'to5' => '5',
'to10' => '10',
'over10' => '10+',
];
foreach ($kidAcceptances as $acceptance) {
$name = $acceptance->getSlug();
array_push($aData, $aNameVal[$name]);
}
return implode(',', $aData);
}
private function _getTranslatedValue($urlSearch)
{
$aTranslate = $this->_aTranslate;
if (isset($aTranslate[$urlSearch])) {
return $aTranslate[$urlSearch];
}
return '';
}
private function getCatalogHeaderData()
{
$aHeaderData = [
'id',
'availability',
'condition',
'description',
'image_link',
'link',
'title',
'price',
'brand',
'google_product_category',
'color',
'material',
'pattern',
'product_type',
'custom_label_0',
];
return $aHeaderData;
}
/**
* @param Request $request
* @return int
*/
private function getOrderSeed(Request $request)
{
if ($request->getSession()->has(self::ANIMAL_SEARCH_SEED)) {
return $request->getSession()->get(self::ANIMAL_SEARCH_SEED);
} else {
$seed = rand(1, 99);
$request->getSession()->set(self::ANIMAL_SEARCH_SEED, $seed);
return $seed;
}
}
/**
* @param Request $request
* @return array
* @todo Move it into animal service
*/
private function _getSearchCriteria(Request $request, AnimalService $animalService, ManagerRegistry $doctrine)
{
// if($this->getUser()) {
// $searchData = $doctrine->getRepository(AnimalSearch::class)->findOneBy(['user' => $this->getUser()]);
// }
if (empty($searchData)) {
$searchData = unserialize($request->cookies->get(self::ANIMAL_SEARCH_COOKIE));
if (empty($searchData)) {
$searchData = new AnimalSearch();
}
}
if (!is_null($request->get('szukaj'))) {
$aUrlSearch = explode(',', $request->get('szukaj'));
//Zwierzak
if (empty($aUrlSearch[0])) {
$searchData->setSpecies(null);
} else {
$specie = $doctrine->getRepository(Species::class)->findOneBy(
['type' => $this->_getTranslatedValue($aUrlSearch[0])]
);
$searchData->setSpecies($specie);
}
//Płeć
if (empty($aUrlSearch[1])) {
$searchData->getSex()->clear();
} else {
$sexArray = explode(';', $aUrlSearch[1]);
$searchData->getSex()->clear();
foreach ($sexArray as $item) {
$sex = $doctrine->getRepository(Sex::class)->findOneBy(
['name' => $this->_getTranslatedValue($item)]
);
$searchData->addSex($sex);
}
}
//Wiek
if (empty($aUrlSearch[2])) {
$searchData->getAge()->clear();
} else {
$ageArray = explode(';', $aUrlSearch[2]);
$searchData->getAge()->clear();
foreach ($ageArray as $age) {
$searchData->addAge($age);
}
}
//Waga
if (empty($aUrlSearch[3])) {
$searchData->getSize()->clear();
} else {
$weightArray = explode(';', $aUrlSearch[3]);
$searchData->getSize()->clear();
foreach ($weightArray as $weight) {
$searchData->addSize($this->_getTranslatedValue($weight));
}
}
//Aktywność
if (empty($aUrlSearch[4])) {
$searchData->setLifeStyle(null);
} else {
$lifeStyle = $doctrine->getRepository(LifeStyle::class)->findOneBy(
['slug' => $this->_getTranslatedValue($aUrlSearch[4])]
);
$searchData->setLifeStyle($lifeStyle);
}
//Czy masz dzieci?
if (empty($aUrlSearch[5]) || $aUrlSearch[5] === 'nie-mam-dzieci') {
$searchData->getKidAcceptances()->clear();
} else {
$aKids = explode(';', $aUrlSearch[5]);
$searchData->getKidAcceptances()->clear();
foreach ($aKids as $Kid) {
$searchData->addKidAcceptance($Kid);
}
}
//Czy masz inne zwierzęta?
if (empty($aUrlSearch[6])) {
$searchData->getAnimalAcceptances()->clear();
} else {
$aKids = explode(';', $aUrlSearch[6]);
$searchData->getAnimalAcceptances()->clear();
foreach ($aKids as $Kid) {
$searchData->addAnimalAcceptances($Kid);
}
}
//Jak długo zwierzak będzie zostawał sam?
if (empty($aUrlSearch[7])) {
$searchData->setTimeCareNeeded(null);
} else {
$timeCare = $doctrine->getRepository(TimeCareNeeded::class)->findOneBy(
['slug' => $this->_getTranslatedValue($aUrlSearch[7])]
);
$searchData->setTimeCareNeeded($timeCare);
}
return $animalService->prepareAdvancedSearchCriteria($searchData);
}
return $animalService->prepareAdvancedSearchCriteria($searchData);
}
/**
* @param array $data
*/
private function setSearchCookie($data)
{
$response = new Response();
$cookie = new Cookie(self::ANIMAL_SEARCH_COOKIE, serialize($data), 0, '/', null, false, false);
$response->headers->setCookie($cookie);
$response->send();
}
/**
* @param array $data
*/
private function deleteSearchCookie()
{
$response = new Response();
$response->headers->clearCookie(self::ANIMAL_SEARCH_COOKIE);
$response->send();
}
}