説明なし

AutomatedLatestContentBlock.php 2.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. <?php
  2. namespace MailPoet\Newsletter\Renderer\Blocks;
  3. if (!defined('ABSPATH')) exit;
  4. use MailPoet\Entities\NewsletterEntity;
  5. use MailPoet\Entities\NewsletterPostEntity;
  6. use MailPoet\Models\Newsletter;
  7. use MailPoet\Newsletter\AutomatedLatestContent;
  8. use MailPoet\Newsletter\NewsletterPostsRepository;
  9. class AutomatedLatestContentBlock {
  10. /**
  11. * Cache for rendered posts in newsletter.
  12. * Used to prevent duplicate post in case a newsletter contains 2 ALC blocks
  13. * @var array
  14. */
  15. public $renderedPostsInNewsletter;
  16. /** @var AutomatedLatestContent */
  17. private $ALC;
  18. /** @var NewsletterPostsRepository */
  19. private $newsletterPostsRepository;
  20. public function __construct(
  21. NewsletterPostsRepository $newsletterPostsRepository,
  22. AutomatedLatestContent $ALC
  23. ) {
  24. $this->renderedPostsInNewsletter = [];
  25. $this->ALC = $ALC;
  26. $this->newsletterPostsRepository = $newsletterPostsRepository;
  27. }
  28. public function render(NewsletterEntity $newsletter, $args) {
  29. $newerThanTimestamp = false;
  30. $newsletterId = false;
  31. if ($newsletter->getType() === Newsletter::TYPE_NOTIFICATION_HISTORY) {
  32. $parent = $newsletter->getParent();
  33. if ($parent instanceof NewsletterEntity) {
  34. $newsletterId = $parent->getId();
  35. $lastPost = $this->newsletterPostsRepository->findOneBy(['newsletter' => $parent], ['createdAt' => 'desc']);
  36. if ($lastPost instanceof NewsletterPostEntity) {
  37. $newerThanTimestamp = $lastPost->getCreatedAt();
  38. }
  39. }
  40. }
  41. $postsToExclude = $this->getRenderedPosts((int)$newsletterId);
  42. $aLCPosts = $this->ALC->getPosts($args, $postsToExclude, $newsletterId, $newerThanTimestamp);
  43. foreach ($aLCPosts as $post) {
  44. $postsToExclude[] = $post->ID;
  45. }
  46. $this->setRenderedPosts((int)$newsletterId, $postsToExclude);
  47. return $this->ALC->transformPosts($args, $aLCPosts);
  48. }
  49. private function getRenderedPosts(int $newsletterId) {
  50. return $this->renderedPostsInNewsletter[$newsletterId] ?? [];
  51. }
  52. private function setRenderedPosts(int $newsletterId, array $posts) {
  53. return $this->renderedPostsInNewsletter[$newsletterId] = $posts;
  54. }
  55. }