Ein neues Templating-Konzept für OXID

Unter

http://www.oxid-esales.com/forum/showthread.php?t=1693

und

http://www.oxid-esales.com/forum/showthread.php?t=1694

hatte ich ja ein neues Templating-Konzept für OXID vorgestellt.

Jetzt habe ich mir endlich mal die Zeit genommen, das für die allgemeine Verwendung freizugeben.

Eingriffe in den OXID-Core sind dafür (dank “Smarty”) [B]nicht [/B]notwendig, die notwendigen Modifikationen erfolgen ausschließlich mit Hilfe von “Smarty” innerhalb des Templates.

Mit diesem Template wird erst mal das Layout des Original OXID-Templates erstellt.

Zum Test sollte unbedingt eine neues Template für OXID erzeugt werden, damit ggfs. das bestehende verwendet werden kann.

Dazu legt man am besten im Verzeichnis “[B]out[/B]” von OXID das neue Verzeichnis “[B]powertemplate[/B]” an.

Dort hinein kopiert man den Inhalt des bestehenden Templates, bzw. am Anfang besser den Inhalt des Standard-OXID-Templates “basic”.

In der Datei “[B]config.inc.php[/B]” muss dann die Anweisung:

[B]$this->sTheme = ‘basic’;[/B]

in

[B]$this->sTheme = ‘powertemplate’;[/B]

geändert werden, damit das neue Template verwendet wird.

In das Verzeichnis ‘[B]powertemplate[/B]’ kopiert man dann das Verzeichnis “[B]tpl[/B]” des ZIP-Archivs.

In die Datei “[B]de/cust_lang.php[/B]” integriert man dann die Texte aus der Datei “[B]de/cust_lang.php[/B]” des ZIP-Archivs.
(Danach alle Dateien im Verzeichnis “[B]tmp[/B]” löschen, damit die neuen Texte aktiv werden.)

[B]Was ist der Sinn dieses neuen Templating-Konzepts?[/B]

Es soll helfen, die [B]Strukturierung des Shop-Seitenlayouts[/B] zu vereinfachen, insbesondere die [B]Positionierung[/B] der diversen Shop-Elemente ("[B]Boxen[/B]").

Diese “[B]Boxen[/B]” sind im Standard-OXID-Template über die Template-Dateien “[B]_header.tpl[/B]”, “[B]_left.tpl[/B]”, “[B]_right.tpl[/B]”, “[B]_footer.tpl[/B]” verteilt, die Abgrenzung der einzelnen Elemente ("[B]Boxen[/B]") und ihre Verlagerung an andere Stellen auf der Seite ist somit sehr unübersichtlich.

Ebenso unschön ist, dass das gesamte [B]HTML-Layout [/B]der Shop-Seite nicht an einer Stelle übersichtlich verfügbar ist, sondern diese Teile auch über die o.g. Template-Dateien verteilt sind.

Und hier setzt jetzt das neue Templating an:

Alle “Boxen” [B]werden als einzelne Elemente separiert[/B], so dass sie als [B]individuelle “Smarty”-Variablen [/B]verfügbar sind (eine Voraussetzung, um diese einfach frei plazieren zu können).

Es gibt ein neues [B]Master-Template[/B] “[B]_index.tpl[/B]”, das das HTML-Layout der Seite [B]vollständig[/B] beschreibt.

In diesem Master-Template werden die “[B]Boxen[/B]” dann über ihren “Smarty”-Namen eingebunden.

Die “Boxen” können dann einfach entfernt, oder auch an andere Stelle im Template verschoben werden.

[B]Übersichtlicher geht es m.E. nicht mehr![/B]

Mehr technische Details findet man in den am Anfang Foren-Links.

Das Master-Template “[B]_index.tpl[/B]” hat folgende Struktur:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html[{if $oView->getActiveLangAbbr()}] lang="[{ $oView->getActiveLangAbbr() }]"[{/if}]>
<head>

    [{assign var="_titlesuffix" value=$_titlesuffix|default:$oView->getTitleSuffix()}]
    [{assign var="title" value=$title|default:$oView->getTitle() }]
    <title>[{$oxcmp_shop->oxshops__oxtitleprefix->value}][{if $title}] | [{$title|strip_tags}][{/if}][{if $_titlesuffix}] | [{$_titlesuffix}][{/if}]</title>
    <meta http-equiv="Content-Type" content="text/html; charset=[{$charset}]">
    [{if $oView->noIndex() == 1 }]
    <meta name="ROBOTS" content="NOINDEX, NOFOLLOW">
    [{elseif $oView->noIndex() == 2 }]
    <meta name="ROBOTS" content="NOINDEX, FOLLOW">
    [{/if}]
    [{if $oView->getMetaDescription()}]<meta name="description" content="[{$oView->getMetaDescription()}]">[{/if}]
    [{if $oView->getMetaKeywords()}]<meta name="keywords" content="[{$oView->getMetaKeywords()}]">[{/if}]
    <link rel="stylesheet" type="text/css" href="[{ $oViewConf->getResourceUrl() }]oxid.css">
    <link rel="shortcut icon" href="[{ $oViewConf->getBaseDir() }]favicon.ico">
    [{if $rsslinks}]
      [{foreach from=$rsslinks item='rssentry'}]
        <link rel="alternate" type="application/rss+xml" title="[{$rssentry.title|strip_tags}]" href="[{$rssentry.link}]">
      [{/foreach}]
    [{/if}]
    <script type="text/javascript" src="[{ $oViewConf->getResourceUrl() }]oxid.js"></script>
    <script type="text/javascript">[{oxscript}][{oxid_include_dynamic file="dyn/oxscript.tpl" }]</script>
    <!--[if lt IE 7]><script type="text/javascript">oxid.popup.addShim();</script><![endif]-->
</head>
[{php}]
//Avenger
//Modified templating concept Copyright 2009 by Avenger, [email protected]
//Do the templating magic!
$myConfig = oxConfig::getInstance();
include($myConfig->getTemplateDir().'boxes/_boxes.php');
//Avenger
[{/php}]
<body>
  <div id="page">
    <div id="header">
      <div class="bar oxid">
        <a class="logo" href="[{ $oViewConf->getBaseDir() }]">
          <img src="[{$oViewConf->getImageUrl()}]logo.png" alt="[{$oxcmp_shop->oxshops__oxtitleprefix->value}]">
        </a>
        [{$box_SERVICE}]        
        [{$box_ACCOUNT}]        
        [{$box_MINI_CART}]
        [{$box_TOP_NAVI}]
        <div class="clear"></div>
      </div>
      <div class="bar links[{if !$oView->showTopCatNavigation()}] single[{/if}]">
        <div class="fixed">
          [{$box_LANGUAGES}]
          [{$box_CURRENCIES}]
        </div>
        <div class="left">
          [{$box_HOME_LINK}]
          [{$box_WHISHLIST_LINK}]
        </div>
        <div class="right">
          [{$box_AGB_LINK}]
          [{$box_IMPRESSUM_LINK}]
          [{$box_MENU_LIST_LINK}]
        </div>
        <div class="clear"></div>
      </div>
    </div>
    <div id="content">
      <div id="left">
        <div id="left_box">
          [{$box_SEARCH}]
          [{$box_CATEGORIES}]
          [{$box_MANUFACTURERS}]
          [{$box_CONTENT}]
          [{$box_NEWS}]
          [{$box_VENDORS}]
          [{$box_WHATSNEW}]  
          [{$box_LONGRUNS}]  
          [{$box_PARTNERS}]
        </div>
      </div>
      <div id="right">
        <div id="right_box">
          [{$box_CART}]
          [{$box_LOGIN}]
          [{$box_NEWSLETTER}]
          [{$box_BESTSELLERS}]
          [{$box_SPECIALS}]
          [{$box_ACCESSORIES}]
          [{$box_CROSS_SELLING}]
          [{$box_ALSO_PURCHASED}]
          [{$box_SIMILIAR}]
          [{$box_TELL_FRIEND}]
        </div>
      </div>
      <div id="body">
        [{include file="inc/error.tpl" Errorlist=$Errors.default}]
        [{oxid_include_dynamic file="dyn/newbasketitem_message.tpl"}]

        [{$main_content}]
        <div class="clear"></div>
      </div>
      <div id="footer" align="center">
        [{$footer}]
      </div>
    </div>
    <div id="mask"></div>
    [{oxid_include_dynamic file="dyn/newbasketitem_popup.tpl"}]
    [{if $popup}][{include file=$popup}][{/if}]
  </body>
</html>

Die Boxen-Namen (z.B. “[B][{$box_SEARCH}][/B]”) sollten selbsterklärend sein, so dass eigentlich jeder weiss, welche Information eine “Box” liefert.

Die Template-Vorlagen für diese “Boxen” befinden sich im Verzeichnis “[B]boxes[/B]”. Wenn man eine Box ändern will, kann man dort [B]sehr gezielt [/B]das zuständige Template indentifizieren.

Jede Box erhält auch ihre [B]eigene “ID” [/B]und [B]CSS-Klasse [/B](beides entspricht dem Boxen-Namen), so dass man jede Box per Javascript und/oder CSS einfach addressieren kann.

[B]Das Archiv mit den notwendigen Dateien befindet sich im Anhang[/B].

Die Verwendung dieser Dateien geschieht ausschließlich auf das Risiko des Anwenders.

Eine Gewährleistung in jeglicher Form wird ausgeschlossen.

[B]Feedback zu evtl. Problemen oder sonstige Anmerkungen bitte über das OXID-Forum.[/B]

Der [B]xtCommerce[/B]-Kenner sieht sofort, dass diese Templating-Konzept sehr ähnlich dem dortigen Templating-Konzept ist, und sich auch die Namensgebung der “Boxen” an die dortige Nomenklatur hält.

Ich halte das xtCommerce Templating-Konzept nach wie vor für das übersichtlichste, was ich bisher so an Templates gesehen habe.

Insbesondere die zur Verfügungstellung der einzelnen Boxen als Smarty-Elemente, die dann über einen Master-Bauplan zusammengeführt werden, ist sehr konsequent und übersichtlich.

Bei den vielen Dingen, die xtCommerce besser machen könnte, muss man m.E. sagen: das ist prima gelungen!

[B]Und: Hände weg von Smarty!

[/B]Wie man hier sieht, kann man damit ganz massive Verbesserungen im Templating erzielen

Hi avenger,

das gefällt mir richtig gut. Ich hab schon in der Entwicklung nachgefragt ob, wann und wie wir das als integralen Bestandteil in den Standardshop übernehmen können. Dankeschön :slight_smile:

Allerdings hab ich immer ein bisschen Angst, dass so etwas in den Wirren des Forums untergeht. Willst Du den File nicht in den eXchange einstellen und die Erklärung dazu vielleicht als Tutorial auf der OXIDforge? Gern auch in Englisch, damit die nicht Deutsch sprechenden auch etwas davon haben.

Danke und Gruß

[QUOTE=avenger;14508]
[B]Und: Hände weg von Smarty![/B][/QUOTE]

Warum? Ich habe sehr gute Erfahrungen gemacht, indem ich Smarty erweitere.


class Datame_class_smarty extends Smarty{
	function __construct(){
		parent::__construct();

	}
	function fetch($resource_name, $cache_id = null, $compile_id = null, $display = false){
		$this->plugins_dir[]=$this->template_dir.'../plugins/';
		$this->config_dir=$this->template_dir.'../'.oxLang::getInstance()->getLanguageAbbr().'/';
		$sViewName=strtolower(get_class($this->_tpl_vars['oView']));
		//loads general config values
		if(file_exists($this->config_dir.'../src/template.conf')){
			$this->config_load('../src/template.conf',$sViewName);
		}
		//loads language specific config values
		if(file_exists($this->config_dir.'lang.conf')){
			$this->config_load('lang.conf',$sViewName);
		}
		return parent::fetch($resource_name, $cache_id, $compile_id, $display);
	}

}

Diese Smarty Klasse lädt automatisch:
[ul]
[li]out/DEIN_TEMPLATE/plugins
[/li][LIST]
[li]Dies ist ein zusätzliches Plugin Verzeichnis
[/li][li]Warum soll ich templatespezifische Plugins in das Pluginverzeichnis von Smarty packen?
[/li][/ul]
[li]out/DEIN_TEMPLATE/AKTUELLE_SPRACHE/lang.conf
[/li][ul]
[li]Lädt Sprachabhängige Texte ggf. die Config-Sektion, die so heißt wie die aktuelle View.
[/li][li]Ok, hier muss ich demnächst mal schauen, dass erweiterte Views zur Hauptview runtergerechnet werden.
[/li][/ul]
[li]out/DEIN_TEMPLATE/src/template.conf
[/li][ul]
[li]Dies sind zusätzlichen konfigurations Parameter
[/li][li]Hier habe ich zB. unsichtbare Kategorie-ID´s drinn, die ich trotzdem… nur halt nicht im Kategoriebaum… darstellen möchte.
[/li][/ul]
[/LIST]

Für mein nächstes Template bin ich an einer Smarty-Klasse drann, die jeder View eine zusätzliche View (falls vorhanden) ermöglicht.
…Oder warum soll man Oxid mit Modulen vollmachen, die nur templatespezifische Variablen erzeugen?
Wenn man dann ein anderes Template nutzt, muss man erst rausfinden, was für Module bei diesen Template Sinn machen oder man lädt (jedes Modul kostet Perfomance) immer diese unnötigen Module mit.
Weiterhin ist so die Installation des Templates einfacher, da weniger Module definiert werden müssen.

@avenger: Ich hab mir deine Idee auch schon im http://www.ecombase.de/forum/Umbau-des-OXID-Templating-Konzepts-t43639.html durchgelesen und muss sagen - ich bin überzeugt. Werde es wohl beim nächsten Projekt einsetzen und schauen was geht, da ich mich erst seit ein paar Wochen mit Oxid beschäftige.

Vor allem, dass man das Haupttemplate mit einer File im Überblick hat.

Würde es sehr begrüssen diesen Ansatz in einem der kommenden offiziellen Releases zu sehen.

[QUOTE=MBa;14525]Warum? Ich habe sehr gute Erfahrungen gemacht, indem ich Smarty erweitere.[/QUOTE]
[B]Genau das meine ich ja auch, da rennst Du bei mir weit offene Türen ein![/B]

Dieser Anmerkung war für alle diejenigen gedacht, die immer so locker behaupten, Smarty wäre Mist, und das aus OXID entfernt haben wollen.

Smarty ist m.E. das Größte seit Erfindung des Toastbrots, wenn es um das Templating von Internet-Anwendungen geht…

(Wie mächtig das ist, zeigt sich ja m.E. deutlich bei meinem Umbau des OXID-Templatings.)

Und wenn die OXID AG sich dann noch entschließen könnte, diese [B]absolut sinnlosen und redundanten[/B] “square brackets” ("[" “]”) aus der Smarty-Namens-Definition (die m.E. die Lesbarkeit der Templates sehr behindern) wegzulassen, wäre das traumhaft.

Ich habe mir Smarty (via Subclassing) auch ganz massiv erweitert, so dass es mir eine Menge Dinge automatisch erledigt, die ich so bei meiner Arbeit brauche.

Ich habe mir damit sogar ([B]voll transparent für die Shop-Software[/B]!) eine xtCommerce-Version gebaut, bei der der ganze Datenverkehr (und mehr) über AJAX abgewickelt wird…

[B]Kein [/B]komplettes Refresh der Browser-Seite mehr, sondern der Shop hat das [B]Look & Feel einer Desktop-Anwendung[/B]!

Sieht echt spektakulär aus!

[B]Und alles, ohne eine Zeile Code in der Shop-Software zu ändern![/B]

Und mit dem jetzt à la xtCommerce restrukturierten OXID-Templating habe ich die [B]Voraussetzungen [/B]geschaffen, so was auch mit OXID machen zu können!

Da ich ja jetzt auch alle Elemente des Shop Bildschirms (“Boxen”, “main_content”) als einzeln adressierbare Elemente in “Smarty” zur Verfügung habe (und die zugehörigen HTML-Elemente ja auch alle eine eigene ID haben…), könnte ich jetzt im Hauptbildschirm (via AJAX) gezielt nur diese HTML-Teile austauschen, ohne die Seite komplett neu laden zu müssen!

Und mit Smarty geht das dann im Prinzip wirklich einfach:

statt am Ende die “[B]_index.tpl[/B]” komplett zu rendern und zu übertragen, werden die Smarty-Elemente “Boxen” und “main_content” (identifizierbar) in einem Datenstrom zusammengefasst und übertragen.

Im Shop wird dann dieser Datenstrom per Javascript aufgesplittet, und die einzelnen Elemente werden als “innerHTML” des entsprechenden DOM-Elements der Shop-Seite ausgetauscht.

Irgendwann werde ich also sicher auch diese “[B]AJAXifizierung[/B]” von OXID in Angriff nehmen… (Das Konzept und den Code der xtCommerce-Lösung kann ich dazu ziemlich weitgehend verwenden.)

Diese damit mögliche transparente “[B]AJAXifizierung[/B]” von OXID [B]beweist[/B] m.E. endgültig die Mächtigkeit und Sinnhaftigkeit von Smarty!.

Bei Magento z.B. (mit seinem Zend-Framework Templating-Müll) kann man davon [B]noch nicht mal träumen[/B]…

Und die Strukturierung des Shop-Layouts, das jetzt in der “[B]_index.tpl[/B]” sehr schön und überschaubar durchführbar ist, muss man in Magento z.B. in mehreren abhängigen XML-Dateien [B]händisch[/B] definieren (der Zend-Framework Templating-Müll gibt halt nicht mehr her) …

[QUOTE=Marco Steinhäuser;14516]Hi avenger,

das gefällt mir richtig gut. Ich hab schon in der Entwicklung nachgefragt ob, wann und wie wir das als integralen Bestandteil in den Standardshop übernehmen können. Dankeschön :-)[/QUOTE]
Die Integration ist sehr einfach, man muss nur die Programme der Distribution und die modifizierten Template-Dateien verwenden, und das war es.

Meine ersten Annahme, das auch im Core transparenter lösen zu können, hat sich nämlich als falsch erwiesen, da die Template-Dateien “[B]_header.tpl[/B]”, “[B]_left.tpl[/B]”, “[B]_right.tpl[/B]”, “[B]_footer.tpl[/B]”, die ich als “Einfallstor” meiner Änderung verwende nur im Template eingebunden werden.

Der OXID-Core startet nur das jeweilge (der aktivierten Klasse entsprechende) Haupt-Template (“start”, “content”,…), und diese Haupt-Templates binden dann (via Smarty-Funktionen) diese “_xxxx.tpl”-Dateien ein.

[B]Die ganze Änderung geht also voll am Core vorbei…[/B]

(So viel zu dem “dummen” und “nutzlosen” Smarty!)

[QUOTE=Marco Steinhäuser;14516] Allerdings hab ich immer ein bisschen Angst, dass so etwas in den Wirren des Forums untergeht. Willst Du den File nicht in den eXchange einstellen und die Erklärung dazu vielleicht als Tutorial auf der OXIDforge? Gern auch in Englisch, damit die nicht Deutsch sprechenden auch etwas davon haben.

Danke und Gruß[/QUOTE]
Das ist der Fluch der guten Tat, die zieht immer noch mehr Arbeit nach sich.:stuck_out_tongue:

Aber das hatte ich sowieso noch vor.

Wollte nur erst mal etwas Feedback abwarten wg. evtl. möglicher Probleme.

Das ist der Fluch der guten Tat, die zieht immer noch mehr Arbeit nach sich.

Ja klar. Aber vielleicht kann man sich in diese Arbeiten auch sinnvoll reinteilen.

Gruß

Ich finde das neue Template-Konzept auch Klasse! Habe es gleich mal ausprobiert.
Eine Frage habe ich allerdings noch. Wenn ich im Admin Nachrichten schreibe, wird mir die News-Box nicht mehr angezeigt. Im Basic-Template war sie noch da. In der _index.tpl steht sie allerdings drinn. Habe ich da was falsch gemacht?

[QUOTE=MothersCoffee;14558]Wenn ich im Admin Nachrichten schreibe, wird mir die News-Box nicht mehr angezeigt. Im Basic-Template war sie noch da. In der _index.tpl steht sie allerdings drinn. Habe ich da was falsch gemacht?[/QUOTE]
Nein, Du hast nix falsch gemacht…

Da gab es noch einen Fehler in der Boxenzuordnung.

Ersetze die Datei “[B]tpl/boxes/_boxes.tpl[/B]” mit folgenden Code:

<?php
//Avenger
$oView=$this->_tpl_vars['oView'];
box_define($this,'navbar');
if ($oView->showSearch())
{
  box_define($this,'search');
}
if ($oView->showNewsletter())
{
  box_define($this,'newsletter');
}
if ($oView->showTopBasket())
{
  box_define($this,'mini_cart');
}
box_define($this,'account');

box_define($this,'cart');

box_define($this,'login');
if ($oView->loadCurrency())
{
  box_define($this,'currencies');
}
if ($oView->isLanguageLoaded())
{
  box_define($this,'languages');
}
if ($oView->getWishlistName())
{
  box_define($this,'whislist_link');
}
if (!$oView->showTopCatNavigation())
{
  box_define($this,'home_link');
}
box_define($this,'agb_link');
box_define($this,'impressum_link');
if ($oView->getMenueList())
{
  box_define($this,'menue_list_link');
}
if ($oView->showTopCatNavigation())
{
  box_define($this,'top_navi');
}
box_define($this,'categories');
if ($oView->loadVendorTree() && $oView->getVendorlist())
{
  box_define($this,'vendors');
}
if ($oView->loadManufacturerTree() && $oView->getManufacturerlist())
{
  box_define($this,'manufacturers');
}
box_define($this,'content');

box_define($this,'service');
$oxcmp_news=$this->_tpl_vars['oxcmp_news'];
if ($oxcmp_news && count($oxcmp_news) > 0)
{
  box_define($this,'news');
}
box_define($this,'partners');
if ($oView->getTop5ArticleList())
{
  box_define($this,'bestsellers');
}
$items=$oView->getBargainArticleList();
$items=sizeof($items);
if ($items>0)
{
  box_define($this,'specials');
}  
if (method_exists($oView,'getNewestArticles'))
{
  $items=$oView->getNewestArticles();
  $items=sizeof($items);
  if ($items>0)
  {
    box_define($this,'whatsnew');
  }
}
if (method_exists($oView,'getArticleList'))
{
  $items=$oView->getArticleList();
  $items=sizeof($items);
  if ($items>0)
  {
    box_define($this,'longruns');
  }
}
if ($oView->getSimilarRecommLists())
{
  box_define($this,'tell_friend');
}
if ($oView->getSimilarProducts())
{
  box_define($this,'similiar');
}
if ($oView->getAccessoires())
{
  box_define($this,'accessories');
}
if ($oView->getCrossSelling())
{
  box_define($this,'cross_selling');
}
if ($oView->getAlsoBoughtThiesProducts())
{
  box_define($this,'also_purchased');
}
$box_content=$this->fetch("_footer_pt.tpl");
$this->assign("footer",$box_content);
unset($box_content);

function box_define($smarty,$template_name)
{
  $box_name='box_'.strtoupper($template_name);
  $smarty->assign('box_id',$box_name);
  $box_content=$smarty->fetch("boxes/box_$template_name.tpl");
  $smarty->assign($box_name,$box_content);
}
//Avenger
?>

Hallo Avenger,

ich habe den Code in die _boxes.php kopiert und jetzt wird mir die Newsbox angezeigt! Vielen Dank!

Vielen Dank! Das Du so was an die Community weitergibst ist echt ein feiner Zug!

[QUOTE=Voltus;14588]Vielen Dank! Das Du so was an die Community weitergibst ist echt ein feiner Zug![/QUOTE]
Bin halt ein netter Mensch… :smiley:

[QUOTE=avenger;14589]Bin halt ein netter Mensch… :D[/QUOTE]

Hallo Avenger,

habe mir Deine Arbeit angesehen und hat auch alles wie beschrieben funktioniert.
Der Aufbau ist wirklich wesentlich übersichtlicher. Vielen Dank für Deine Unterstützung.
Da ich erst seit kurzem mit oxid beschäftigt bin und auch kein Programmierer bin hätte ich eine Frage. Nach der Installation des Powertemplates hat alles funktioniert nur die breadcrumbs konnte ich nicht mehr finden. Ich habe zwar versucht selbst etwas rauszufinden aber da reichen meine Kenntnisse leider noch nicht aus. Vielleicht kannst Du mir sagen ob ich einen Fehler gemacht habe oder od die Navigation generell nicht angezeigt wird. Im Voraus vielen Dank und viele Grüße.

hi avenger!

starke sache von dir. werde mich die tage auch mal dran machen. wird wohl wochenende.
wie ich lese ist es unproblematisch.

wie in deinem ajax thread schon gefragt, ob ich probleme bekomme, wenn ich die product.tpl mehrfach habe. siehe beschreibung dort.

gruß und weiter so!!

[QUOTE=Dr. Zuse;14740]Nach der Installation des Powertemplates hat alles funktioniert nur die breadcrumbs konnte ich nicht mehr finden.[/QUOTE]
Oops, gut beobachtet, die sind bisher unter den Tisch gefallen…

Im Anhang eine aktualisierte Version.

[QUOTE=avenger;14749]Oops, gut beobachtet, die sind bisher unter den Tisch gefallen…

Im Anhang eine aktualisierte Version.[/QUOTE]

Hallo Avenger,
Vielen Dank für die schnelle Hilfe. Suuuper !!!

Viele Grüße von Dr. Zuse

was sind die breadcrumbs?

ist das die Navihilfe?

Home > Möbel > Tische > runde Tische

Genaaaauuuu!

hats jetzt mein posting gar nicht gepostet. aarrrghh. also nochmal…

die breadcrumbs hab ich aus meinen templates rausgenommen. naja, ansichtssache.

du hattest was von einer javascript weiche gesprochen.
aktuell wird bei mir an manchen stellen per komplizierten scripts ausgelotet, ob JS

function anmeldescript () {
	  document.write("<div id='rightmenu1' onclick=showbox1() style='cursor:pointer'>Anmelden</div>");
	}

oder nicht: per wird eine alternative angezeigt.

das wird langsam aber sicher kompliziert und verschachtelt. ist wohl nicht ganz die feine art, oder geht das in Ordnung?

[B]Alternativen
[/B]

  1. Weichen vor den ensprechenden template “includes” einbaue. die templates wären zwei mal zu pflegen.
    tauchen die dann als contentdubletten auf, oder erledigt das das rendering? bin mir gerade nicht sicher.

  2. Weiche im header für den kompletten weiteren seitenaufbau. beispiel:

 <script language="JavaScript>
  window.location.href="deineseite.html";
  //Besucher mit JavaScript werden weitergeleitet
</script>

Template ohne JS


Variante 1 wäre doch sicher besser als das aktuelle chaos, das ich mit den ganzen functions in meinen templates verursache, oder? wenn es keine dublettengefahr gibt.

wie ist die gefahr von content-dubletten? bzw. wie ist deine lösung.

Meine Anforderung ist da simpler: ich will nur wissen, ob der Browser überhaupt Javascript aktiviert hat oder nicht.