Inhaltsypen: Wie bekomme ich die Werte der Felder im Theme?

Gibt es irgendwo eine Anleitung oder Beispiel Scripte, wo man sehen kann wie im Frontend mit Inhaltstypen/Content-Types gearbeitet wird?

Ich habe gesehen, dass im Theme Ordner ein neuer Ordner “content_type” angelegt wird, wenn man Inhaltstypen im Backend anlegt.

Aber diese Darstellung der Felder alles hintereinander sogar ohne die Möglichkeit die Reihenfolge einzustellen oder Felder auszublenden in der Detailansicht kann es ja nicht gewesen sein.

Kann mir vielleicht jemand sagen, wie ich die Felder der Inhaltstypen einzeln ausgeben kann (content-type/detail.tpl)?

Ein var_dump der Variablen bringt mir nur die Struktur, nicht die Inhalte der Felder?

Die Werte findest du in der Variable $sItem.

 

1 „Gefällt mir“

Super danke. Wie kann ich denn die field templates laden für ein einzelnes Feld?

Im Template detail.tpl passiert das über

{include file=$field.template content=$sItem[$field.name] detail=$field}

in einer foreach Schleife. Klar kann ich das mit {if} eingrenzen auf das Feld, aber ich würde diese includes gerne einzeln pro Feld ausgeben.
$sItem[‚meinFeld‘] funktioniert nur bei content.

Eine weitere Frage:
Wie könnte man für verschiedene Inhaltstypen unterschiedliche Templates realisieren?

Erstmal solltest du nichts unter frontend/content_type/* ändern

Es wird erst versucht ein eigenes Template zu laden. Wenn dein Content Type z.B SwagFoo heißt, versucht er frontend/swag_foo/index.tpl oder frontend/swag_foo/detail.tpl zu laden.

Jedes Feld bringt sein eigenes Template mit. Ich würde dir jedoch empfehlen einfach ein detail.tpl für dein Inhalttyp anzulegen und es wie gewollt ausgeben :slight_smile:

1 „Gefällt mir“

Ok das dachte ich mir schon mit den Theme Overrides. Vielen Dank für deine Hilfe.

Hey ho,
Anhand der Doku und diesem Forumbeitrag gehe ich davon aus, dass ich keinen „Controller“ anlegen muss um eigene Inhaltstypen mit der Übersicht / Detailansicht ausgeben zu können korrekt? 

Es scheint auszureichen, dass ich ein Inhaltstyp erstelle, davon ein neues Element erstelle und im Theme Folder die Datei „frontend/anwendung/index.tpl“ etc. anlegen welche ich aus dem „content_type“ holen kann. Korrekt?

Ich erhalte nämlich den folgenden Fehler beim aufruf der Übersichtsseite:
 

: Uncaught Enlight_Controller_Exception: Controller "anwendung" not found for request url http://foobar.memo/anwendung in /Users/srutishauser/Sites/foobar/engine/Library/Enlight/Controller/Dispatcher/Default.php:428
Stack trace:
#0 /Users/srutishauser/Sites/foobar/engine/Library/Enlight/Controller/Front.php(228): Enlight_Controller_Dispatcher_Default->dispatch(Object(Enlight_Controller_Request_RequestHttp), Object(Enlight_Controller_Response_ResponseHttp))
#1 /Users/srutishauser/Sites/foobar/engine/Shopware/Kernel.php(185): Enlight_Controller_Front->dispatch()
#2 /Users/srutishauser/Sites/foobar/vendor/symfony/http-kernel/HttpCache/SubRequestHandler.php(102): Shopware\Kernel->handle(Object(Symfony\Component\HttpFoundation\Request), 1, true)
#3 /Users/srutishauser/Sites/foobar/vendor/symfony/http-kernel/HttpCache/HttpCache.php(448): Symfony\Component\HttpKernel\HttpCache\SubRequestHandler::handle(Object(Shopware\Kernel), Object(Symfony\Component\HttpFoundation\Request), 1, true)
#4 /Users/srutishause in 

UPDATE:

Scheint damit zu tun haben, dass die SEO Url noch nicht generiert ist. Über den Pfad „http://foobar.memo/shopware.php?sViewport=CustomAnwendung“ kann ich auf die Übersicht zugreifen.

Für alle die es noch hinbekommen haben, pro Inhalttyp einen eigenen Template Ordner anzulegen.
https://developers.shopware.com/developers-guide/content-types/#displaying-in-frontend

Beispiel:  

Wenn ich ein Inhaltelement “Anwendung” mache mit einer Übersicht aller Teammitglieder und einer jeweiligen Detailansicht, wird der technische Name “CustomAnwendung” heissen. Somit heisst der Controller ebenfalls “CustomAnwendung”. Im Frontend wird als Fallback (wenn nichts anderes definiert) das Template Verzeichniss “…Bare/frontend/content_type” genutzt, welches man auf keinen Fall überschreiben soll.

Erstellt man nun ein eigenes Theme, kann man zwar das Template Verzeichniss “…MyTheme/frontend/content_type” updatesicher überschreiben, davon wird jedoch ebenfalls abgeraten. Wenn nun mehrere Inhaltstypen erstellt werden, teilen sich diese den gleichen Fallback, welcher dann ja umgeschrieben wurde.

Lösung:

Neuer Ordner im eigenen Theme mit dem Namen “…MyTheme/frontend/ custom_anwendung” anlegen und darin alle Templates editieren, welche für den spezifischen Inhaltstyp “Anwendung” wichtig sind.

Der Hacken bei mir war, dass das Template aufgrund falscher Benennung nie funktioniert hat. -> Controller heisst zwar “CustomAnwendung” doch der Ordner muss “custom_anwendung” heissen. Selbstverständlich kann “Anwendung” durch den eigenen jeweiligen Inhaltstyp ersetzt werden.

Der technische Name wird einem beim erstellen des Inhalttyps angezeigt.

1 „Gefällt mir“

Die Templates anzupassen für verschiedene Inhaltstypen funktioniert nun super bei mir.

Jetzt würde mich noch Interessieren, wie man am besten Listenansichten der Inhaltstypen auf anderen Seiten (z.B. Homepage) inkludieren kann?
Welche Möglichkeiten gibt es da und welche ist am einfachsten?

  • Inkludieren mit Parameter über Smarty (gibt es so eine Funktion schon für Inhaltstypen?)
  • API Abfrage mit PHP (Plugin nötig) oder Javascript?

Generell habe ich gerade das Problem, das ich nicht weiß, wo ich loslegen soll ;(

Es gibt eine fetchContent methode in smarty

https://github.com/shopware/shopware/blob/5.6/UPGRADE-5.6.md#content-types

Perfekt! Das sollte unbedingt in die Doku aufgenommen werden. Danke!

Also das mit den Templates klappt mit den Listings schon sehr gut, nur habe ich Probleme auf die Detailseite zu linken.

Wenn ich den Link im Listing wie folgt erstelle…

         {s name="frontend/custom/readmore"}weiterlesen{/s}

…erhalte ich die Fehlermeldung:

Fatal error: Uncaught Enlight_Controller_Exception: Action "Frontend_Index_detailAction" not found failure for request url http://meineurl.de/index/detail/id/2 ...

 

Ok hier die Lösung…

Inhaltstyp: Veranstaltungen
Ordner: meinTheme/frontend/custom_veranstaltungen
Datei: meinTheme/frontend/custom_veranstaltungen/module.tpl

die module.tpl inkludiere ich dann über

{ include file=‘frontend/custom_veranstaltungen/module.tpl’}

In der module.tpl dann:

{fetchContent type=veranstaltungen assign=veranstaltungen}

{foreach $veranstaltungen as $event}
{$event.titel}
{$event.beginn}
{$event.ende}

...


       {s name="frontend/custom/readmore"}weiterlesen{/s}


{/foreach}

 

Ich habe noch mal eine Frage zu fetchContent:

Wie kann ich in der Filterfunktion eine Ebene weiter runter?

{fetchContent type=myContentType assign=myContentType limit=4 filter=[['property' => 'ebene2.articleName', 'value' => 'gesuchterName']]}

Also in Smarty kann ich {myContentType.ebene2.articleName} ausgeben, in der fetchContent Funktion kann ich diese aber nicht zum filtern nutzen. Attribute in der ersten Ebene funktionieren problemlos.

Hintergrund: Mein Inhaltstyp hat ein Produktauswahl Feld, über das ich die Einträge gerne auf der Produkt-Detailseite filtern würde.

Ich bekomme es leider nicht hin, das Theme content_type aus dem Bare Theme zu überschreiben.

Habe ein Template erstellt unter meintheme/frontend/custom_team/listing/item.tpl
In diesem verwende ich
{extends file='parent:frontend/content_type/listing/item.tpl'}

Link zum Frontend: shopware.php?sViewport=CustomTeam

Dort erweitere ich das Template. Die Änderungen dort greifen allerdings nicht. Cache wurde natürlich geleert. Habe die Änderungen einmal im Bare Theme vorgenommen um sicher zu gehen. Dort greifen die Änderungen.

Danke

Versuche mal das {extends…} wegzulassen. Ich habe die index.tpl im Ordner darüber auch überschrieben, und die foreach Schleife geändert.

Das würde dann bei dir etwa so ausehen im {block name=‚frontend_index_content‘}:

 {foreach from=$sItems|sortby:"-updated_at" item=team}
                {include file="frontend/custom_team/listing/item.tpl"}
            {/foreach}