diff --git a/Controller/FrontController.php b/Controller/FrontController.php index d48e225..59e9ea1 100644 --- a/Controller/FrontController.php +++ b/Controller/FrontController.php @@ -10,70 +10,91 @@ use Symfony\Component\Routing\Annotation\Route; use Thelia\Controller\Front\BaseFrontController; use Thelia\Core\HttpFoundation\JsonResponse; +use Thelia\Core\HttpFoundation\Request; +use Thelia\Core\HttpFoundation\Response; #[Route(path: "/guaranteed_opinion", name: "guaranteed_opinion")] class FrontController extends BaseFrontController { - /** - * @throws PropelException - */ - #[Route(path: "/site_reviews/offset/{offset}/limit/{limit}", name: "site_reviews", methods: "GET")] - public function siteReviews(int $offset, int $limit): JsonResponse - { - $reviews = []; - - $siteReviews = GuaranteedOpinionSiteReviewQuery::create() - ->setLimit($limit) - ->setOffset($offset) - ->find() - ; - - foreach ($siteReviews as $review) { - $reviews[] = [ - 'rate' => $review->getRate(), - 'name' => $review->getName(), - 'date' => $review->getReviewDate()?->format('Y-m-d'), - 'message' => $review->getReview() - ]; - } - - return new JsonResponse([ - 'total' => GuaranteedOpinion::getConfigValue(GuaranteedOpinion::SITE_RATING_TOTAL_CONFIG_KEY), - 'average' => GuaranteedOpinion::getConfigValue(GuaranteedOpinion::SITE_RATING_AVERAGE_CONFIG_KEY), - 'reviews' => $reviews - ]); + /** + * @throws PropelException + */ + #[Route(path: "/site_reviews/offset/{offset}/limit/{limit}", name: "site_reviews", methods: "GET")] + public function siteReviews(int $offset, int $limit, Request $request): JsonResponse + { + $reviews = []; + + $siteReviews = GuaranteedOpinionSiteReviewQuery::create() + ->setLimit($limit) + ->setOffset($offset) + ->find(); + + foreach ($siteReviews as $review) { + $reviews[] = [ + 'rate' => $review->getRate(), + 'name' => $review->getName(), + 'date' => $review->getReviewDate()?->format('Y-m-d'), + 'message' => $review->getReview() + ]; } - /** - * @throws PropelException - */ - #[Route(path: "/product_reviews/{id}/offset/{offset}/limit/{limit}", name: "product_reviews", methods: "GET")] - public function productReviews(int $id, int $offset, int $limit): JsonResponse - { - $reviews = []; - - $productRating = GuaranteedOpinionProductRatingQuery::create() - ->findOneByProductId($id); - - $productReviews = GuaranteedOpinionProductReviewQuery::create() - ->filterByProductId($id) - ->setLimit($limit) - ->setOffset($offset) - ->find(); - - foreach ($productReviews as $review) { - $reviews[] = [ - 'rate' => $review->getRate(), - 'name' => $review->getName(), - 'date' => $review->getReviewDate()?->format('Y-m-d'), - 'message' => $review->getReview() - ]; - } - - return new JsonResponse([ - 'total' => $productRating?->getTotal(), - 'average' => $productRating?->getAverage(), - 'reviews' => $reviews - ]); + $responseData = [ + 'total' => $productRating?->getTotal(), + 'average' => $productRating?->getAverage(), + 'reviews' => $reviews + ]; + + if ($request->headers->get('Accept') === 'text/html') { + $response = $this->render('includes/next-site-reviews', $responseData, count($reviews) > 0 ? Response::HTTP_OK : Response::HTTP_NO_CONTENT); + + $response->headers->set('X-Remaining-Reviews', $responseData["total"] - $offset - $limit); + + return $response; } -} \ No newline at end of file + + return new JsonResponse($responseData); + } + + /** + * @throws PropelException + */ + #[Route(path: "/product_reviews/{id}/offset/{offset}/limit/{limit}", name: "product_reviews", methods: "GET")] + public function productReviews(int $id, int $offset, int $limit, Request $request): JsonResponse|Response + { + $reviews = []; + + $productRating = GuaranteedOpinionProductRatingQuery::create() + ->findOneByProductId($id); + + $productReviews = GuaranteedOpinionProductReviewQuery::create() + ->filterByProductId($id) + ->setLimit($limit) + ->setOffset($offset) + ->find(); + + foreach ($productReviews as $review) { + $reviews[] = [ + 'rate' => $review->getRate(), + 'name' => $review->getName(), + 'date' => $review->getReviewDate()?->format('Y-m-d'), + 'message' => $review->getReview() + ]; + } + + $responseData = [ + 'total' => $productRating?->getTotal(), + 'average' => $productRating?->getAverage(), + 'reviews' => $reviews + ]; + + if ($request->headers->get('Accept') === 'text/html') { + $response = $this->render('includes/next-product-reviews', $responseData, count($reviews) > 0 ? Response::HTTP_OK : Response::HTTP_NO_CONTENT); + + $response->headers->set('X-Remaining-Reviews', $responseData["total"] - $offset - $limit); + + return $response; + } + + return new JsonResponse($responseData); + } +} diff --git a/Loop/GuaranteedProductLoop.php b/Loop/GuaranteedProductLoop.php index 902d0d0..00479ca 100644 --- a/Loop/GuaranteedProductLoop.php +++ b/Loop/GuaranteedProductLoop.php @@ -34,8 +34,7 @@ public function parseResults(LoopResult $loopResult): LoopResult ->set('ORDER_ID', $review->getOrderId()) ->set('ORDER_DATE', $review->getOrderDate()?->format('Y-m-d')) ->set('REPLY', $review->getReply()) - ->set('REPLY_DATE', $review->getReplyDate()?->format('Y-m-d')) - ; + ->set('REPLY_DATE', $review->getReplyDate()?->format('Y-m-d')); $this->addOutputFields($loopResultRow, $review); $loopResult->addRow($loopResultRow); @@ -56,8 +55,8 @@ public function buildModelCriteria(): GuaranteedOpinionProductReviewQuery|ModelC $search->filterByRate($minRate, Criteria::GREATER_EQUAL); } - if ((null !== $page = $this->getPage()) && (null !== $limit = $this->getLimit())) { - $search->paginate($page, $limit); + if ((null !== $offset = $this->getOffset()) && (null !== $limit = $this->getLimit())) { + $search->setOffset($offset)->setLimit($limit); } return $search; @@ -68,8 +67,8 @@ protected function getArgDefinitions(): ArgumentCollection return new ArgumentCollection( Argument::createIntTypeArgument('product'), Argument::createIntTypeArgument('min_rate'), - Argument::createIntTypeArgument('limit', 5), - Argument::createIntTypeArgument('page', 0) + Argument::createIntTypeArgument('limit', null), + Argument::createIntTypeArgument('offset', 0) ); } -} \ No newline at end of file +} diff --git a/Loop/GuaranteedSiteLoop.php b/Loop/GuaranteedSiteLoop.php index 77dc9e4..02623f7 100644 --- a/Loop/GuaranteedSiteLoop.php +++ b/Loop/GuaranteedSiteLoop.php @@ -35,8 +35,7 @@ public function parseResults(LoopResult $loopResult): LoopResult ->set('ORDER_ID', $review->getOrderId()) ->set('ORDER_DATE', $review->getOrderDate()?->format('Y-m-d')) ->set('REPLY', $review->getReply()) - ->set('REPLY_DATE', $review->getReplyDate()?->format('Y-m-d')) - ; + ->set('REPLY_DATE', $review->getReplyDate()?->format('Y-m-d')); $this->addOutputFields($loopResultRow, $review); $loopResult->addRow($loopResultRow); @@ -53,8 +52,8 @@ public function buildModelCriteria(): GuaranteedOpinionProductReviewQuery|ModelC $search->filterByRate($minRate, Criteria::GREATER_EQUAL); } - if ((null !== $page = $this->getPage()) && (null !== $limit = $this->getLimit())) { - $search->paginate($page, $limit); + if ((null !== $offset = $this->getOffset()) && (null !== $limit = $this->getLimit())) { + $search->setOffset($offset)->setLimit($limit); } return $search; @@ -64,8 +63,8 @@ protected function getArgDefinitions(): ArgumentCollection { return new ArgumentCollection( Argument::createIntTypeArgument('min_rate'), - Argument::createIntTypeArgument('limit', 5), - Argument::createIntTypeArgument('page', 0) + Argument::createIntTypeArgument('limit', null), + Argument::createIntTypeArgument('offset', 0) ); } -} \ No newline at end of file +} diff --git a/templates/frontOffice/default/includes/next-product-reviews.html b/templates/frontOffice/default/includes/next-product-reviews.html new file mode 100644 index 0000000..ebe75e8 --- /dev/null +++ b/templates/frontOffice/default/includes/next-product-reviews.html @@ -0,0 +1,8 @@ +{foreach $reviews as $review} +
{$review->message}
+{$review->message}
+