captFuture
I'm new here

#global.stopGenerate in abhängigkeit einer gesetzten metadaten Variable UND des verwendeten Schedulers setzen.

Jump to solution

Hallo liebe Community,

Ich stehe vor der Herausforderung auf 3 Verschiedene Environments auszuspielen (Development, Test, Produktion) und je nach Scheduler Eintrag für jedes Environment soll auf basis einer gesetzten checkbox in den metadaten eine Seite generiert werden oder nicht.

Beispiel:

Der Redakteur erstellt eine seite und bindet sie in der struktur ein, diese soll im moment nur für das Development generiert und ausgespielt werden, also aktiviert er die Schaltfläche DEV:

visible_fspirit.PNG

Beim Generierungsauftrag wählt der Redakteur eine Generierung auf DEV aus

generate_fspirit.PNG

Wenn die Seite für DEV "freigegeben" ist (was sie in diesem fall ja wäre) soll sie auf das DEV environment kopiert werden und wenn nicht sollte ein $CMS_SET(#global.stopGenerate,true)$ die generierung dieser Seite verhindern. Beispielsweise wenn die seite nur für DEV freigegeben ist, aber der Redakteur den kanal Generate to PROD ausführt.

Die Metadatenvariablen auszulesen ist mit #global.node.meta("md_donotgenerate") recht einfach und ich setze das in einem anderen Projekt auch ein um eine seite "auszuschalten" ohne die Verknüpfung löschen zu müssen.

Meine Frage ist nun:
Wie komme ich an den Scheduler Eintrag um im Seitentemplate eine schöne $CMS_IF bedingung schreiben zu können, die mir auf basis der Metadaten UND des ausgewählten Scheduler Eintrages eine Seite generiert oder dies eben verhindert.

Danke für die Hilfe

Christoph

0 Kudos
1 Solution

Accepted Solutions

Falls es jemanden interessiert wie das mit der Navigationsfunktion weitergeht (ich benutze diese auch für die Sitemap usw. und somit musste ich es nun doch machen:

In meiner Navigationsfunktion werden auf oberster ebene im beginHTML element die variablen deklariert und geholt:

$CMS_SET(ENV)$$CMS_VALUE(dv_environment, default:"DEV")$$CMS_END_SET$

$CMS_SET(CHECKEDENV)$$CMS_VALUE(#nav.ref.meta("md_environment"), default:"[DEV]")$$CMS_END_SET$

jedes ARRAY element bekommt dann eine $CMS_IF condition verpasst:

$CMS_IF(CHECKEDENV.toString.contains(ENV.toString))$

Das ganze beispiel anhand meiner hauptnavigation:

<CMS_HEADER>

  <CMS_FUNCTION name="Navigation" resultname="pt_mainNavigation">

    <CMS_PARAM name="expansionVisibility" value="all" />

    <CMS_PARAM name="wholePathSelected" value="1" />

    <CMS_PARAM name="root" value='pagefolder:3live' />

   

   

    <CMS_ARRAY_PARAM name="beginHTML">

      <CMS_ARRAY_ELEMENT index="0">

        <![CDATA[

           $CMS_SET(ENV)$$CMS_VALUE(dv_environment, default:"DEV")$$CMS_END_SET$

        $CMS_SET(CHECKEDENV)$$CMS_VALUE(#nav.ref.meta("md_environment"), default:"[DEV]")$$CMS_END_SET$       

        $CMS_IF(CHECKEDENV.toString.contains(ENV.toString))$

            <li>

            $-- debug output: ($CMS_VALUE(ENV)$-$CMS_VALUE(CHECKEDENV)$)--$

        $CMS_END_IF$

        ]]>

      </CMS_ARRAY_ELEMENT>

     

    </CMS_ARRAY_PARAM>

   

    <CMS_ARRAY_PARAM name="unselectedHTML">

      <CMS_ARRAY_ELEMENT index="0">

        <![CDATA[$CMS_IF(CHECKEDENV.toString.contains(ENV.toString))$<a class="$CMS_VALUE(#nav.comment,default:"")$" title="$CMS_VALUE(#nav.comment,default:"-")$" data-pageid="$CMS_VALUE(#nav.ref.page.id)$" href="$CMS_REF(#nav.ref)$">$CMS_VALUE(#nav.label.convert2)$</a>$CMS_END_IF$]]>

      </CMS_ARRAY_ELEMENT>

    </CMS_ARRAY_PARAM>

   

    <CMS_ARRAY_PARAM name="selectedHTML">

      <CMS_ARRAY_ELEMENT index="0">

         

        <![CDATA[$CMS_IF(CHECKEDENV.toString.contains(ENV.toString))$<a class="active $CMS_VALUE(#nav.comment,default:"")$" title="$CMS_VALUE(#nav.comment,default:"-")$" data-pageid="$CMS_VALUE(#nav.ref.page.id)$" href="$CMS_REF(#nav.ref)$">$CMS_VALUE(#nav.label.convert2)$</a>$CMS_END_IF$]]>

      </CMS_ARRAY_ELEMENT>

    </CMS_ARRAY_PARAM>

   

    <CMS_ARRAY_PARAM name="endHTML">

      <CMS_ARRAY_ELEMENT index="0">

        <![CDATA[

        $CMS_IF(CHECKEDENV.toString.contains(ENV.toString))$</li>$CMS_END_IF$]]>

      </CMS_ARRAY_ELEMENT>

    </CMS_ARRAY_PARAM>

   

  </CMS_FUNCTION>

</CMS_HEADER>

$CMS_VALUE(pt_mainNavigation)$

Schönen Nachmittag

Christoph

View solution in original post

0 Kudos
3 Replies
benjaminfrenz
Occasional Observer

Hi Christoph,

du kannst im generate-Task eine Variable setzen, bspw. "dv_environment" mit den Werten "PROD", "DEV", etc.

Diese Variable ist dann zum Zeitpunkt der Generierung verfügbar und kann mit CMS_IF geprüft werden.

Man könnte auch in den Projekteinstellungen eine Text- oder Combobox (bspw. "ps_environment") mit den o.g. Werten definieren und diese als Default nehmen. Wenn die Variable im generate-Task dann auch "ps_environment" heißt, wird der Wert in den Projekteinstellungen überschrieben.

Hier mal ein Code-Beispiel:

Projekteinstellungen "Formular":

<CMS_INPUT_COMBOBOX name="ps_environment" allowEmpty="no" hFill="yes" preset="copy" singleLine="yes" useLanguages="no">

<ENTRIES>

  <ENTRY value="dev">

    <LANGINFOS>

      <LANGINFO lang="*" label="DEV"/>

    </LANGINFOS>

  </ENTRY>

  <ENTRY value="test">

    <LANGINFOS>

      <LANGINFO lang="*" label="TEST"/>

    </LANGINFOS>

  </ENTRY>

  <ENTRY value="prod">

    <LANGINFOS>

      <LANGINFO lang="*" label="PROD"/>

    </LANGINFOS>

  </ENTRY>

</ENTRIES>

<LANGINFOS>

  <LANGINFO lang="*" label="Environment"/>

  <LANGINFO lang="DE" label="Umgebung"/>

</LANGINFOS>

</CMS_INPUT_COMBOBOX>

Projekteinstellungen "HTML":

$CMS_SET(ENV_DEV, "dev")$

$CMS_SET(ENV_TEST, "test")$

$CMS_SET(ENV_PROD, "prod")$

Seitentemplate "HTML":

$CMS_SET(ENV, ps_environment)$

Anschließend ist in ENV der Wert aus den Projekteinstellungen (relevant für Preview)

oder im Fall einer Generierung der Wert aus dem generate-Task hinterlegt.

$CMS_SWITCH(ENV)$

    $CMS_CASE(ENV_DEV)$

        ...

    $CMS_CASE(ENV_TEST)$

        ...

    $CMS_CASE(ENV_PROD)$

        ...

$CMS_END_SWITCH$

oder

$CMS_IF(ENV.equals(ENV_DEV))$

    ...

$CMS_ELSE$

    ...

$CMS_END_IF$

Bedenke aber, dass bei einem #global.stopGenerate zwar die Generierung der Seite abgebrochen wird, die URL aber trotzdem erzeugt wird. D.h. sie steht auch den Navigationsfunktionen zur Verfügung. Hier müsstest du also eine Logik implementieren, die für jeden Navigationseintrag die Metadaten berücksichtigt.

#nav.meta("md_donotgenerate", "none")

Viele Grüße

Benjamin

Danke Benjamin,

Das meiste hatte ich ja schon, deine Ausführliche Anleitung hat mich zu folgender Lösung geführt.

1.) Im generate-Task wurde eine Variable je nach Enwironment gesetzt -  "dv_environment" mit den Werten "PROD", "SIT", "DEV"

2.) Im metadatentemplate war schon eine combobox um die environments auf denen es erscheinen soll anzuhaken (mit regeleinschränkung, dass dies nur Admin und Chefredakteur machen können.

<CMS_INPUT_CHECKBOX name="md_environment" gridHeight="1" gridWidth="2" hFill="yes" useLanguages="no">

<ENTRIES>

  <ENTRY value="PROD">

    <LANGINFOS>

      <LANGINFO lang="*" label="PROD"/>

    </LANGINFOS>

  </ENTRY>

  <ENTRY value="SIT">

    <LANGINFOS>

      <LANGINFO lang="*" label="SIT"/>

    </LANGINFOS>

  </ENTRY>

  <ENTRY value="DEV">

    <LANGINFOS>

      <LANGINFO lang="*" label="DEV"/>

    </LANGINFOS>

  </ENTRY>

</ENTRIES>

<LANGINFOS>

  <LANGINFO lang="DE" label="Sichtbar auf"/>

  <LANGINFO lang="*" label="Visible on "/>

</LANGINFOS>

</CMS_INPUT_CHECKBOX>

3.) Im Seitentemplate Html am Anfang der Seite eingefügt

$CMS_SET(ENV)$$CMS_VALUE(dv_environment, default:"DEV")$$CMS_END_SET$

$CMS_SET(CHECKEDENV)$$CMS_VALUE(#global.node.meta("md_environment"), default:"DEV")$$CMS_END_SET$

$CMS_SWITCH(ENV)$

    $CMS_CASE("DEV")$

        $CMS_IF(CHECKEDENV.toString.contains("DEV") == false)$

            $CMS_SET(#global.stopGenerate,true)$

        $CMS_END_IF$

    $CMS_CASE("SIT")$

        $CMS_IF(CHECKEDENV.toString.contains("SIT") == false)$

            $CMS_SET(#global.stopGenerate,true)$

        $CMS_END_IF$

    $CMS_CASE("PROD")$

        $CMS_IF(CHECKEDENV.toString.contains("PROD") == false)$

            $CMS_SET(#global.stopGenerate,true)$

        $CMS_END_IF$

$CMS_END_SWITCH$

4.) Das mit der Navigation werde ich warscheinlich später noch nachziehen (ist im Moment nicht nötig)

5.) Zusätzlich gibt es noch in Verbindung mit den Freigabeprozessen der Redakteursworkflows für DEV und SIT im Auftrag ein script welches auch nicht freigegebene Seiten generiert (quasi den workflow umgeht)

context.getProject().setUseRelease(false);

Ich habe es getestet und es funktioniet wunderbar.

Danke

Christoph

(Firstspirit Server-Version: 5.2.422.73933)

0 Kudos

Falls es jemanden interessiert wie das mit der Navigationsfunktion weitergeht (ich benutze diese auch für die Sitemap usw. und somit musste ich es nun doch machen:

In meiner Navigationsfunktion werden auf oberster ebene im beginHTML element die variablen deklariert und geholt:

$CMS_SET(ENV)$$CMS_VALUE(dv_environment, default:"DEV")$$CMS_END_SET$

$CMS_SET(CHECKEDENV)$$CMS_VALUE(#nav.ref.meta("md_environment"), default:"[DEV]")$$CMS_END_SET$

jedes ARRAY element bekommt dann eine $CMS_IF condition verpasst:

$CMS_IF(CHECKEDENV.toString.contains(ENV.toString))$

Das ganze beispiel anhand meiner hauptnavigation:

<CMS_HEADER>

  <CMS_FUNCTION name="Navigation" resultname="pt_mainNavigation">

    <CMS_PARAM name="expansionVisibility" value="all" />

    <CMS_PARAM name="wholePathSelected" value="1" />

    <CMS_PARAM name="root" value='pagefolder:3live' />

   

   

    <CMS_ARRAY_PARAM name="beginHTML">

      <CMS_ARRAY_ELEMENT index="0">

        <![CDATA[

           $CMS_SET(ENV)$$CMS_VALUE(dv_environment, default:"DEV")$$CMS_END_SET$

        $CMS_SET(CHECKEDENV)$$CMS_VALUE(#nav.ref.meta("md_environment"), default:"[DEV]")$$CMS_END_SET$       

        $CMS_IF(CHECKEDENV.toString.contains(ENV.toString))$

            <li>

            $-- debug output: ($CMS_VALUE(ENV)$-$CMS_VALUE(CHECKEDENV)$)--$

        $CMS_END_IF$

        ]]>

      </CMS_ARRAY_ELEMENT>

     

    </CMS_ARRAY_PARAM>

   

    <CMS_ARRAY_PARAM name="unselectedHTML">

      <CMS_ARRAY_ELEMENT index="0">

        <![CDATA[$CMS_IF(CHECKEDENV.toString.contains(ENV.toString))$<a class="$CMS_VALUE(#nav.comment,default:"")$" title="$CMS_VALUE(#nav.comment,default:"-")$" data-pageid="$CMS_VALUE(#nav.ref.page.id)$" href="$CMS_REF(#nav.ref)$">$CMS_VALUE(#nav.label.convert2)$</a>$CMS_END_IF$]]>

      </CMS_ARRAY_ELEMENT>

    </CMS_ARRAY_PARAM>

   

    <CMS_ARRAY_PARAM name="selectedHTML">

      <CMS_ARRAY_ELEMENT index="0">

         

        <![CDATA[$CMS_IF(CHECKEDENV.toString.contains(ENV.toString))$<a class="active $CMS_VALUE(#nav.comment,default:"")$" title="$CMS_VALUE(#nav.comment,default:"-")$" data-pageid="$CMS_VALUE(#nav.ref.page.id)$" href="$CMS_REF(#nav.ref)$">$CMS_VALUE(#nav.label.convert2)$</a>$CMS_END_IF$]]>

      </CMS_ARRAY_ELEMENT>

    </CMS_ARRAY_PARAM>

   

    <CMS_ARRAY_PARAM name="endHTML">

      <CMS_ARRAY_ELEMENT index="0">

        <![CDATA[

        $CMS_IF(CHECKEDENV.toString.contains(ENV.toString))$</li>$CMS_END_IF$]]>

      </CMS_ARRAY_ELEMENT>

    </CMS_ARRAY_PARAM>

   

  </CMS_FUNCTION>

</CMS_HEADER>

$CMS_VALUE(pt_mainNavigation)$

Schönen Nachmittag

Christoph

0 Kudos