class PostRenderSubscriber in Entity Print 8.2
Same name and namespace in other branches
- 8 src/EventSubscriber/PostRenderSubscriber.php \Drupal\entity_print\EventSubscriber\PostRenderSubscriber
The PostRenderSubscriber class.
Hierarchy
- class \Drupal\entity_print\EventSubscriber\PostRenderSubscriber implements \Symfony\Component\EventDispatcher\EventSubscriberInterface
Expanded class hierarchy of PostRenderSubscriber
1 file declares its use of PostRenderSubscriber
- PostRenderSubscriberTest.php in tests/
src/ Kernel/ PostRenderSubscriberTest.php
1 string reference to 'PostRenderSubscriber'
1 service uses PostRenderSubscriber
File
- src/
EventSubscriber/ PostRenderSubscriber.php, line 15
Namespace
Drupal\entity_print\EventSubscriberView source
class PostRenderSubscriber implements EventSubscriberInterface {
/**
* The Config Factory.
*
* @var \Drupal\Core\Config\ConfigFactoryInterface
*/
protected $configFactory;
/**
* The request stack.
*
* @var \Symfony\Component\HttpFoundation\RequestStack
*/
protected $requestStack;
/**
* PostRenderSubscriber constructor.
*
* @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
* The configuration factory.
* @param \Symfony\Component\HttpFoundation\RequestStack $request_stack
* The request stack.
*/
public function __construct(ConfigFactoryInterface $config_factory, RequestStack $request_stack) {
$this->configFactory = $config_factory;
$this->requestStack = $request_stack;
}
/**
* Alter the HTML after it has been rendered.
*
* @param \Drupal\entity_print\Event\PrintHtmlAlterEvent $event
* The event object.
*
* This is a temporary workaround for a core issue.
*
* @see https://drupal.org/node/1494670
*/
public function postRender(PrintHtmlAlterEvent $event) {
// We only apply the fix to PHP Wkhtmltopdf because the other
// implementations allow us to specify a base url.
$config = $this->configFactory
->get('entity_print.settings');
if ($config
->get('print_engines.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 (mb_substr($attribute_value, 0, 2) === '//') {
$node
->setAttribute($attribute, $base_url . mb_substr($attribute_value, 1));
}
elseif (mb_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);
}
/**
* {@inheritdoc}
*/
public static function getSubscribedEvents() {
return [
PrintEvents::POST_RENDER => 'postRender',
];
}
}
Members
Name | Modifiers | Type | Description | Overrides |
---|---|---|---|---|
PostRenderSubscriber:: |
protected | property | The Config Factory. | |
PostRenderSubscriber:: |
protected | property | The request stack. | |
PostRenderSubscriber:: |
public static | function | Returns an array of event names this subscriber wants to listen to. | |
PostRenderSubscriber:: |
public | function | Alter the HTML after it has been rendered. | |
PostRenderSubscriber:: |
public | function | PostRenderSubscriber constructor. |