InstantArticleRssEncoder.php in Facebook Instant Articles 3.x
File
src/Encoder/InstantArticleRssEncoder.php
View source
<?php
namespace Drupal\fb_instant_articles\Encoder;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\StringTranslation\StringTranslationTrait;
use Drupal\serialization\Encoder\XmlEncoder;
use Facebook\InstantArticles\Elements\InstantArticle;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Serializer\Encoder\XmlEncoder as BaseXmlEncoder;
class InstantArticleRssEncoder extends XmlEncoder {
use StringTranslationTrait;
protected static $format = [
'fbia_rss',
];
protected $currentRequest;
protected $config;
public function __construct(RequestStack $request_stack, ConfigFactoryInterface $config_factory) {
$this->currentRequest = $request_stack
->getCurrentRequest();
$this->config = $config_factory
->get('fb_instant_articles.settings');
}
public function getBaseEncoder() {
if (!isset($this->baseEncoder)) {
$this->baseEncoder = new BaseXmlEncoder('rss');
$this->baseEncoder
->setSerializer($this->serializer);
}
return $this->baseEncoder;
}
public function supportsDecoding($format) {
return FALSE;
}
public function encode($data, $format, array $context = []) {
if (!ctype_digit(implode('', array_keys($data)))) {
$data = [
$data,
];
}
foreach ($data as $delta => $item) {
if (!empty($item['content:encoded']) && $item['content:encoded'] instanceof InstantArticle) {
$data[$delta]['content:encoded'] = $item['content:encoded']
->render();
}
}
$feed_title = $this
->t('Facebook Instant Articles RSS Feed');
$feed_description = '';
if (isset($context['views_style_plugin'])) {
$style = $context['views_style_plugin'];
$feed_title = $style->view
->getTitle();
$feed_description = $style->view->storage
->get('description');
}
$encoded = [
'@version' => '2.0',
'@xmlns:content' => 'http://purl.org/rss/1.0/modules/content/',
'channel' => [
'title' => $feed_title,
'link' => $this
->getLink(),
'lastBuildDate' => date('c', time()),
],
];
if (!empty($feed_description)) {
$encoded['channel']['description'] = $feed_description;
}
$encoded['channel']['item'] = $data;
return parent::encode($encoded, $format, $context);
}
protected function getLink() {
if ($override = $this->config
->get('canonical_url_override')) {
return $override;
}
else {
return $this->currentRequest
->getSchemeAndHttpHost();
}
}
}