FieldItemListNormalizer.php in Facebook Instant Articles 3.x
File
src/Normalizer/FieldItemListNormalizer.php
View source
<?php
namespace Drupal\fb_instant_articles\Normalizer;
use Drupal\Core\Field\FormatterInterface;
use Drupal\Core\Render\RendererInterface;
use Drupal\fb_instant_articles\Plugin\Field\InstantArticleFormatterInterface;
use Drupal\fb_instant_articles\Regions;
use Drupal\fb_instant_articles\TransformerFactory;
use Drupal\serialization\Normalizer\NormalizerBase;
use Facebook\InstantArticles\Elements\Footer;
use Facebook\InstantArticles\Elements\Header;
class FieldItemListNormalizer extends NormalizerBase {
protected $supportedInterfaceOrClass = 'Drupal\\Core\\Field\\FieldItemListInterface';
protected $format = 'fbia';
protected $renderer;
protected $transformerFactory;
public function __construct(RendererInterface $renderer, TransformerFactory $transformer_factory) {
$this->renderer = $renderer;
$this->transformerFactory = $transformer_factory;
}
public function normalize($object, $format = NULL, array $context = []) {
if (!isset($context['instant_article'])) {
return;
}
$article = $context['instant_article'];
if (isset($context['entity_view_display'])) {
$display = $context['entity_view_display'];
$formatter = $display
->getRenderer($object
->getName());
$component = $display
->getComponent($object
->getName());
if ($formatter instanceof InstantArticleFormatterInterface) {
$formatter
->viewInstantArticle($object, $article, $component['region'], $this->serializer);
}
elseif ($formatter instanceof FormatterInterface) {
$formatter
->prepareView([
$object
->getEntity()
->id() => $object,
]);
$render_array = $formatter
->view($object);
if ($markup = (string) $this->renderer
->renderPlain($render_array)) {
$transformer_context = $article;
if ($component['region'] === Regions::REGION_HEADER) {
$header = $article
->getHeader();
if (!$header) {
$header = Header::create();
$article
->withHeader($header);
}
$transformer_context = $header;
}
elseif ($component['region'] === Regions::REGION_FOOTER) {
$footer = $article
->getFooter();
if (!$footer) {
$footer = Footer::create();
$article
->withFooter($footer);
}
$transformer_context = $footer;
}
$transformer = $this->transformerFactory
->getTransformer();
$transformer
->transformString($transformer_context, $markup);
$this->transformerFactory
->flushTransformerLogs($transformer);
}
}
}
}
}