CodeCharge: Custom Blocks innerhalb Panels

Dieser Artikel bezieht sich auf CodeCharge Studio 4.01.00.06. Andere Versionen könnten sich abweichend verhalten!

Seit ein paar Wochen arbeite ich an einem Projekt, welches die Vorgabe hat, komplett in CodeCharge enwickelt zu werden. Dabei bin ich immer wieder an die Grenzen dieses mächtigen Werkzeuges gestossen. Ein häufiges Problem ist für mich, die Custom-Block-Möglichkeiten der Template-Klasse an Stellen zu verwenden, die CodeCharge anscheinend nicht dafür vorgesehen hat und daher nicht ohne weiteres zulässt.

Es gibt drei unterschiedlich zu behandelnde Fälle, Custom Blocks zu plazieren, soweit ich das überblicke:

  • in der obersten Ebene, ausserhalb aller Components
    Hier gibt es gar keine Probleme. Man kann seine Custom Blocks einfach definieren:

    <!-- BEGIN mein_custom_block -->
       mein html code undso mit {meine_variable}
    <!-- END mein_custom_block -->
    

    und per benutzerdefinierten PHP-Code z.B. im „Before Show“-Event der Seite so verwenden:

    global $Tpl;
    $first = true;
    foreach ($mein_array as $element)
    {
       $Tpl->SetVar("meine_variable", element);
       $Tpl->Parse("mein_custom_block", !$first);
       $first = false;
    }
    
  • innerhalb eines Blockes (z.B. Row) einer Component (z.B. Grid)
    Das funktioniert fast genauso. Man muss der Template-Klasse nur die eigene Block-Variable nennen:

    global $Tpl;
    $first = true;
    $Tpl->SetBlockVar("mein_custom_block","");
    foreach ($mein_array as $element)
    {
       $Tpl->SetVar("meine_variable", element);
       $Tpl->Parse("mein_custom_block", !$first);
       $first = false;
    }
    

    Diese ersten beiden Fälle sind auch dokumentiert: Working with Custom Template Blocks

  • innerhalb eines Panels (bzw. Update-Panels)
    Will man einen Custom-Block innerhalb eines Panels verwenden, was ja das Mittel der Wahl sein soll, sobald man ganze Bereiche der Webseite einfach ein bzw. ausblenden muss (z.B. wegen Zugangsberechtigungen), dann funktionieren die ersten beide Vorgehensweisen nicht mehr. Custom-Blöcke werden hier nicht berücksichtigt, ja sogar vor dem Anzeigen entfernt.

    Das liegt daran, dass der Template-Klassen-interne Zeiger auf der darüberliegenden Ebene stehen bleibt, sobald man sich im „before show“-Ereignis des Panels befindet.
    Die Abhilfe dazu sieht so aus, dass man

    1. sich die aktuelle Position des Template-Klassen-Zeigers merkt (in unserem Fall müsste „/main“ darin stehen),
    2. dann den Zeiger mit dem Panel-Pfad-Überschreibt (z.B. „/main/Panel mein_panel“),
    3. hier wie bei den anderen beiden Fällen, die Template-Operationen durchführt und
    4. danach den Zeiger wieder auf den ursprünglichen Punkt richtet (also in unserem Beispiel wieder auf „/main“).
    global $Tpl;
    // (1):
    $aktueller_zeiger = $Tpl->block_path;
    // (2):
    $Tpl->block_path = $aktueller_zeiger . "/Panel mein_panel";
    // (3):
    $first = true;
    foreach ($mein_array as $element)
    {
       $Tpl->SetVar("meine_variable", element);
       $Tpl->Parse("mein_custom_block", !$first);
       $first = false;
    }
    // (4):
    $Tpl->block_path = $aktueller_zeiger;
    

    Benötigt man übrigens in seinem Panel lediglich eine Template-Variable (also {meine_variable}) ohne einen Custom-Block, so braucht man sich nicht mit diesem Workaround abgeben. Template-Variablen alleine funktionieren innerhalb von Panels wie gewohnt und völlig problemlos.

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>