<?php
namespace App\Service;
use App\Entity\Post;
use App\Entity\PostType;
use App\Entity\RssArticle;
use App\Entity\RssEvent;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Routing\RouterInterface;
class RssService
{
public function __construct(private EntityManagerInterface $em)
{
}
public function getArrayArticle(RssArticle $rssarticle): mixed
{
//Posts de base
$host = "info.lenord.fr";
//Posts de base
$excluded_ids = [];
$results = [];
$posts = $rssarticle->getPosts();
foreach ($posts as $p) {
array_push($excluded_ids, $p->getId());
array_push($results, $p);
}
$posts_exclus = $rssarticle->getPostsExclus();
foreach ($posts_exclus as $p) {
array_push($excluded_ids, $p->getId());
}
$exp = $rssarticle->getMotscles();
$search_topics = [];
$search_territories = [];
if (count($rssarticle->getThematiques()) > 0) {
foreach ($rssarticle->getThematiques() as $theme) {
array_push($search_topics, $theme->getId());
}
}
if (count($rssarticle->getLieux()) > 0) {
foreach ($rssarticle->getLieux() as $theme) {
array_push($search_territories, $theme->getId());
}
}
if ($exp != null || count($search_topics) > 0 || count($search_territories) > 0) {
$others = $this->em->getRepository(Post::class)->getSearchArticleXml(explode(";", $exp), $excluded_ids, false, $rssarticle->getVideo(), $search_territories, $search_topics);
foreach ($others as $p) {
array_push($results, $p);
}
}
$response = [];
$i = 0;
foreach ($results as $post) {
if ($i >= 3) {
break;
}
array_push($response, ['url' => "https://" . $host . "/" . $post->getSlug(), 'title' => $post->getTitle(), 'image' => 'https://' . $host . '/media/cache/thumb/upload/images/' . $post->getIllustrationfilName(), 'type' => $post->getType()->getId(), 'duration' => $post->getDuree()]);
$i++;
}
return $response;
}
public function getXmlArticle(RssArticle $rssarticle): string
{
//Posts de base
$excluded_ids = [];
$results = [];
$posts = $rssarticle->getPosts();
foreach ($posts as $p) {
array_push($excluded_ids, $p->getId());
array_push($results, $p);
}
$posts_exclus = $rssarticle->getPostsExclus();
foreach ($posts_exclus as $p) {
array_push($excluded_ids, $p->getId());
}
$exp = $rssarticle->getMotscles();
$search_topics = [];
$search_territories = [];
if (count($rssarticle->getThematiques()) > 0) {
foreach ($rssarticle->getThematiques() as $theme) {
array_push($search_topics, $theme->getId());
}
}
if (count($rssarticle->getLieux()) > 0) {
foreach ($rssarticle->getLieux() as $theme) {
array_push($search_territories, $theme->getId());
}
}
if ($exp != null || count($search_topics) > 0 || count($search_territories) > 0) {
$others = $this->em->getRepository(Post::class)->getSearchArticleXml(explode(";", $exp), $excluded_ids, false, $rssarticle->getVideo(), $search_territories, $search_topics);
foreach ($others as $p) {
array_push($results, $p);
}
}
//dom
$dom = new \DOMDocument('1.0', 'UTF-8');
$rss = $dom->createElement('rss');
$rss->setAttribute('version', '2.0');
$rss->setAttribute("xmlns:atom", "http://www.w3.org/2005/Atom");
$rss_node = $dom->appendChild($rss);
$channel = $dom->createElement('channel');
$channel_node = $rss_node->appendChild($channel);
$atom_link = $dom->createElement('atom:link');
$atom_link->setAttribute("href", "https://info.lenord.fr/rss/" . $rssarticle->getAlias());
$atom_link->setAttribute("rel", "self");
$atom_link->setAttribute("type", "application/rss+xml");
$channel_node->appendChild($atom_link);
$channel_node->appendChild($dom->createElement('title', $rssarticle->getName()));
$channel_node->appendChild($dom->createElement('description', $rssarticle->getDescription()));
$channel_node->appendChild($dom->createElement('link', "https://info.lenord.fr"));
//$media_logo = $dom->createElement('media');
//$media_logo->setAttribute('url','https://info.lenord.fr/img/logos/logo.png');
//$channel_node->appendChild($media_logo);
$enclosure_logo = $dom->createElement('enclosure');
$enclosure_logo->setAttribute('url', 'https://info.lenord.fr/img/logos/logo.png');
$enclosure_logo->setAttribute('type', 'image/png');
$enclosure_logo->setAttribute('length', '110000');
$channel_node->appendChild($enclosure_logo);
//Posts
foreach ($results as $post) {
$pdate = null;
$pubDate = date_create_from_format("d/m/Y H:i", $post->getDateDernierStatut());
if ($pubDate != null) {
$pdate = $pubDate->format('r');
}
$item = $dom->createElement('item');
$item_node = $channel_node->appendChild($item);
$item_node->appendChild($dom->createElement('guid', "https://info.lenord.fr/" . $post->getSlug()));
$item_node->appendChild($dom->createElement('title', str_replace("&", "and", (string) $post->getTitle())));
$item_node->appendChild($dom->createElement('link', "https://info.lenord.fr/" . $post->getSlug()));
$item_node->appendChild($dom->createElement('pubDate', $pdate));
//$item_node->appendChild($dom->createElement('description', $post->getShortDescription()));
if ($post->getType()->getId() == 4) {
$item_node->appendChild($dom->createElement('category', "Vidéo"));
$item_node->appendChild($dom->createElement('duration', $post->getDuree()));
} else {
$item_node->appendChild($dom->createElement('category', "Article"));
}
/*$media_post = $dom->createElement('media');
$media_post->setAttribute('url','https://info.lenord.fr/media/cache/thumb/upload/images/'.$post->getIllustrationfilName());
$item_node->appendChild($media_post);*/
$enclosure_logo = $dom->createElement('enclosure');
$enclosure_logo->setAttribute('url', 'https://info.lenord.fr/media/cache/thumb/upload/images/' . $post->getIllustrationfilName());
$enclosure_logo->setAttribute('type', 'image/jpeg');
$enclosure_logo->setAttribute('length', '110000');
$item_node->appendChild($enclosure_logo);
}
$xml = $dom->saveXML();
return $xml;
//$this->filesystem->dumpFile('public/xml/GS.xml', $xml);
}
public function getXmlEvent(RssEvent $rssarticle): string
{
//Posts de base
$excluded_ids = [];
$results = [];
$posts = $rssarticle->getPosts();
foreach ($posts as $p) {
array_push($excluded_ids, $p->getId());
array_push($results, $p);
}
$posts_exclus = $rssarticle->getPostsExclus();
foreach ($posts_exclus as $p) {
array_push($excluded_ids, $p->getId());
}
$exp = $rssarticle->getMotscles();
$search_topics = [];
$search_territories = [];
if (count($rssarticle->getThematiques()) > 0) {
foreach ($rssarticle->getThematiques() as $theme) {
array_push($search_topics, $theme->getId());
}
}
if (count($rssarticle->getLieux()) > 0) {
foreach ($rssarticle->getLieux() as $theme) {
array_push($search_territories, $theme->getId());
}
}
if ($exp != null || count($search_topics) > 0 || count($search_territories) > 0) {
$others = $this->em->getRepository(Post::class)->getSearchEventXml(explode(";", $exp), $excluded_ids, false, $search_territories, $search_topics);
foreach ($others as $p) {
array_push($results, $p);
}
}
//dom
$dom = new \DOMDocument('1.0', 'UTF-8');
$rss = $dom->createElement('rss');
$rss->setAttribute('version', '2.0');
$rss->setAttribute("xmlns:atom", "http://www.w3.org/2005/Atom");
$rss_node = $dom->appendChild($rss);
$channel = $dom->createElement('channel');
$channel_node = $rss_node->appendChild($channel);
$atom_link = $dom->createElement('atom:link');
$atom_link->setAttribute("href", "https://info.lenord.fr/rss-event/" . $rssarticle->getAlias());
$atom_link->setAttribute("rel", "self");
$atom_link->setAttribute("type", "application/rss+xml");
$channel_node->appendChild($atom_link);
$channel_node->appendChild($dom->createElement('title', $rssarticle->getName()));
$channel_node->appendChild($dom->createElement('description', $rssarticle->getDescription()));
$channel_node->appendChild($dom->createElement('link', "https://info.lenord.fr/agenda"));
$enclosure_logo = $dom->createElement('enclosure');
$enclosure_logo->setAttribute('url', 'https://info.lenord.fr/img/logos/logo.png');
$enclosure_logo->setAttribute('type', 'image/png');
$enclosure_logo->setAttribute('length', '110000');
$channel_node->appendChild($enclosure_logo);
//Posts
foreach ($results as $post) {
$pdate = null;
$pubDate = date_create_from_format("d/m/Y H:i", $post->getDateDernierStatut());
if ($pubDate != null) {
$pdate = $pubDate->format('r');
}
$dates = null;
$dates = "du " . $post->getDateDebut() . " au " . $post->getDateFin();
$item = $dom->createElement('item');
$item_node = $channel_node->appendChild($item);
$item_node->appendChild($dom->createElement('guid', "https://info.lenord.fr/" . $post->getSlug()));
$item_node->appendChild($dom->createElement('title', str_replace("&", "and", (string) $post->getTitle())));
$item_node->appendChild($dom->createElement('link', "https://info.lenord.fr/" . $post->getSlug()));
$item_node->appendChild($dom->createElement('pubDate', $pdate));
$item_node->appendChild($dom->createElement('description', $post->getSubtitle()));
$item_node->appendChild($dom->createElement('category', "Evenement"));
$item_node->appendChild($dom->createElement('lieu', $post->getLieu()));
$item_node->appendChild($dom->createElement('ville', $post->getVille()));
$item_node->appendChild($dom->createElement('dates', $dates));
/*$media_post = $dom->createElement('media');
$media_post->setAttribute('url','https://info.lenord.fr/media/cache/thumb/upload/images/'.$post->getIllustrationfilName());
$item_node->appendChild($media_post);*/
$enclosure_logo = $dom->createElement('enclosure');
$enclosure_logo->setAttribute('url', 'https://info.lenord.fr/media/cache/thumb/upload/images/' . $post->getIllustrationfilName());
$enclosure_logo->setAttribute('type', 'image/jpeg');
$enclosure_logo->setAttribute('length', (string)filesize('https://info.lenord.fr/media/cache/thumb/upload/images/' . $post->getIllustrationfilName()));
$item_node->appendChild($enclosure_logo);
}
$xml = $dom->saveXML();
return $xml;
}
public function getXmlNordevasion(RouterInterface $router, string $host): string
{
//dom
$dom = new \DOMDocument('1.0', 'UTF-8');
$rss = $dom->createElement('rss');
$rss->setAttribute('version', '2.0');
$rss->setAttribute("xmlns:atom", "http://www.w3.org/2005/Atom");
$rss_node = $dom->appendChild($rss);
$channel = $dom->createElement('channel');
$channel_node = $rss_node->appendChild($channel);
$atom_link = $dom->createElement('atom:link');
$atom_link->setAttribute("href", "https://info.lenord.fr/xml/events2evasion.xml");
$atom_link->setAttribute("rel", "self");
$atom_link->setAttribute("type", "application/rss+xml");
$channel_node->appendChild($atom_link);
$channel_node->appendChild($dom->createElement('title', "Evenements Nord Evasion"));
$channel_node->appendChild($dom->createElement('description', ""));
$channel_node->appendChild($dom->createElement('link', "https://info.lenord.fr/xml/events2evasion.xml"));
$enclosure_logo = $dom->createElement('enclosure');
$enclosure_logo->setAttribute('url', 'https://info.lenord.fr/img/logos/logo.png');
$enclosure_logo->setAttribute('type', 'image/png');
$enclosure_logo->setAttribute('length', '110000');
$channel_node->appendChild($enclosure_logo);
$type = $this->em->getRepository(PostType::class)->find(3);
$results = $this->em->getRepository(Post::class)->findBy(['type' => $type], ['date_update' => 'DESC']);
//Posts
foreach ($results as $post) {
$pdate = null;
$pubDate = date_create_from_format("d/m/Y H:i", $post->getDateDernierStatut());
if ($pubDate != null) {
$pdate = $pubDate->format('r');
}
$date_debut = null;
$date_fin = null;
if ($post->getDateDebut() != null) {
$date_debut = date_create_from_format('d/m/Y', $post->getDateDebut());
if ($date_debut == false) {
$date_debut = date_create_from_format('d/m/Y H:i', $post->getDateDebut());
}
}
if ($post->getDateFin() != null) {
$date_fin = date_create_from_format('d/m/Y', $post->getDateFin());
if ($date_fin == false) {
$date_fin = date_create_from_format('d/m/Y H:i', $post->getDateFin());
}
}
$date_jour = new \DateTime;
if ($date_fin != null && $date_fin < $date_jour) {
continue;
}
if ($date_debut != null) {
$date_debut = $date_debut->format('r');
}
if ($date_fin != null) {
$date_fin = $date_fin->format('r');
}
$date_creation = null;
if ($post->getCreatedAt() != null) {
$date_creation = date_create_from_format('d/m/Y', $post->getCreatedAt());
if ($date_creation == false) {
$date_creation = date_create_from_format('d/m/Y H:i', $post->getCreatedAt());
}
if ($date_creation != null) {
$date_creation = $date_creation->format('r');
}
}
$date_modification = null;
if ($post->getDateUpdate() !== null) {
$date_modification = $post->getDateUpdate()->format('r');
} else {
$date_modification = $date_creation;
}
$status_id = null;
if ($post->getStatus() !== null) {
$status_id = $post->getStatus()->getId();
}
$types = "";
foreach ($post->getEventType() as $type) {
if ($types != null) {
$types .= ', ';
}
$types .= $type->getDisplayName();
}
$item = $dom->createElement('item');
$item_node = $channel_node->appendChild($item);
$item_node->appendChild($dom->createElement('guid', (string)$post->getId()));
$item_node->appendChild($dom->createElement('title', str_replace("&", "and", $post->getTitle())));
$item_node->appendChild($dom->createElement('subtitle', str_replace("&", "and", $post->getSubtitle())));
$item_node->appendChild($dom->createElement('link', "https://info.lenord.fr/" . $post->getSlug()));
$item_node->appendChild($dom->createElement('date_publication', $pdate));
$item_node->appendChild($dom->createElement('lieu', htmlspecialchars($post->getLieu())));
$item_node->appendChild($dom->createElement('ville', htmlspecialchars($post->getVille())));
$item_node->appendChild($dom->createElement('date_debut', $date_debut));
$item_node->appendChild($dom->createElement('date_fin', $date_fin));
$item_node->appendChild($dom->createElement('date_creation', $date_creation));
$item_node->appendChild($dom->createElement('date_modification', $date_modification));
$item_node->appendChild($dom->createElement('statut', (string)$status_id));
$enclosure_logo = $dom->createElement('enclosure');
$enclosure_logo->setAttribute('url', 'https://info.lenord.fr/public/upload/images/' . $post->getIllustrationfilName());
$enclosure_logo->setAttribute('type', 'image/jpeg');
$item_node->appendChild($enclosure_logo);
$item_node->appendChild($dom->createElement('horaires', htmlspecialchars($post->getHoraires())));
$item_node->appendChild($dom->createElement('tarifs', htmlspecialchars($post->getTarifs())));
$item_node->appendChild($dom->createElement("types_event", $types));
$item_node->appendChild($dom->createElement("organized_by", htmlspecialchars($post->getOrganizedBy())));
$url_content = $router->generate('api_get_content', ['id' => $post->getId()]);
$item_node->appendChild($dom->createElement('url_content', $host . $url_content));
}
$xml = $dom->saveXML();
return $xml;
}
}