Shopware 6.6.x – Menüpunkt im Backend (Marketing → Statistik) wird nicht angezeigt – Pluginstruktur korrekt?

Hallo zusammen,

ich arbeite mit Shopware 6.6.10.3 und möchte ein eigenes Plugin erstellen, das im Backend unter „Marketing“ einen Menüpunkt „Statistik“ anzeigt. Dieser Menüpunkt soll später eine eigene Seite mit Statistikinformationen enthalten.

Wir haben bereits mehrere funktionierende Plugins für Shopware entwickelt. Doch bei einem so einfachen Ziel wie einem eigenen Menüpunkt mit Seite im Backend kommen wir bei Shopware 6.6.x aktuell nicht weiter – obwohl:

  • das Plugin korrekt installiert und aktiviert wird
  • build-administration.sh, assets:install und cache:clear ausgeführt wurden
  • kein Fehler im Plugin-Log oder in der Browser-Konsole erscheint

:wrench: Ziel

Ein Plugin mit Menüpunkt im Bereich „Marketing“, der beim Klick eine einfache Backend-Seite mit Titel und Text anzeigt.


:file_folder: Verwendete Plugin-Struktur

StatisticPlugin/
├── composer.json
└── src
    ├── StatisticPlugin.php
    └── Resources
        └── app
            └── administration
                └── src
                    └── module
                        └── statistic
                            ├── index.js
                            └── page
                                └── statistic
                                    └── index.js

:page_facing_up: composer.json

{
  "name": "statistic-plugin/statistic-plugin",
  "description": "Statistik Plugin für Shopware 6.6.x",
  "version": "1.0.0",
  "type": "shopware-platform-plugin",
  "license": "MIT",
  "autoload": {
    "psr-4": {
      "StatisticPlugin\\": "src/"
    }
  },
  "extra": {
    "shopware-plugin-class": "StatisticPlugin\\StatisticPlugin",
    "label": {
      "de-DE": "Statistik Plugin",
      "en-GB": "Statistic Plugin"
    }
  },
  "require": {
    "shopware/core": "^6.6"
  }
}

:page_facing_up: src/StatisticPlugin.php

<?php declare(strict_types=1);

namespace StatisticPlugin;

use Shopware\Core\Framework\Plugin;

class StatisticPlugin extends Plugin
{
}

:page_facing_up: src/Resources/app/administration/src/module/statistic/index.js

import './page/statistic';

Shopware.Module.register('statistic', {
    type: 'plugin',
    name: 'statistic',
    title: 'Statistik',
    description: 'Statistikmodul für Marketing',
    color: '#ff9900',
    icon: 'regular-chart-bar',
    routes: {
        index: {
            component: 'statistic-page',
            path: 'index'
        }
    },
    navigation: [{
        id: 'statistic-menu',
        label: 'Statistik',
        color: '#ff9900',
        path: 'statistic.index',
        parent: 'sw-marketing',
        position: 100
    }]
});

:page_facing_up: src/Resources/app/administration/src/module/statistic/page/statistic/index.js

const { Component } = Shopware;

Component.register('statistic-page', {
    template: `<sw-page>
        <template #smart-bar-header>
            <h2>Statistik Übersicht</h2>
        </template>
        <div class="sw-container">
            Willkommen auf der Statistik-Seite!
        </div>
    </sw-page>`
});

:test_tube: Nach der Installation ausgeführte Befehle:

bin/console plugin:refresh
bin/console plugin:install --activate StatisticPlugin
bin/console assets:install
bin/build-administration.sh
bin/console cache:clear

:cross_mark: Ergebnis

  • Kein Menüpunkt sichtbar im Bereich „Marketing“
  • Kein Fehler in der Konsole oder im Backend sichtbar
  • Kein Eintrag unter „Erweiterungen“ (obwohl Plugin aktiv ist)

:red_question_mark: Fragen

  1. Gibt es in Shopware 6.6.x.x Besonderheiten beim Registrieren von eigenen Modulen?
  2. Muss man zusätzliche Schritte beachten, um den Menüpunkt erscheinen zu lassen?
  3. Gibt es eine funktionierende Minimalstruktur, an der man sich orientieren kann?

Vielen Dank für jede Unterstützung – wir drehen uns hier im Kreis, obwohl das Plugin technisch korrekt aufgebaut scheint.

Hat mich echt ein paar Nerven gekostet, aber anscheinend hat Shopware ein Problem mit dem einteiligen Modulnamen, es erwartet anscheinend mindestens einen zweiteiligen Namen. Denn das hier funktioniert

Shopware.Module.register('stat-istic', {
    type: 'plugin',
    name: 'stat-istic',
    title: 'Hurz',
    description: 'description',

    routes: {
        index: {
            component: 'stat-istic-index',
            path: 'index'
        }
    },

    navigation: [
        {
            id: 'stat-istic',
            icon: 'regular-megaphone',
            color: '#FFD700',
            path: 'stat.istic.index',
            label: 'Statistik',
            parent: 'sw-marketing',
        },
    ]
});

das hier dagegen nicht

Shopware.Module.register('statistic', {
    type: 'plugin',
    name: 'statistic',
    title: 'Hurz',
    description: 'description',

    routes: {
        index: {
            component: 'statistic-index',
            path: 'index'
        }
    },

    navigation: [
        {
            id: 'statistic',
            icon: 'regular-megaphone',
            color: '#FFD700',
            path: 'statistic.index',
            label: 'Wein',
            parent: 'sw-marketing',
        },
    ]
});

Danke für den Hinweis! Der Punkt mit der main.js ist auf jeden Fall wichtig.

Das große Problem bei mir war aber die falsche Platzierung der main.js-Datei.
Ich hatte die Datei ursprünglich unter
StatisticPlugin/src/Resources/app/administration/main.js
statt wie erforderlich unter
StatisticPlugin/src/Resources/app/administration/src/main.js.

Nur wenn die main.js exakt in diesem Verzeichnis liegt und z. B. so aufgebaut ist:

import ‚./module/statistic-plugin‘;

…dann wird das Admin-Modul korrekt eingebunden. Der Pfad ./module/statistic-plugin muss dabei natürlich zu einem existierenden Verzeichnis führen, das index.js und ggf. weitere Komponenten enthält.

In meinem Fall war die komplette Struktur am Ende so aufgebaut:

> StatisticPlugin/
> ├── composer.json
> └── src
>     ├── StatisticPlugin.php
>     └── Resources
>         └── app
>             └── administration
>                 └── src
>                     ├── main.js
>                     └── module
>                         └── statistic-plugin
>                             ├── index.js
>                             └── page
>                                 ├── statistic-plugin-page.js
>                                 └── statistic-plugin-page.html.twig

Seit der Korrektur funktioniert der Menüpunkt wie erwartet.