eZ Publish 5 Tip: How to make a print preview page or any other pagelayout override

von Ivo Lukač -
eZ Publish 5 Tips

There is a lot to learn about new eZ Publish 5 stack. The reason is simple: new architecture and new frameworks are being used. Lot of legacy knowledge is going to be deprecated, many tips & tricks you know now are no longer usable. The good thing is that the new platform is much more powerful simply because it uses Symfony framework. This blog post gives a perfect example on how to deal with problems when trying to use the new stack in your project.

The problem

So we started an eZ Publish 5 based implementation. We implemented the pagelayout in new template engine Twig with 4 blocks for head, header, content and footer sections. We created a Layout Controller to fetch the data needed, e.g. menu links. You can find this kind of example in the eZDemoBundle.

Then we got to a problem. To implement the print preview feature we needed a separate pagelayout template. The old way was to use Layout module with Set view by adding "/layout/set/print" at the beginning of some eZ resource. It doesn't work any more because the output of that legacy module is going to use the new default pagelayout.html.twig, and this is exactly what we didn't want.

So we decided to try it in a new Symfony/eZPublish5 kind of way.

The solution

In our Layout controller a new action was added. It simply executed the viewLocation method which is actually executed by standard eZ View Controller. And then we sent the result to a specific print pagelayout template.

Controller/LayoutController.php

/**
 * Action for rendering print page
 */
public function printAction($locationId)
{
    $response = $this->get( 'ez_content' )->viewLocation( $locationId, 'full', false, array());

    return $this->render(
        'YourBundle::pagelayout_print.html.twig',
        array(
            'content' => $response->getContent()
        )
    );
} 

To put the new action in action we added new route rule which connected the url "/print/{locationId}" with the code above.

Resources/config/routing.yml

your_route_for_print:
    path:      /print/{locationId}
    defaults:  { _controller: YourBundle:Layout:print }
    requirements:
        locationId:  \d+

Last step is using the template extending feature from Twig to inherit the default pagelayout and replace the blocks with print specific stuff.

Resources/views/pagelayout_print.html.twig

{% extends 'YourBundle::pagelayout.html.twig' %}

{% block head %}
    specific head and stylesheets
{% endblock %}

{% block header %}
    print specific header
{% endblock %}

{% block content %}
    {{ content|raw }}
{% endblock %}

{% block footer %}
    print specific footer
{% endblock %}

And thats it. Of course, the example could be a bit more complex. For instance, we could support full nice urls instead of just locationId, but this simple example is to show how we should approach problem solving with eZ Publish 5. Instead of trying to force using some old legacy features we should instead research how to solve it more elegantly by using Symfony.

Happy New eZ Publish 5 Year!

Diese Seite verwendet Cookies. Einige dieser Cookies sind unverzichtbar, während andere uns helfen, deine Erfahrung zu verbessern, indem sie uns Einblicke in die Nutzung der Website geben.

Ausführlichere Informationen über die von uns verwendeten Cookies findest du in unserer Datenschutzrichtlinie.

Einstellungen anpassen
  • Notwendige Cookies ermöglichen die Kernfunktionen. Die Website kann ohne diese Cookies nicht richtig funktionieren und kann nur deaktiviert werden, indem du deine Browsereinstellungen änderst.