src/Controller/ReviewController.php line 293

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Carbon\Carbon;
  4. use CoreShop\Component\Customer\Context\CustomerContextInterface;
  5. use Pimcore;
  6. use Pimcore\Controller\FrontendController;
  7. use Pimcore\Db;
  8. use Pimcore\Model\DataObject\Data\ObjectMetadata;
  9. use Pimcore\Model\DataObject;
  10. use Pimcore\Model\DataObject\Book;
  11. use Pimcore\Model\DataObject\Review;
  12. use Pimcore\Model\DataObject\ReviewCriteria;
  13. use Pimcore\Model\DataObject\Serie;
  14. use Pimcore\Model\DataObject\Service;
  15. use Symfony\Component\HttpFoundation\Request;
  16. use Symfony\Component\HttpFoundation\Response;
  17. use Symfony\Component\Routing\Annotation\Route;
  18. class ReviewController extends FrontendController
  19. {
  20.     private $_currentCustomer = null;
  21.     private $_reviewPath = '';
  22.     public $productScoresRatingArray = [
  23.         0=>'Décevant, abandonné',
  24.         1=>'Décevant mais terminé',
  25.         2=>'A lire pour les accros au genre',
  26.         3=>'Bouqin sympa',
  27.         4=>'Vraiment bon livre',
  28.         5=>'Très bon livre, une référence',
  29.     ];
  30.     public function __construct()
  31.     {
  32.         try {
  33.             $this->_currentCustomer = Pimcore::getContainer()->get(CustomerContextInterface::class)->getCustomer();
  34.         } catch (\Throwable $th) {
  35.             $this->_currentCustomer = null;
  36.         }
  37.         $websiteSetting = \Pimcore\Model\WebsiteSetting::getByName('reviewPath');
  38.         $this->_reviewPath = $websiteSetting->getData();
  39.     }
  40.     #[Route(path: '/product/formreview/{itemId}', name: 'manageReview')]
  41.     public function formAction(Request $request): Response
  42.     {
  43.         $param = [];
  44.         $item = DataObject::getById($request->get('itemId'), true);
  45.         $param['itemId'] = $item->getId();
  46.         $existingReview = $this->_getExistingReview($item);
  47.         $arrayRatingCriteria = [];
  48.         $param['existingReviewDecoded'] = '';
  49.         if($existingReview != null) {
  50.             // For tinyMCE defaut input :
  51.             $param['existingReviewDecoded'] = htmlspecialchars_decode($existingReview->getReview());
  52.             $param['existingReviewDecoded'] = preg_replace('/\R/', '', $param['existingReviewDecoded']); // Remove Carriage return
  53.             $param['existingReviewDecoded'] = addslashes($param['existingReviewDecoded']);
  54.             // For defaults ReviewDetailled if update Review
  55.             if(count($existingReview->getRatingCriteria())) {
  56.                 foreach($existingReview->getRatingCriteria() as $ratingC) {
  57.                     $arrayRatingCriteria[$ratingC->getObjectId()] = $ratingC->getRating() ;
  58.                 }
  59.             }
  60.         }
  61.         $param['existingReview'] = $existingReview;
  62.         $param['arrayRatingCriteria'] = $arrayRatingCriteria;
  63.         $criterias = $item->getReviewCriteriaAvailable();
  64.         $param['criterias'] = $criterias;
  65.         //$param['form'] = $form->createView();
  66.         //$form->handleRequest($request);
  67.         if (in_array($request->getMethod(), ['POST', 'PUT', 'PATCH'])) {
  68.             //if ($form->isValid()) {
  69.             //}
  70.             /* $data = $form->getData();
  71.             var_dump($data);
  72.             */
  73.             $message = $request->get('message');
  74.             $reviewGlobal = $request->get('reviewglobal');
  75.             $reviewCriteria = $request->get('reviewcriteria', []);
  76.             // Update if exists
  77.             $review = $this->_getExistingReview($item);
  78.             if($review instanceof Review) {
  79.             } else {
  80.                 $parentFolder = $this->_getOrCreateFolderByDate();
  81.                 $key = $this->_getKeyForReview($item);
  82.                 $review = new Review();
  83.                 $review->setParent($parentFolder);
  84.                 $review->setkey($key);
  85.             }
  86.             // Update or Create : change all fields
  87.             $review->setReviewDate(Carbon::now());
  88.             $review->setReview($request->get('message'));
  89.             $review->setRating($reviewGlobal);
  90.             if($this->_currentCustomer != null) {
  91.                 $review->setCustomer($this->_currentCustomer);
  92.             }
  93.             $metaDatas = [];
  94.             foreach($reviewCriteria as $idCriteria => $rating) {
  95.                 $criteria = ReviewCriteria::getById($idCriteria);
  96.                 if($criteria instanceof ReviewCriteria) {
  97.                     $objMetadata = new ObjectMetadata('RatingCriteria', ['Rating'], $criteria);
  98.                     $objMetadata->setRating($rating);
  99.                     $metaDatas[] = $objMetadata;
  100.                 }
  101.             }
  102.             $review->setRatingCriteria($metaDatas);
  103.             $review->setItem($item);
  104.             $review->setPublished(true);
  105.             $review->save();
  106.             return $this->json(['success' => true]);
  107.         }
  108.         return $this->render('review/form.html.twig', $param);
  109.     }
  110.     private function _getOrCreateFolderByDate()
  111.     {
  112.         $day   = date('d');
  113.         $month = date('m');
  114.         $year  = date('Y');
  115.         return Service::createFolderByPath($this->_reviewPath . '/'.$year.'/'.$month.'/'.$day);
  116.     }
  117.     #[Route(path: '/account/deletereview/{itemId}/{reviewId}', name: 'accountDeleteReview')]
  118.     public function deleteReviewAction(Request $request): Response
  119.     {
  120.         $item   = DataObject::getById($request->get('itemId', 0));
  121.         $review = Review::getById($request->get('reviewId'), true);
  122.         if ($review instanceof Review && ($item instanceof Book || $item instanceof Serie)) {
  123.             if (($review->getItem() instanceof Book || $review->getItem() instanceof Serie) and $review->getItem()->getId() === $item->getId()) {
  124.                 $review->delete();
  125.                 return $this->json(['success' => true]);
  126.             }
  127.         }
  128.         return $this->json(['success' => false]);
  129.     }
  130.     public function getReviewsFromBase($itemId)
  131.     {
  132.         $reviewListing =  new Review\Listing();
  133.         $reviewListing->addConditionParam('Item__id = ' . $itemId, [], ' AND ');
  134.         //$reviewListing->addConditionParam("ReviewDate < " . time() - (24*60*60), [], ' AND ');
  135.         $reviewListing->setOrderKey('o_creationDate');
  136.         $reviewListing->setOrder('DESC');
  137.         $reviewsObj = $reviewListing->load();
  138.         $reviews=[];
  139.         foreach($reviewsObj as $review) {
  140.             $customer = $review->getCustomer() ;
  141.             $tmp = [];
  142.             $tmp['id'] = $review->getId();
  143.             $tmp['rating'] = $review->getRating();
  144.             $tmp['review'] = $review->getFormattedReview();
  145.             $tmp['customer'] = '';
  146.             $tmp['image'] = '';
  147.             $defaultImageSetting = \Pimcore\Model\WebsiteSetting::getByName('defaultImageAuthor');
  148.             $imageDefault = $defaultImageSetting->getData();
  149.             if ($imageDefault != null && $imageDefault->getFullPath() != '') {
  150.                 $tmp['image'] = $imageDefault;
  151.             }
  152.             if($customer != null and $customer instanceof \Pimcore\Model\DataObject\CoreShopCustomer) {
  153.                 $tmp['is_contributor']=false;
  154.                 $tmp['customer'] = $customer->getFirstname();
  155.                 if($customer->getImage() instanceof \Pimcore\Model\Asset\Image) {
  156.                     //$tmp['image'] = $customer->getImage()->getFullPath();
  157.                     $tmp['image'] = $customer->getImage()->getThumbnail('profil_thumb');
  158.                 }
  159.             }
  160.             if($customer != null and $customer instanceof \Pimcore\Model\DataObject\Contributor) {
  161.                 $tmp['is_contributor']=true;
  162.                 $tmp['customer'] = $customer->getFirstname();
  163.                 if($customer->getImage() instanceof \Pimcore\Model\Asset\Image) {
  164.                     //$tmp['image'] = $customer->getImage()->getFullPath();
  165.                     $tmp['image'] = $customer->getImage()->getThumbnail('contributor_thumb');
  166.                     if($customer->getWebsite()) {
  167.                         $tmp['website']=$customer->getWebsite()->getHref();
  168.                     }
  169.                 }
  170.             }
  171.             // Reviews Detailled :
  172.             $productScores = [];
  173.             $detailledReviews = $review->getRatingCriteria();
  174.             foreach($detailledReviews as $reviewCrit) {
  175.                 $dataRating = ($reviewCrit->getData());
  176.                 $productScores[$reviewCrit->getObjectId()][] = $dataRating['Rating'];
  177.             }
  178.             $finalProductScores = [];
  179.             // Calcul average
  180.             foreach($productScores as $idCriteria => $infos) {
  181.                 $criteria = \Pimcore\Model\DataObject\ReviewCriteria::getById($idCriteria);
  182.                 $color = '#36A9E1';
  183.                 if($criteria->getProperty('color') != '') {
  184.                     $color = $criteria->getProperty('color');
  185.                 }
  186.                 $label = $criteria->getKey();
  187.                 // label to override key
  188.                 if($criteria->getLabel() != '') {
  189.                     $label = $criteria->getLabel();
  190.                 }
  191.                 // Label front if needed
  192.                 if($criteria->getProperty('label') != '') {
  193.                     $label = $criteria->getProperty('label');
  194.                 }
  195.                 $position = $idCriteria; // todo to change by custom property with position (like label)
  196.                 $finalProductScores[$position] = [
  197.                     'label' => $label,
  198.                     'color' => $color,
  199.                     'score' => (int) ceil(array_sum($infos) / count($infos))
  200.                     ];
  201.             }
  202.             $tmp['productScores'] = $finalProductScores;
  203.             $reviews[]=$tmp;
  204.         }
  205.         return $reviews;
  206.     }
  207.     public function listingByBookAction(Request $request): Response
  208.     {
  209.         // Number of review by pagination
  210.         $forceRefresh = $request->get('refresh');
  211.         $paginationDefault = \Pimcore\Model\WebsiteSetting::getByName('paginationReviewsBookDefault');
  212.         $paginationDefaultVal = $paginationDefault->getData();
  213.         $pagination = $request->get('pagination');
  214.         if($pagination == 0) {
  215.             $pagination = $paginationDefaultVal;
  216.         }
  217.         $param = [];
  218.         $param['isUpdate'] = false;
  219.         $param['customer'] = null;
  220.         $reviews = [];
  221.         $session = $this->get('session');
  222.         $idUniqSession = 'review'.$request->get('itemId');
  223.         $offset = $request->get('offset', 0);
  224.         $item = DataObject::getById($request->get('itemId'), true);
  225.         if ($item instanceof Book || $item instanceof Serie) { //&& $this->_currentCustomer != null
  226.             if($session->get($idUniqSession) === null or $forceRefresh) {
  227.                 // Cache Pimcore
  228.                 $key = 'bookreviews.'.$request->get('itemId');
  229.                 $cacheKey = md5($key);
  230.                 // Get reviews from cache
  231.                 if($forceRefresh or !$reviewsStored = \Pimcore\Cache::load($cacheKey)) {
  232.                     $reviews=$this->getReviewsFromBase($request->get('itemId'));
  233.                     \Pimcore\Cache::save(
  234.                         $reviews,
  235.                         $cacheKey,
  236.                         ['book-reviews'],
  237.                         1800); // 1800 sec = 30min
  238.                 } else {
  239.                     $reviews = $reviewsStored;
  240.                 }
  241.                 $session->set($idUniqSession, $reviews);
  242.             } else {
  243.                 $reviews = $session->get($idUniqSession);
  244.             }
  245.             $param['customer'] = $this->_currentCustomer;
  246.             $review = $this->_getExistingReview($item);
  247.             if($review instanceof Review) {
  248.                 $param['isUpdate'] = true;
  249.             }
  250.         }
  251.         // Extract by pagination
  252.         $reviewsSliced = array_slice($reviews, $offset, $pagination);
  253.         $param['reviews']        = $reviewsSliced;
  254.         $param['offsetNext']     = (int)($offset + $pagination);
  255.         $param['pagination']     = $pagination;
  256.         $param['itemId']         = $request->get('itemId');
  257.         $param['productScoresRating'] = $this->productScoresRatingArray;
  258.         $param['fromAjax']       = $request->get('fromAjax', 0);
  259.         $param['showPagination'] = (count($reviews) > $offset + $pagination) ? true : false;
  260.         return $this->render('review/listingByBook.html.twig', $param);
  261.     }
  262.     // Check if review exist for this user / item
  263.     private function _getExistingReview($item)
  264.     {
  265.         $key = $this->_getKeyForReview($item);
  266.         $reviewListing =  new Review\Listing();
  267.         $reviewListing->addConditionParam('o_key = ?', $key, [], ' AND ');
  268.         $reviews = $reviewListing->load();
  269.         $review = null;
  270.         if(count($reviews)) {
  271.             $review = $reviews[0];
  272.         }
  273.         if($review instanceof Review) {
  274.             return $review;
  275.         }
  276.         return null;
  277.     }
  278.     private function _getKeyForReview($item)
  279.     {
  280.         $key = $item->getDolpoId();
  281.         if($this->_currentCustomer != null) {
  282.             $key .= '_'.$this->_currentCustomer->getId();
  283.         }
  284.         return $key;
  285.     }
  286.     /*
  287.      * Listing under Account/avis page
  288.      */
  289.     public function listingByCustomerAction(Request $request): Response
  290.     {
  291.         $param = [];
  292.         $param['reviews'] = [];
  293.         if($this->_currentCustomer != null) {
  294.             $param['customer'] = $this->_currentCustomer;
  295.             $reviewListing =  new Review\Listing();
  296.             $reviewListing->addConditionParam('Customer__id = ' . $this->_currentCustomer->getId(), [], ' AND ');
  297.             $reviews = $reviewListing->load();
  298.             $param['reviews'] = $reviews;
  299.         }
  300.         return $this->render('review/listingByCustomer.html.twig', $param);
  301.     }
  302.     /*
  303.     public function listingByCustomerAction(Request $request): Response
  304.     {
  305.         $param = [];
  306.         $param['reviews'] = [];
  307.         if($this->_currentCustomer != null){
  308.             $param['customer'] = $this->_currentCustomer;
  309.             $sql = "SELECT *
  310.                     FROM  object_relations_BOO r
  311.                     INNER JOIN object_collection_Review_BOO cr ON ( r.src_id = cr.o_id
  312.                                                                     AND r.position = cr.index )
  313.             WHERE r.fieldname = 'Customer'
  314.             AND   ownername   = 'BookReview'
  315.             AND   dest_id     = '".$this->_currentCustomer->getId()."'
  316.             AND cr.fieldname  = 'BookReview'";
  317.             $query = Db::get()->prepare($sql);
  318.             $query->execute();
  319.             $results = $query->fetchAll();
  320.             foreach($results as $result){
  321.                 $item = Book::getById($result['src_id']);
  322.                 if($item == null){
  323.                     $item = Serie::getById($result['src_id']);
  324.                 }
  325.                 $result['item'] = $item;
  326.                 $param['reviews'][] = $result;
  327.             }
  328.         }
  329.         return $this->render('review/listing.html.twig', $param);
  330.     }
  331.     */
  332. }