You are here

public function PostRenderSubscriber::postRender in Entity Print 8

Same name and namespace in other branches
  1. 8.2 src/EventSubscriber/PostRenderSubscriber.php \Drupal\entity_print\EventSubscriber\PostRenderSubscriber::postRender()

Alter the HTML after it has been rendered.

This is a temporary workaround for a core issue.

Parameters

\Drupal\entity_print\Event\PdfHtmlAlterEvent $event: The event object.

See also

https://drupal.org/node/1494670

File

src/EventSubscriber/PostRenderSubscriber.php, line 54

Class

PostRenderSubscriber
The PostRenderSubscriber class.

Namespace

Drupal\entity_print\EventSubscriber

Code

public function postRender(PdfHtmlAlterEvent $event) {

  // We only apply the fix to PHP Wkhtmltopdf because the other implementations
  // allow us to specify a base url.
  if ($this->configFactory
    ->get('entity_print.settings')
    ->get('pdf_engine') !== 'phpwkhtmltopdf') {
    return;
  }
  $html_string =& $event
    ->getHtml();
  $html5 = new HTML5();
  $document = $html5
    ->loadHTML($html_string);

  // Define a function that will convert root relative uris into absolute urls.
  $transform = function ($tag, $attribute) use ($document) {
    $base_url = $this->requestStack
      ->getCurrentRequest()
      ->getSchemeAndHttpHost();
    foreach ($document
      ->getElementsByTagName($tag) as $node) {
      $attribute_value = $node
        ->getAttribute($attribute);

      // Handle protocol agnostic URLs as well.
      if (Unicode::substr($attribute_value, 0, 2) === '//') {
        $node
          ->setAttribute($attribute, $base_url . Unicode::substr($attribute_value, 1));
      }
      elseif (Unicode::substr($attribute_value, 0, 1) === '/') {
        $node
          ->setAttribute($attribute, $base_url . $attribute_value);
      }
    }
  };

  // Transform stylesheets, links and images.
  $transform('link', 'href');
  $transform('a', 'href');
  $transform('img', 'src');

  // Overwrite the HTML.
  $html_string = $html5
    ->saveHTML($document);
}