Search the FirstSpirit Knowledge Base
Hallo zusammen,
Für Liferay benötigt es nach Doku eine gefüllte content.xml Datei im Ordner System.
In ihrem Liferay Demo Projekt haben Sie eine Seitenvorlage ContentProjectionSitemap. Diese Seitenvorlage generiert mir aktuell aber aktuell kein Inhalt in die content.xml. Es steht lediglich der Kopf der XML Datei drin:
<?xml version="1.0" encoding="UTF-8" ?>
<Root projectname="POPeye" projectid="2738" />
Normalerweise sollten alle Seiten aufgenommen werden, welche in Strukturordnern hängen.
Der Templatecode ind er Seite ist recht komplex und ich finde nicht was gegeben sein muss, damit für die Seiten Einträge in der content.xml erstellt werden.
Besten Dank
Hallo Andreas,
die content.xml wird Projektspezifisch generiert. Daher handelt es isch auch bei der hier besprochenen Implementierung um ein erweitertes Beispiel aus dem Liferay Showcase. Sie ist nicht Teil des Moduls und wird auch auch nicht gewartet. Ihr könnt diesen Code aber für Eurer Projekt als Basis nehmen und an Eure Bedürfnisse anpassen.
Gruß,
--Bernd
Hallo Andreas,
folgendes kannst Du prüfen...
Es sollten nämlich nicht alle Seiten aus einem Strukturordner enthalten sein sondern folgende:
Kurz gesagt sollen in der content.xml die Seiten enthalten sein, die keinen eigenen Menüpunkt haben, bzw. nicht über einen Menüpunkt erreichbar sind.
Viele Grüße
Jan Tilo
Hallo Jan,
danke für deine Antwort.
Vom Konzept her habe ich das denke ich schon verstanden.
Ich habe in der Strukturverwaltung in einen Ordner mehrere Seiten angelegt. Nach einem Deployment hätte ich erwartet, dass die Content.xml danach die XML Beschreibung für die Seiten enthält, welche nicht als Startseite definiert sind. Leider ist meine content.xml aber leer.
Was genau mit dem Wort Contentprojektionen gemeint ist, verstehe ich auch noch nicht genau. Für mein Verständnis sollten all die Seiten in die content.xml rein geschrieben werden, welche nicht direkt über die navigation erreichbar sind.
Viele Grüsse
Andreas
Hallo Andreas,
Andreas Österle wrote:
Vom Konzept her habe ich das denke ich schon verstanden.
Ich habe in der Strukturverwaltung in einen Ordner mehrere Seiten angelegt. Nach einem Deployment hätte ich erwartet, dass die Content.xml danach die XML Beschreibung für die Seiten enthält, welche nicht als Startseite definiert sind. Leider ist meine content.xml aber leer.
Gibt es Fehler bei der Generierung? Bitte überprüf mal die Fehler der Vorschau.
Andreas Österle wrote:
Was genau mit dem Wort Contentprojektionen gemeint ist, verstehe ich auch noch nicht genau. Für mein Verständnis sollten all die Seiten in die content.xml rein geschrieben werden, welche nicht direkt über die navigation erreichbar sind.
Eine Contentprojektion ist eine Abbildung von Datensätzen (Contentstore) auf Seiten die über eine Seitenreferenz ausgesteuert werden.
Hallo Gerrit,
bei der Generierung wird kein Fehler ausgegeben. Im Log steht nur:
INFO 18.07.2013 12:04:47.183 (de.espirit.firstspirit.generate.SiteProduction): creating output stream for /de/system/content.xml
INFO 18.07.2013 12:04:47.183 (de.espirit.firstspirit.store.access.sitestore.PageRefImpl): generating page reference 'content' (id=14546, html, DE)
INFO 18.07.2013 12:04:47.188 (de.espirit.firstspirit.generate.SiteProduction): creating output stream for /de/system/footer/startseite.html
Eine Contentprojektion verwenden wir in dem Fall nicht. Ich habe zusätzliche Seiten in einen Strukturordner gelegt welche ich in der content.xml erwarte.
Hier noch das Script für die contentprojection:
<CMS_HEADER>
<CMS_FUNCTION name="Navigation" resultname="fr_completeSitemap">
<CMS_PARAM name="expansionVisibility" value="all"/>
<CMS_PARAM name="wholePathSelected" value="0"/>
<CMS_PARAM name="siteMap" value="1" />
<CMS_PARAM name="multiPages" value="1"/>
<CMS_ARRAY_PARAM name="pageRefRendering">
<CMS_ARRAY_ELEMENT index="0..10"><![CDATA[
$CMS_SET(node, #nav.node)$
$CMS_SET(c2p, node.getContent2Params())$
$CMS_IF(!c2p.isEmpty && #nav.ref.index >= 0)$
$CMS_SET(set_entityList, c2p.getData(#global.language, #nav.ref.index))$
$CMS_SET(set_IdList, [])$
$CMS_SET(set_itemNamePostfix, "")$
$CMS_SET(set_index, #nav.ref.index)$
$CMS_SET(set_pageversion, #nav.node.page.revision.id)$
$CMS_SET(set_version, #nav.node.revision.id)$
$CMS_IF(set_entityList.size > 0)$
$-- Index --$
$CMS_IF(isSet(set_entityList))$
$CMS_IF(set_entityList.size > 1)$
$CMS_IF(set_index == null || #nav.ref.index == 0)$
$CMS_SET(set_itemNamePostfix, "")$
$CMS_ELSE$
$CMS_SET(set_itemNamePostfix, "_" + #nav.ref.index)$
$CMS_END_IF$
$CMS_ELSE$
$CMS_IF(set_entityList.get(0) != null)$
$CMS_SET(set_itemNamePostfix, "_" + set_entityList.get(0).id)$
$CMS_END_IF$
$CMS_END_IF$
$CMS_END_IF$
$-- parent --$
$CMS_SET(set_parent, #nav.node.parent.id)$
$CMS_SET(old_prefix, #global.generationContext.urlCreator.getUrlPrefix())$
$CMS_SET(void, #global.generationContext.urlCreator.setUrlPrefix(""))$
$CMS_SET(prj, #global.project)$
$CMS_SET(set_page_type, "")$
$CMS_IF(#nav.ref.node.page.formData.fs_portal_pageType.value == "mixedportalpage")$
$CMS_SET(set_page_type, "mixedportalpage")$
$CMS_END_IF$
$CMS_IF(!#nav.node.isStartNode())$
<Item name="$CMS_VALUE(#nav.node.id)$$CMS_VALUE(set_itemNamePostfix)$" version="$CMS_VALUE(set_version)$" pageversion="$CMS_VALUE(set_pageversion)$" parent="$CMS_VALUE(set_parent)$" roles="'Guest','Kunden','Marketing','Mitglieder'" type="$CMS_VALUE(set_page_type)$">
$CMS_FOR(lang, #global.project.languages)$
<Title locale="$CMS_VALUE(lang.abbreviation.toLowerCase())$">$CMS_VALUE(#nav.label)$</Title>
$--<Url locale="$CMS_VALUE(lang.abbreviation.toLowerCase())$">$CMS_REF(#nav.ref,abs:1, lang:lang)$</Url>--$
$CMS_END_FOR$
<LayoutTemplate>$CMS_VALUE(#nav.ref.node.page.formData.fs_portal_layoutTemplate.value)$</LayoutTemplate>
$CMS_FOR(section, #nav.ref.node.body("linke_spalte").getChildren(class("de.espirit.firstspirit.access.store.pagestore.Section")))$
<Item name="$CMS_VALUE(section.getId())$" version="$CMS_VALUE(set_version)$" pageversion="$CMS_VALUE(set_pageversion)$" roles="'Guest','Kunden','Mitglieder','Marketing'">
$CMS_FOR(lang, #global.project.languages)$
<Url locale="$CMS_VALUE(lang.abbreviation.toLowerCase())$">$CMS_REF(#nav.ref,abs:1, lang:lang)$?sectionId=$CMS_VALUE(section.id)$</Url>
$CMS_END_FOR$
<LayoutContainer>column-1</LayoutContainer>
</Item>
$CMS_END_FOR$
$CMS_FOR(section, #nav.ref.node.body("rechte_spalte").getChildren(class("de.espirit.firstspirit.access.store.pagestore.Section")))$
<Item name="$CMS_VALUE(section.getId())$" version="$CMS_VALUE(set_version)$" pageversion="$CMS_VALUE(set_pageversion)$" roles="'Guest','Kunden','Mitglieder','Marketing'">
$CMS_FOR(lang, #global.project.languages)$
<Url locale="$CMS_VALUE(lang.abbreviation.toLowerCase())$">$CMS_REF(#nav.ref,abs:1, lang:lang)$?sectionId=$CMS_VALUE(section.id)$</Url>
$CMS_END_FOR$
<LayoutContainer>column-2</LayoutContainer>
</Item>
$CMS_END_FOR$
</Item>
$CMS_END_IF$
$CMS_SET(void, #global.generationContext.urlCreator.setUrlPrefix(old_prefix))$
$CMS_END_IF$
$CMS_END_IF$
]]></CMS_ARRAY_ELEMENT>
</CMS_ARRAY_PARAM>
</CMS_FUNCTION>
</CMS_HEADER><?xml version="1.0" encoding="UTF-8"?>
<Root projectname="$CMS_VALUE(#global.project.name)$" projectid="$CMS_VALUE(#global.project.id)$">
$CMS_VALUE(fr_completeSitemap)$
</Root>
Hallo Andreas,
also wenn ich auf die schnelle das Template anschaue, scheint es ja ausschließlich Contentprojektionen zu generieren.
Das wäre die Erklärung warum bei Dir nichts rauskommt.
Ob das so nun korrekt ist kann ich jetzt nicht beurteilen.
Viele Grüße
Jan Tilo
Hallo,
die Content.xml ist für Contentprojektionen geplant worden, kann aber im Projekt auch auf nicht "nicht Startseiten" angepasst werden.
Ich habe das jetzt nicht nachgetestet, sondern nur "trocken" angepasst.
<CMS_HEADER>
<CMS_FUNCTION name="Navigation" resultname="fr_completeSitemap">
<CMS_PARAM name="expansionVisibility" value="all"/>
<CMS_PARAM name="wholePathSelected" value="0"/>
<CMS_PARAM name="siteMap" value="1" />
<CMS_PARAM name="multiPages" value="1"/>
<CMS_ARRAY_PARAM name="pageRefRendering">
<CMS_ARRAY_ELEMENT index="0..10"><![CDATA[
$CMS_SET(node, #nav.node)$
$CMS_SET(c2p, node.getContent2Params())$
$CMS_SET(set_itemNamePostfix, "")$
$CMS_SET(set_pageversion, #nav.node.page.revision.id)$
$CMS_SET(set_version, #nav.node.revision.id)$
$CMS_SET(set_IdList, [])$
$CMS_IF(!c2p.isEmpty && #nav.ref.index >= 0)$
$CMS_SET(set_entityList, c2p.getData(#global.language, #nav.ref.index))$
$CMS_SET(set_index, #nav.ref.index)$
$CMS_IF(set_entityList.size > 0)$
$-- Index --$
$CMS_IF(isSet(set_entityList))$
$CMS_IF(set_entityList.size > 1)$
$CMS_IF(set_index == null || #nav.ref.index == 0)$
$CMS_SET(set_itemNamePostfix, "")$
$CMS_ELSE$
§CMS_SET(set_itemNamePostfix, "_" + #nav.ref.index)$
$CMS_END_IF$
$CMS_ELSE$
$CMS_IF(set_entityList.get(0) != null)$
$CMS_SET(set_itemNamePostfix, "_" + set_entityList.get(0).id)$
$CMS_END_IF$
$CMS_END_IF$
$CMS_END_IF$
$CMS_END_IF$
$CMS_END_IF$
$-- parent --$
$CMS_SET(set_parent, #nav.node.parent.id)$
$CMS_SET(old_prefix, #global.generationContext.urlCreator.getUrlPrefix())$
$CMS_SET(void, #global.generationContext.urlCreator.setUrlPrefix(""))$
$CMS_SET(prj, #global.project)$
$CMS_SET(set_page_type, "")$
$CMS_IF(#nav.ref.node.page.formData.fs_portal_pageType.value == "mixedportalpage")$
$CMS_SET(set_page_type, "mixedportalpage")$
$CMS_END_IF$
$CMS_IF(!#nav.node.isStartNode())$
<Item name="$CMS_VALUE(#nav.node.id)$$CMS_VALUE(set_itemNamePostfix)$" version="$CMS_VALUE(set_version)$" pageversion="$CMS_VALUE(set_pageversion)$" parent="$CMS_VALUE(set_parent)$" roles="'Guest','Kunden','Marketing','Mitglieder'" type="$CMS_VALUE(set_page_type)$">
$CMS_FOR(lang, #global.project.languages)$
<Title locale="$CMS_VALUE(lang.abbreviation.toLowerCase())$">$CMS_VALUE(#nav.label)$</Title>
$--<Url locale="$CMS_VALUE(lang.abbreviation.toLowerCase())$">$CMS_REF(#nav.ref,abs:1, lang:lang)$</Url>--$
$CMS_END_FOR$
<LayoutTemplate>$CMS_VALUE(#nav.ref.node.page.formData.fs_portal_layoutTemplate.value)$</LayoutTemplate>
$CMS_FOR(section, #nav.ref.node.body("linke_spalte").getChildren(class("de.espirit.firstspirit.access.store.pagestore.Section")))$
<Item name="$CMS_VALUE(section.getId())$" version="$CMS_VALUE(set_version)$" pageversion="$CMS_VALUE(set_pageversion)$" roles="'Guest','Kunden','Mitglieder','Marketing'">
$CMS_FOR(lang, #global.project.languages)$
<Url locale="$CMS_VALUE(lang.abbreviation.toLowerCase())$">$CMS_REF(#nav.ref,abs:1, lang:lang)$?sectionId=$CMS_VALUE(section.id)$</Url>
$CMS_END_FOR$
<LayoutContainer>column-1</LayoutContainer>
</Item>
$CMS_END_FOR$
$CMS_FOR(section, #nav.ref.node.body("rechte_spalte").getChildren(class("de.espirit.firstspirit.access.store.pagestore.Section")))$
<Item name="$CMS_VALUE(section.getId())$" version="$CMS_VALUE(set_version)$" pageversion="$CMS_VALUE(set_pageversion)$" roles="'Guest','Kunden','Mitglieder','Marketing'">
$CMS_FOR(lang, #global.project.languages)$
<Url locale="$CMS_VALUE(lang.abbreviation.toLowerCase())$">$CMS_REF(#nav.ref,abs:1, lang:lang)$?sectionId=$CMS_VALUE(section.id)$</Url>
$CMS_END_FOR$
<LayoutContainer>column-2</LayoutContainer>
</Item>
$CMS_END_FOR$
</Item>
$CMS_END_IF$
$CMS_SET(void, #global.generationContext.urlCreator.setUrlPrefix(old_prefix))$
]]></CMS_ARRAY_ELEMENT>
</CMS_ARRAY_PARAM>
</CMS_FUNCTION>
</CMS_HEADER><?xml version="1.0" encoding="UTF-8"?>
<Root projectname="$CMS_VALUE(#global.project.name)$" projectid="$CMS_VALUE(#global.project.id)$">
$CMS_VALUE(fr_completeSitemap)$
</Root>
Besten Dank für das Script. Ich werde es gleich ausprobieren.
Nachdem die Content.xml ja nun hauptsächlich für Content Projektionen gedacht ist, wäre die Frage wie man ansonsten hidden Pages im Portal erzeugt.
In der navigation.xml gibt es die Möglichkeit Seiten als invisible zu setzen. Wie man diese Einstellung aber über FirstSpirit steuert ist mir noch nicht ganz klar.
<Item name="4254" version="10399" modifiedby="Admin" pageversion="10652" type="mixedportalpage">
<Title locale="en">SeitentitelEnglisch</Title><Title locale="de">SeitentitelDeutsch</Title><GenericAttribute name="releasedate" value="2013-07-17-13-16-46" /><Priority>0</Priority><FolderEntry>true</FolderEntry><Invisible>true</Invisible>- <!--PortalPageWriter
--><LayoutTemplate>2_columns_iii</LayoutTemplate>
- <!--PortalSectionWriter
-->
Ein Entwickler vom Liferay Portal Connector hat mir erzählt, dass wenn dieses Attribut auf true gesetzt ist, die Seiten im Liferay auf hidden gesetzt werden. Er wusste jedoch selber nicht wie man in FirstSpirit das Flag steuert.
Hallo Andreas,
ein Menüknoten/Seite wird auf Invisible=true gesetzt wenn in der Struktur die Haken bei "Im Navigationsmenü" und "Navigationsmenü in Übersicht" für alle Sprachen nicht gesetzt sind.
Siehe hierzu auch die Dokumentation SAP Business Package for FirstSpirit Kapitel 3.2.2.1.
Viele Grüße
Jan Tilo
Hallo Jan Tilo,
wenn ich dich richtig verstanden habe, dann meinst du das man auf dem Strukturordner unter dem sich die Seiten befinden die Haken deselektieren muss bei "Im Navigationsmenü" und "Navigationsmenü in Übersicht (Sitemap) anzeigen?". Mache ich das, wird für die Inhaltsseite gar kein XML Eintrag mehr in der navigation_<entrypointid>.xml angelegt. Das war's daher leider nicht.
In der FirstSpirit_Modules_Liferay Dokumentation steht in Kapitel 3.1.3 Content Projectionen und andere lose Seiten nur, dass alle losen Seiten in der content.xml mit einer Item Struktur angelegt werden müssen.
Das Script von Gerrit Bösebeck funktioniert bis auf ein paar kleine Einschränkungen:
- Der Title wird in der content.xml auf den Referenznamen der Inhaltsseite gesetzt
- Der Roles Eintrag ist hart verdrahtet drin und muss noch dynamisch aus dem CMS_INPUT_PERMISSION ausgelesen werden