CMS-Seite via Twig aufrufen

Hallo,

ich möchte aus Twig heraus eine eigene CMS-Seite aufrufen. Konkret ist der Sinn, das Registrierung-Formular durch ein eigenes Formular zu ersetzen, welches im Endeffekt eine E-Mail sendet, statt den Kunden im Shop zu registrieren:

{% sw_extends '@Storefront/storefront/page/account/register/index.html.twig' %}

{% block page_account_register_container %}
    <div class="col-lg-8">
        {% sw_include ... } %}
    </div>
{% endblock %}

Die CMS-Seite ist bereits angelegt. Aber wie kann ich die konkret aufrufen?

Viele Grüße, Frank

Welches Formular nutzt du denn? Du kannst die dieses Plugin beschaffen:

Da werde ich relativ zeitnah ein Update raus bringen um Formulare mit einem Twig Snippet einzubinden.

Hallo Moorleiche,

ich nutze das Plugin „CMS-Erweiterungen für Shopware 6“ um eigene Formulare zu erstellen. In diesem Fall will ich die Kunden-Registrierung durch ein Formular ersetzen, welches eine E-Mail mit den Kundendaten an den Shopbetreiber sendet. Der nutzt eine Warenwirtschaft und will die Kundendaten zentral in der WaWi erfassen.

Viele Grüße, Frank

Irgendwie stehe ich gerade auf dem Schlauch. Mit folgendem Aufruf kann ich mein Formular im modalen Fenster aufrufen:

<a href="/widgets/cms/66c84e2e09e948789d077e4bbfd4a408"
       title="Contact us" 
       data-toggle="modal" 
       data-url="/widgets/cms/66c84e2e09e948789d077e4bbfd4a408">Contact us</a>

Ich möchte aber die gerenderte CMS-Seite nicht als Link zu einem modal, sondern direkt inkludieren, beispielsweise via

{% sw_include ... %}

Hat jemand einen Tipp? Ich kann dazu nichts finden :roll_eyes:.

Viele Grüße, Frank

Ein CMS-Element ist ein Eintrag in der Datenbank und keine Datei. Daher kannst du das nicht per include einbinden (soviel ich weiß, ehrlich gesagt noch nie mit dem Thema beschäftigt). Was du gepostet hast wird für einen AJAX call genutzt und über die ID das CMS geladen.

Da ich hier Shopware's twig functions - Shopware Developer keine Shopware-Funktion finde, schätze ich, dass das nur über einen Storefront Controller bzw. Subscriber möglich ist (schätze, keine Ahnung).

@Moorleiche kennst sich damit aber garantiert aus.

Danke. Ja, stimmt. Die CMS-Seite ist ja kein Template-File, was man mit sw_include einbinden kann. Aber irgendwie muss es doch gehen, das Teil einzubinden?

Irgendwie geht es immer… Aber der Weg zum Ziel wird sich nicht als Kurzgeschichte zusammenfassen lassen können. Ich habe soeben mein Plugin, welches ich vorgeschlagen habe angepasst, sodass man Twig Snippets nutzen kann :wink:

Hallo,

da ich „CMS-Erweiterungen für Shopware 6“ nutze, will ich jetzt nicht noch ein Plugin für die Formulare nutzen. Da muss ich eben weiter nach einer Lösung suchen. Danke trotzdem :neutral_face:.

Hallo Frank, kann verstehen, dass man sein System immer möglichst minimalistisch halten will. Aber um dein Vorhaben so umzusetzen, wirst du auch ein Plugin einsetzen/schreiben müssen. Mit Hausmitteln oder einem Theme geht das leider nicht. VG

Hallo Moorleiche,

ja, ich verstehe auch Dein Argument. Vielleicht nutze ich am Ende Dein Plugin. Es ist immer so eine Entscheidung: welche Dinge mache ich im Theme selber, wo mache ich ein Plugin, oder kaufe ein fertiges Plugin, weil der Aufwand zu hoch wird, wenn ich es nicht so schnell hinbekomme …

In diesem Fall verstehe ich noch nicht ganz, warum es so kompliziert ist. Im Footer werden die CMS-Seiten doch auch eingebunden. Muss mir mal anschauen, wie das dort umgesetzt ist.

Viele Grüße, Frank

Im Footer werden keine CMS-Seiten eingebunden.

ich meinte, wenn ich in der Footer-Navigation (Kataloge/Kategorien) auf eine eigene Shopseite verweise (z.B. Kontakt, Newsletter). Aber ist vielleicht doch was anderes?

Das ist ein simpler Hyperlink.

Ja, stimmt. Die Einbindung, wie ich sie brauche ist wohl eher ein „Snippet“.

Ein Snippet ist ein Textbaustein, der hat mit einer CMS-Seite überhaupt nichts zu tun.

Snippets bindest du per {{ 'snippet'|trans }} ein.

Ja, es gibt aber auch Code-Snippets :slightly_smiling_face:

Also sowas hier in der Art:

Wurde übrigens in diesem Beitrag behandelt, wo es genau um mein Problem geht:

Viele Grüße, Frank

Ab Shopware 6.X solltest du den Page_Loader nutzen.
Ob das allerdings im Template geht, kann ich dir nicht sagen.

{% set page = page_loader.load(‚technischer_name‘) %} //Name der Seite

Alternativ kannst du es auch über die id aus der datenbank erreichen:
// id = 018c8d0e0da0701c9a22fe350d52eaae;

<div class="cms-page-loader"
     data-url="{{ path('frontend.cms.page', { id: '018c8d0e0da0701c9a22fe350d52eaae' }) }}"
     data-loading="true">
    <div class="loading-indicator">Lädt...</div>
</div>

<script>
        const loader = document.querySelector('.cms-page-loader');
        
        if (loader) {
            const url = loader.getAttribute('data-url');

            // AJAX-Anfrage durchführen
            fetch(url)
                .then(response => {
                    if (!response.ok) {
                        throw new Error('Netzwerkfehler: ' + response.statusText);
                    }
                    return response.text();
                })
                .then(data => {
                    loader.innerHTML = data; // Ersetze den Inhalt mit den geladenen Daten
                })
                .catch(error => {
                    console.error('Fehler beim Laden der Seite:', error);
                });
        }
</script>