- Documentation >
- Tutorials >
- Extending Back Office >
- 2. Creating a top menu item
The next thing you will extend in this tutorial is the top menu.

You will add a "Content list" item under "Content". It will list all Content items existing in the Repository.
You will be able to filter the list by Content Types using a drop-down menu.
Add an event subscriber
The first step is to add an event subscriber.
Create a MyMenuSubscriber.php
file in src/EventSubscriber
. It will be registered automatically:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 | <?php
namespace App\EventSubscriber;
use EzSystems\EzPlatformAdminUi\Menu\Event\ConfigureMenuEvent;
use EzSystems\EzPlatformAdminUi\Menu\MainMenuBuilder;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class MyMenuSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
return [
ConfigureMenuEvent::MAIN_MENU => ['onMenuConfigure', 0],
];
}
public function onMenuConfigure(ConfigureMenuEvent $event)
{
$menu = $event->getMenu();
$menu[MainMenuBuilder::ITEM_CONTENT]->addChild(
'all_content_list',
[
'label' => 'Content List',
'route' => 'all_content_list.list',
]
);
}
}
|
This subscriber subscribes to the ConfigureMenuEvent::MAIN_MENU
event (see line 14).
Line 26 points to the new route that you need to add to the routing file.
Add routing
Add the following block to config/routes.yaml
:
| all_content_list.list:
path: /all_content_list/{page}
defaults:
page: 1
_controller: App\Controller\AllContentListController::listAction
|
Create a controller
As you can see in the code above, the next step is creating a controller that will take care of the article list view.
In src/Controller
create an AllContentListController.php
file (it will be registered automatically):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 | <?php
namespace App\Controller;
use EzSystems\EzPlatformAdminUiBundle\Controller\Controller;
use eZ\Publish\API\Repository\SearchService;
use eZ\Publish\API\Repository\ContentTypeService;
use eZ\Publish\API\Repository\Values\Content\Query\Criterion;
use eZ\Publish\API\Repository\Values\Content\LocationQuery;
use eZ\Publish\Core\Pagination\Pagerfanta\LocationSearchAdapter;
use Pagerfanta\Pagerfanta;
class AllContentListController extends Controller
{
private $searchService;
private $contentTypeService;
public function __construct(SearchService $searchService, ContentTypeService $contentTypeService)
{
$this->searchService = $searchService;
$this->contentTypeService = $contentTypeService;
}
public function listAction($page = 1)
{
$query = new LocationQuery();
$criterions = [
new Criterion\Visibility(Criterion\Visibility::VISIBLE),
];
$query->query = new Criterion\LogicalAnd($criterions);
$paginator = new Pagerfanta(
new LocationSearchAdapter($query, $this->searchService)
);
$paginator->setMaxPerPage(8);
$paginator->setCurrentPage($page);
return $this->render('list/all_content_list.html.twig', [
'totalCount' => $paginator->getNbResults(),
'articles' => $paginator,
]);
}
}
|
The highlighted line 41 indicates the template that will be used to display the list.
Add a template
Finally, create an all_content_list.html.twig
file in templates/list
:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 | {% extends '@ezdesign/ui/layout.html.twig' %}
{% block title %}{{ 'Content List'|trans }}{% endblock %}
{%- block breadcrumbs -%}
{% include '@ezdesign/ui/breadcrumbs.html.twig' with { items: [
{ value: 'url.list'|trans|desc('Content List') }
]} %}
{%- endblock -%}
{%- block page_title -%}
{% include '@ezdesign/ui/page_title.html.twig' with {
title: 'url.list'|trans|desc('Content List'),
icon_name: 'article'
} %}
{%- endblock -%}
{%- block content -%}
<section class="container my-4">
<div class="ez-table-header">
<div class="ez-table-header__headline">{{ "Content List"|trans }}</div>
</div>
<table class="table">
<thead>
<tr>
<th>{{ 'Content name'|trans }}</th>
<th>{{ 'Content Type'|trans }}</th>
<th>{{ 'Modified'|trans }}</th>
<th>{{ 'Published'|trans }}</th>
</tr>
</thead>
<tbody>
{% for article in articles %}
<tr>
<td><a href={{ez_path(article)}}>{{ ez_content_name(article.contentInfo) }}</a></td>
<td>{{ article.contentInfo.contentTypeId }}</td>
<td>{{ article.contentInfo.modificationDate|ez_full_datetime }}</td>
<td>{{ article.contentInfo.publishedDate|ez_full_datetime }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{{ pagerfanta(articles, 'ez') }}
</section>
{%- endblock -%}
|
Check results
Tip
If you cannot see the results or encounter an error, clear the cache and reload the application.
At this point you can go to the Back Office and under "Content" you will see the new "Content list" item.
Select it and you will see the list of all Content items in the Repository.
