Optimierung der Templates

suther

Member
Ich habe das default-Template für meine zwecke etwas aufgehübscht.

Dabei ist mir eine etwas ungünstige Umsetzung der SideNav aufgefallen, die mir jetzt bei leerem Navigationsbaum einen unschönen Container darstellt (da ich mir eine mit Schatten hinterlegte Navi-Box generiert habe.

Ich denke mal, das alles auf die sidenav.tpl.htm Datei heinauslaufen wird.

Hier ist der Quellcode:
templates/sidenav.tpl.htm

HTML:
<ul id="submenu">
    <tmpl_loop name="nav_left">
        <li class="title">
        <tmpl_if name="startpage">
            <a href="#" onclick="loadContent('<tmpl_var name='startpage'>')">
        </tmpl_if>
        <tmpl_var name="title">
            <tmpl_if name="startpage">
                </a>
            </tmpl_if>
        </li>
            <tmpl_loop name="items">
                <li <tmpl_if name="html_id"> id='<tmpl_var name="html_id">' </tmpl_if>>
                    <tmpl_if name="link">
                        <tmpl_if name="target" op="==" value="_blank">
                        <a href="<tmpl_var name='link'>" target="_blank">
                        <tmpl_else>
                        <a href="#" onclick="loadContent('<tmpl_var name='link'>')">
                        </tmpl_if>
                    </tmpl_if>
                    <tmpl_var name="title">
                    <tmpl_if name="link">
                        </a>
                    </tmpl_if>
                </li>
            </tmpl_loop>
    </tmpl_loop>
</ul>

Die TPL-Engine is mir jetzt nicht bekannt, aber kann man nicht relativ simple eine Abfrage davor setzen, die prüft, ob überhaupt eine der hier zu verarbeitenden Variablen einen Wert hat, und wenn nicht, dass dann das gesamte <ul> nicht angezeigt wird?
 

tkausl

New Member
Die Template-Engine scheint sehr Primitiv zu sein und es wird gerne mal zwischen <> und {} gewechselt bei Template-Variablen und co. ist mir so aufgefallen.

Wird es nichtmal Zeit, auf Smarty zu wechseln?
 

nowayback

Well-Known Member
Oh nein... Wenn hier smarty zum einsatz kommt, fliegt ispconfig wieder runter. Die Gründe dazu findet man mit etwas suchen im Quellcode von Smarty...
 

suther

Member
Es is mir ein Rätsel, warum immer solche Template-Engines zum Einsatz kommen, da doch PHP selbst eine Art eingebaute Template-Engine is.

Ob ich nun eine PHP-IF-Schleife in den Quellcode-Hämmere, oder ob da smarty-Klammern stehen. Und scheinbar alles nur weil es halt - egal was es is, ABER - kein PHP sein soll.
Wobei Smarty und Co ja auch PHP-PRogrammblöcke zulässt - also meiner Meinung nach - performance-raubend, aufblähend, verkomplizierend, kurzum unnötig!

Aber eh hier ein Flame-War gestartet wird, wäre ich froh eine Antwort auf meine eingangs gestellte Frage zu erhalten.
 

Till

Administrator
Die Template-Engine scheint sehr Primitiv zu sein und es wird gerne mal zwischen <> und {} gewechselt bei Template-Variablen und co. ist mir so aufgefallen.

Die TEmplate engine kann exakt dass was sie können soll und es ist meines Erachtens eine sehr gute Template engine, sie unterstützt u.a. 2 verschiedene Syntaxe wie Du bereits selbst rausgefunden hast. Smarty ist viel zu aufgebläht. Wir hatten den smarty code damals evaluiert und das Ergebnis war das Smarty keinesfalls eingesetzt wird.

Oh nein... Wenn hier smarty zum einsatz kommt, fliegt ispconfig wieder runter. Die Gründe dazu findet man mit etwas suchen im Quellcode von Smarty...

Dem kann ich nur zustimmen.

aber kann man nicht relativ simple eine Abfrage davor setzen, die prüft, ob überhaupt eine der hier zu verarbeitenden Variablen einen Wert hat, und wenn nicht, dass dann das gesamte <ul> nicht angezeigt wird?

Die Variablen stehen nur innerhalb des loop zur Verfügung, daher kannst Du sie nicht auserhalb des loop abfragen.

Ob ich nun eine PHP-IF-Schleife in den Quellcode-Hämmere, oder ob da smarty-Klammern stehen. Und scheinbar alles nur weil es halt - egal was es is, ABER - kein PHP sein soll.

Der Grund für eine Template engine ist einfach dass man eben keinen PHP Code im Template haben möchte um eine saubere Trennung der Software Layer zu erhalten, denn wenn Du ein großes OpenSource Projekt wie ispconfig entwickelst und dann PHP in templates zulässt dann wandert immer mehr Code Stück für Stück von den Library und code Dateien in die Templates und nach kurzer Zeit ist die Software faktisch unwartbar.
 

suther

Member
Danke Till für dein Feedback.
Das mit dem Zulassen von PHP als Templatesprache in Großen Projekten kann ich nachvollziehen.

Nun gut, mich stört es nicht weiter, da ich ja nicht dauernd damit arbeite. Aber nochmal zu meiner Frage... hast du da auch eine Lösungsmöglichkeit parat? Ich habe da rumgebastelt und es nicht hinbekommen, dass der DIV nicht angezeigt wird, wenn er leer ist.

Bin für jeden praktischen Tipp dankbar.
 

tkausl

New Member
Würde mal Sagen es wäre sinnvoll das ganze im Top-Menü einzubauen statt im Left-Menü. Der Button oben im Menü braucht ja garnicht angezeigt zu werden, wenn es garkeine Unterseiten gibt.
 

suther

Member
Ich denke dazu müsste man in der nav.php Datei eine neue Variable setzen, z.b. "has_items" welche angibt ob ein menü Einträge hat die man dann im Template als tmpl_if um den loop legen kann. Ich hab das mal als feature request im Bugtracker eingefügt.

FS#2990 : Add a new variable "has_items" in nav.php when a menu contians menu items

Jo-Ne, bringt nicht wirklich was. Weil der Navigations-Div ja schon in der Template-Datei dargestellt wird.
HTML:
  <!-- begin: main content area #main -->
            <section id="main" name="content">
                <nav id="sideNav" class="clearfix">&nbsp;</nav>
                <!-- begin: #content -->
                <section id="content">
                    <form method="post" action="" id="pageForm" name="pageForm" enctype="multipart/form-data" class="uniForm">
                        <div id="pageContent"><!-- AJAX CONTENT --></div>
                    </form>
                    <div id="ie_clearing">&nbsp;</div>
                    <!-- End: IE Column Clearing -->
                </section>
                <!-- end: #content -->
            </section>
            <!-- end: #main -->

Sprich - hier müsste ein Schritt vorher gestartet werden. Dass der gesamte ul -li und sidenav-Bereich nur über die nav.php eingefügt wird.
 

Till

Administrator
Der Div sollte auch immer unsichtbar sein, er ist nur ein Platzhalter für Ajax Requests und nict fürs styling des Menüs. Du kannst ja im nav Template einen eigen div um Dein menü legen wenn Du es mit eine Rahmen versehen willst.
 

Croydon

Super-Moderator
Zum Thema Template-Variable für Elementanzahl:

Beginnend mit Version 3.0.5.3 wird automatisch eine Zählervariable angelegt, wenn eine Schleife im Template definiert wird.

Wenn eine Schleife mit setLoop() definiert wurde, die den Namen "meine_elemente" hat, so wird automatisch auch eine Variable im Template definiert, die "_meine_elemente_num" heißt.
Sie kann dann z. B. wie folgt verwendet werden:

<tmpl_if name='_meine_elemente_num' op='>=' value='10'>
<!-- nur anzeigen, wenn mehr als 10 Elemente vorhanden sind -->
</tmpl>

Im Beispielfall hier aus dem Thema wäre das dann also

<tmpl_if name='_nav_left_num' op='>' value='0'>
<!-- inhalt -->
</tmpl_if>
 

Werbung

Top