[4.5] Theme Management im OXID eShop ab 4.5.0

Theme-Management im OXID eShop ab 4.5.0

Ab OXID eShop 4.5.0 sind die Theme-Einstellungen aus derconfig.inc.php ins Admin-Backend verlegt (Stammdaten -> Grundeinstellungen -> Themes), wo eine Liste aller verfügbaren Themes, deren Beschreibung, Vorschaubild und der jeweiligen Einstellungen zu finden ist. Diese Metadaten werden aus dem betreffenden Theme-Verzeichnis eingelesen, dazu gleich mehr.

Um ein Theme zu verwenden, einfach den entsprechenden Listeneintrag wählen und unten rechts auf „Aktivieren“ klicken.

800px-EShopBackendThemes

Die Struktur der Theme-Verzeichnisse mit den Templates, Sprachdateien, Bildern und Scripten wurde nicht verändert. Allerdings ist mit der 4.5 der Aufbau des Templates geändert worden. Das ist allerdings nicht Gegenstand dieses Tutorials.

Theme Meta-Daten

Azure Theme Dateien

Vorschaubild: out/azure/theme.jpg

Info-Texte: out/azure/theme.php

 $aTheme = array(
'id'           => 'azure',
'title'        => 'Azure',
'description'  => 'Azure theme for OXID eShop 4.5.0 Beta',
'thumbnail'    => 'theme.jpg',
'version'      => '0.5',
'author'       => 'OXID',
); 

Es genügt diese beiden Dateien mit den individuellen Daten eines eigenen Themes in das Verzeichnis /out/mein_theme/ zu legen, um dieses in der Liste im Backend zu sehen. Dabei muss die Theme-id dem Namen des Ordners entsprechen, in dem das Theme liegt.
ACHTUNG – ab 4.7.x folgende Änderung:
Die theme.php muss in das Verzeichnis /application/views/mein_theme/ gelegt werden, dort sind auch alle individuellen Templatedateien abzulegen (in der selben Ordnerstruktur wie Azure). Ins Verzeichnis /out/mein_theme/ legt man das theme.jpg sowie die Verzeichnisse /img und /src mit den benötigten Dateien.

Individuelle Themes

Um ein individuelles Theme zu erstellen bei dem lediglich einzelne Dateien verändert sind, genügt es auf das Eltern-Theme zu verweisen (parentTheme) ohne eine eigene id zu vergeben. Der Theme-Titel und die Beschreibung sind anzupassen. Wichtig ist außerdem die Angabe, auf welche Version des Eltern-Themes dies Abwandlung basiert (parentVersions).

 $aTheme = array(
'title'          => 'Child of Azure',
'description'    => 'EXTENDED Azure theme for OXID eShop 4.5.0 Beta',
'thumbnail'      => 'theme.jpg',
'version'        => '0.5',
'author'         => 'OXID',
'parentTheme'    => 'azure',
'parentVersions' => array('0.5','0.6'),
); 

Solch ein Theme-Kind kann nur aktiviert werden, wenn das Eltern-Theme vorhanden ist und dessen Version mit den angegebenen Versionen übereinstimmt.

Ein solches Theme verwendet alle Template-Dateien und Einstellungsoptionen vom Eltern-Theme. Nur die Dateien, die auch im Verzeichnis des abgewandelten Themes liegen, werden vorrangig verwendet. Wenn also zum Beispiel die Produktansicht verändert wurde und das entsprechende Template details.tpl im Kinder-Verzeichnis liegt, dann wird dieses verwendet und nicht das Original aus dem Eltern-Verzeichnis

Bei einem auftretenden Fehler kann das Kinder-Theme nicht aktiviert werden, statt dem „Aktivieren“-Button wird eine Fehlermeldung gezeigt.

800px-Theme_error_no_parent

Script zum Kopieren ausschließlich veränderter Template-Dateien

Normalerweise ist es beim Entwickeln eines Templates meistens leichter direkt in einer vollständigen Kopie eines Templates zu arbeiten. Aggrosoft hat deshalb ein Script entwickelt, das nachdem die Template-Arbeiten abgeschlossen sind, automatisch nur die geänderten Dateien extrahiert und in einem extra Ordner ablegt – dieser Ordner kann dann als sCustomTheme gesetzt werden.

Die Verwendung ist einfach, geändertes und original Template wählen (es muss eine unveränderte Version des Templates auf dem Server liegen), Zielordner eingeben und Start drücken.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
 <head>
  <title>Template Override generieren</title>
  <link rel="stylesheet" href="http://twitter.github.com/bootstrap/assets/css/bootstrap-1.1.1.min.css">
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 </head>
<?php
    function makeAll($dir, $mode = 0777, $recursive = true) {
        if( is_null($dir) || $dir === "" ){
            return FALSE;
        }
       
        if( is_dir($dir) || $dir === "/" ){
            return TRUE;
        }
        if( makeAll(dirname($dir), $mode, $recursive) ){
            return mkdir($dir, $mode);
        }
        return FALSE;
    }
   
    function smartCopy($source, $dest, $options=array('folderPermission'=>0755,'filePermission'=>0755))
    {
        $result=false;
       
        //For Cross Platform Compatibility
        if (!isset($options['noTheFirstRun'])) {
            $source=str_replace('\\','/',$source);
            $dest=str_replace('\\','/',$dest);
            $options['noTheFirstRun']=true;
        }
       
        if (is_file($source)) {
            if ($dest[strlen($dest)-1]=='/') {
                if (!file_exists($dest)) {
                    makeAll($dest,$options['folderPermission'],true);
                }
                $__dest=$dest."/".basename($source);
            } else {
                $__dest=$dest;
            }
            if (!file_exists($__dest)) {
                $result=copy($source, $__dest);
                chmod($__dest,$options['filePermission']);
            }
        } elseif(is_dir($source)) {
            if ($dest[strlen($dest)-1]=='/') {
                if ($source[strlen($source)-1]=='/') {
                    //Copy only contents
                } else {
                    //Change parent itself and its contents
                    $dest=$dest.basename($source);
                    @mkdir($dest);
                    chmod($dest,$options['filePermission']);
                }
            } else {
                if ($source[strlen($source)-1]=='/') {
                    //Copy parent directory with new name and all its content
                    @mkdir($dest,$options['folderPermission']);
                    chmod($dest,$options['filePermission']);
                } else {
                    //Copy parent directory with new name and all its content
                    @mkdir($dest,$options['folderPermission']);
                    chmod($dest,$options['filePermission']);
                }
            }
   
            $dirHandle=opendir($source);
            while($file=readdir($dirHandle))
            {
                if($file!="." && $file!="..")
                {
                    $__dest=$dest."/".$file;
                    $__source=$source."/".$file;
                    //echo "$__source ||| $__dest<br />";
                    if ($__source!=$dest) {
                        $result=smartCopy($__source, $__dest, $options);
                    }
                }
            }
            closedir($dirHandle);
           
        } else {
            $result=false;
        }
        return $result;
    }
    function compareDirectories( $path = '.', $changePath = '.', $level = 0 ){
       
        $ignore = array( 'cgi-bin', '.', '..' );
        $dh = @opendir( $path );
       
        while( false !== ( $file = readdir( $dh ) ) ){ // Loop through the directory
            if( !in_array( $file, $ignore ) ){
                if( is_dir( "$path/$file" ) ){
                    // Its a directory, so we need to keep reading down…
                    compareDirectories( "$path/$file", "$changePath/$file", ($level+1),$time );
                } else {
                    compareFiles("$path/$file", "$changePath/$file");
                }//elseif
            }//if in array
        }//while
       
        closedir( $dh );
       
    }
   
    function compareFiles( $path = '.', $changePath = '.' ){
        $vanilla_path = $path;
        $branch_path = $changePath;
       
        if( !file_exists($branch_path) || strcmp(file_get_contents($vanilla_path),file_get_contents($branch_path)) ){
            if($_REQUEST["displayonly"] == 1){
                echo "$vanilla_path >> $branch_path<br/>";
            }else{
                $tPath = str_replace($_REQUEST['modifiedtpl']."/",'',$vanilla_path);
           
                makeAll(dirname("out/".$_REQUEST['targetfolder']."/$tPath"));
                smartCopy($vanilla_path, "out/".$_REQUEST['targetfolder']."/$tPath");
            }
        }   
        return true;
    }
   
   
   
    $aTemplates = array();
    foreach ( glob("out/**",GLOB_ONLYDIR) as $tplfolder ) {
        if(file_exists($tplfolder."/theme.php")){
            $aTemplates[] = $tplfolder;
        }
    }
   
    if($_REQUEST['fnc'] == 'create'){
       
        compareDirectories( $_REQUEST['modifiedtpl'], $_REQUEST['originaltpl']);
       
        $blCopied = true;
       
    }
   
?>
 
<body style="padding-top: 60px">
 <div class="topbar-wrapper noprint" style="z-index: 5">
  <div class="topbar">
     <div class="fill">
         <div class="container">
             <h3><a href="http://www.aggrosoft.de" target="_blank">Aggrosoft Override Generator</a></h3>
         </div>
     </div>
 </div>
 </div>
<div class="container">
<?php if($blCopied) :?>
        <div class="alert-message success">
        <p><strong>Kopiervorgang erfolgreich!</strong> Sie finden das neue Template jetzt im Ziel Ordner.</p>
        </div>
<?php endif; ?>
  <form action="tploverride.php" method="post">
      <input type="hidden" name="fnc" value="create">
    <fieldset>
      <legend>Custom Theme generieren</legend>
      <div class="clearfix">
        <label for="username">Ge&auml;ndertes Template</label>
        <div class="input">
          <select name="modifiedtpl">
              <?php foreach ($aTemplates as $sTemplate) : ?>
              <option value="<?php echo $sTemplate; ?>"><?php echo $sTemplate; ?></option>
              <?php endforeach; ?>
          </select>
        </div>
      </div><!-- /clearfix -->
      <div class="clearfix">
        <label for="username">Original Template</label>
        <div class="input">
          <select name="originaltpl">
              <?php foreach ($aTemplates as $sTemplate) : ?>
              <option value="<?php echo $sTemplate; ?>"><?php echo $sTemplate; ?></option>
              <?php endforeach; ?>
          </select>
        </div>
      </div><!-- /clearfix -->
      <div class="clearfix">
        <label for="username">Ziel Ordner (in out)</label>
        <div class="input">
          <input type="text" size="30" name="targetfolder" class="xlarge">
        </div>
      </div><!-- /clearfix -->
      <div class="clearfix">
        <label for="username">Simulieren</label>
        <div class="input">
            <div class="input-prepend">
                  <label class="add-on"><input type="checkbox" name="displayonly" value="1"></label>
                  <input class="small" readonly="readonly" value="Nur anzeigen" type="text">
              </div>
        </div>
      </div><!-- /clearfix -->           
      <div class="actions">
        <button class="btn primary" type="submit">Start</button>&nbsp;<button class="btn" type="reset">Cancel</button>
      </div>
    </fieldset>
  </form>
    </div>
  <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>
  <script type="text/javascript" src="http://autobahn.tablesorter.com/jquery.tablesorter.min.js"></script>
  <script type="text/javascript">
      $(function(){
          $("table").tablesorter({ sortList: [[1,1]] });
      });
  </script>
 </body>
</html>

Danke an Aggrosoft für die Bereitstellung des Scripts;

Theme-spezifische Einstellungen

OXID eShop Themes sind immer abhängig von verschiedenen Parameter-Einstellungen, die im Backend gesetzt werden. Mit Entwicklung des neuen Azure-Templates wurden die Theme-spezifischen Einstellungen eingeführt.

Ab OXID eShop 4.5.0 ist es Theme-Entwicklern somit möglich, eigene Einstellungsoptionen ohne Änderungen der Backend-Templates zu ergänzen.

Diese Optionen werden in der existierenden Datenbank-Tabelle oxconfig gespeichert, in der Spalte oxmodule mit dem Wert „theme:azure“ gekennzeichnet. Zusätzliche Anzeige-Parameter haben eine eigene Tabelle „oxconfigdisplay“, in der die Einstellungen von Sortierung, Gruppierung und Drop-Down-Werten festgelegt werden. Die Sprachbausteine für die Theme-Einstellungen müssen in Sprach-Dateien mit dem Namen theme_options.php hinterlegt werden.

Einige spezifische Einstellungen werden im eShop Sourcecode verwendet, um korrekte Bildgrößen zu generieren oder Seitenzahlen zu berechnen. Es wird empfohlen, diese vom Azure-Theme zu kopieren (nach „theme:azure“ in den SQL-inserts in setup/sql/database.sql suchen).

Beispiel

Eine neue Theme-spezifische Einstellungsoption zu Azure hinzufügen: „Header-Slogan anzeigen/nicht anzeigen“

1. Option zur Tabelle oxconfig hinzufügen

Spalte Wert Beschreibung
OXID azure.blShowSlogan.1 einzigartige id
OXSHOPID 1 shop id (in der Regel 1 – außer ggf. bei EE-Shops)
OXMODULE theme:azure theme:{theme id = Verzeichnis-Name}
OXVARNAME blShowSlogan Options-Name
OXVARTYPE bool Options-Typ (‚bool‘,’str‘,’arr‘,’aarr‘)
OXVARVALUE Options-Wert, leer lassen, wird durch speichern im Backend gesetzt

SQL ausführen zum Eintragen der Werte:

 INSERT INTO `oxconfig` 
(`OXID`,`OXSHOPID`,`OXMODULE`,`OXVARNAME`,`OXVARTYPE`,`OXVARVALUE`) VALUES
('azure.blShowSlogan.1', 1, 'theme:azure', 'blShowSlogan', 'bool', ''); 

2. Anzeige-Optionen festlegen in Tabelle oxconfigdisplay

Spalte Wert Beschreibung
OXID azure.blShowSlogan.1 einzigartige id
OXCFGMODULE theme:azure theme:{theme id = Verzeichnis-Name}
OXCFGVARNAME blShowSlogan Options-Name
OXGROUPING display Options Anzeige-Gruppe
OXVARCONSTRAINT festgelegte Werte, für Drop-Down-Auswahl
OXPOS 0 Position innerhalb der Anzeige-Gruppe

Die Anzeige der Option im Backend richtet sich nach dem Typ, welcher in oxconfig.OXVARTYPE festgelegt wurde.

Type Display html element
str Texteingabe
bool Auswahlfeld
arr Textfeld
aarr Textfeld

Vordefinierte Werte für eine Drop-Down-Auswahl legt man in oxconfigdisplay.OXVARCONSTRAINT fest:

Vorgabe Display input
0|1 Drop-Down mit Werten 0 und 1
a|b|c Drop-Down mit Werten a, b und c

Eigene Optionsgruppen werden automatisch erzeugt, wenn in oxconfigdisplay.OXGROUPING ein Name angegeben ist und die Übersezung zu theme_options.php hinzugefügt wurde (nach folgendem Muster: ‚SHOP_THEME_GROUP_meinegruppe‘).

SQL ausführen zum Eintragen der Werte:

 INSERT INTO `oxconfigdisplay` 
(`OXID`,`OXCFGMODULE`,`OXCFGVARNAME`,`OXGROUPING`,`OXVARCONSTRAINT`,`OXPOS`) VALUES
('azure.blShowSlogan.1', 'theme:azure', 'blShowSlogan', 'display', , 0); 

3. Übersetzung hinzufügen in out/azure/[en|de]/theme_options.php

 'SHOP_THEME_blShowSlogan'   => 'Slogan anzeigen',

4. Slogan mit Prüfung der Options-Einstellung in Template out/azure/tpl/layout/header.tpl einbauen

 [{if $oViewConf->getViewThemeParam('blShowSlogan') }]
<h1 style="margin:0 10px 15px;padding:10px;color:#fff;background:#000;">Slogan text</h1>
[{/if}] 

/tmp leeren und Service -> Tools -> Views aktualisieren

Im Backend ist die neue Option zu sehen, im Frontend bei angehaktem Kontrollkästchen der Slogan:

800px-EShopBackendWithNewOption

800px-EShopFrontendWithSlogan

Ein eigenständiges Theme „klonen“

Um ein eigenes Theme mit allen Config-Möglichkeiten unabhängig vom Eltern – Theme zu erhalten, muss man alle Dateien des Ausgangs-Theme in einen neuen Ordner kopieren ( /meinTheme) und dann das passende Script ausführen (natürlich vorher mit den eigenen Werten/Pfaden angepasst):

Template-Struktur

Verzeichnisbaum /tpl

tpl
├── custom
├── email
│   ├── html
│   │   ├── footer.tpl
│   │   ├── forgotpwd.tpl
│   │   ├── header.tpl
│   │   ├── invite.tpl
│   │   ├── newsletteroptin.tpl
│   │   ├── order_cust.tpl
│   │   ├── order_owner.tpl
│   │   ├── owner_reminder.tpl
│   │   ├── pricealarm_owner.tpl
│   │   ├── register.tpl
│   │   ├── senddownloadlinks.tpl
│   │   ├── sendednow.tpl
│   │   ├── suggest.tpl
│   │   └── wishlist.tpl
│   └── plain
│       ├── forgotpwd.tpl
│       ├── invite.tpl
│       ├── newsletteroptin.tpl
│       ├── order_cust.tpl
│       ├── order_owner.tpl
│       ├── pricealarm_owner.tpl
│       ├── register.tpl
│       ├── senddownloadlinks.tpl
│       ├── sendednow.tpl
│       ├── suggest.tpl
│       └── wishlist.tpl
├── form
│   ├── account_newsletter.tpl
│   ├── contact.tpl
│   ├── fieldset
│   │   ├── order_newsletter.tpl
│   │   ├── order_remark.tpl
│   │   ├── salutation.tpl
│   │   ├── state.tpl
│   │   ├── user_account.tpl
│   │   ├── user_billing.tpl
│   │   ├── user_email.tpl
│   │   ├── user_noaccount.tpl
│   │   └── user_shipping.tpl
│   ├── forgotpwd_change_pwd.tpl
│   ├── forgotpwd_email.tpl
│   ├── formparams.tpl
│   ├── guestbook.tpl
│   ├── login_account.tpl
│   ├── login.tpl
│   ├── newsletter.tpl
│   ├── pricealarm.tpl
│   ├── privatesales
│   │   ├── accept_terms.tpl
│   │   ├── basketexcl.tpl
│   │   └── invite.tpl
│   ├── recommendation_add.tpl
│   ├── recommendation_edit.tpl
│   ├── register.tpl
│   ├── suggest.tpl
│   ├── user_checkout_change.tpl
│   ├── user_checkout_noregistration.tpl
│   ├── user_checkout_registration.tpl
│   ├── user_password.tpl
│   ├── user.tpl
│   ├── wishlist_publish.tpl
│   ├── wishlist_search.tpl
│   └── wishlist_suggest.tpl
├── layout
│   ├── base.tpl
│   ├── footer.tpl
│   ├── header.tpl
│   ├── page.tpl
│   ├── popup.tpl
│   └── sidebar.tpl
├── message
│   ├── err_404.tpl
│   ├── errors.tpl
│   ├── error.tpl
│   ├── err_setup.tpl
│   ├── err_unknown.tpl
│   ├── exception.tpl
│   ├── inputvalidation.tpl
│   ├── notice.tpl
│   ├── success.tpl
│   └── user_blocked.tpl
├── page
│   ├── account
│   │   ├── dashboard.tpl
│   │   ├── downloads.tpl
│   │   ├── forgotpwd.tpl
│   │   ├── inc
│   │   │   ├── account_menu.tpl
│   │   │   └── file_attributes.tpl
│   │   ├── login.tpl
│   │   ├── newsletter.tpl
│   │   ├── noticelist.tpl
│   │   ├── order.tpl
│   │   ├── password.tpl
│   │   ├── recommendationadd.tpl
│   │   ├── recommendationedit.tpl
│   │   ├── recommendationlist.tpl
│   │   ├── register_confirm.tpl
│   │   ├── register_success.tpl
│   │   ├── register.tpl
│   │   ├── user.tpl
│   │   └── wishlist.tpl
│   ├── checkout
│   │   ├── basket.tpl
│   │   ├── inc
│   │   │   ├── basketcontents.tpl
│   │   │   ├── options.tpl
│   │   │   ├── payment_other.tpl
│   │   │   ├── payment_oxidcashondel.tpl
│   │   │   ├── payment_oxidcreditcard.tpl
│   │   │   ├── payment_oxiddebitnote.tpl
│   │   │   ├── steps.tpl
│   │   │   ├── trustedshops.tpl
│   │   │   └── wrapping.tpl
│   │   ├── order.tpl
│   │   ├── payment.tpl
│   │   ├── thankyou.tpl
│   │   └── user.tpl
│   ├── compare
│   │   ├── compare.tpl
│   │   └── inc
│   │       └── compareitem.tpl
│   ├── details
│   │   ├── ajax
│   │   │   ├── fullproductinfo.tpl
│   │   │   └── productmain.tpl
│   │   ├── details.tpl
│   │   └── inc
│   │       ├── attributes.tpl
│   │       ├── compare_links.tpl
│   │       ├── deliverytime.tpl
│   │       ├── editTags.tpl
│   │       ├── fullproductinfo.tpl
│   │       ├── media.tpl
│   │       ├── morepics.tpl
│   │       ├── priceinfo.tpl
│   │       ├── productmain.tpl
│   │       ├── related_products.tpl
│   │       ├── tabs.tpl
│   │       ├── tags.tpl
│   │       └── zoompopup.tpl
│   ├── guestbook
│   │   └── guestbook.tpl
│   ├── info
│   │   ├── contact.tpl
│   │   ├── content_plain.tpl
│   │   ├── content.tpl
│   │   ├── links.tpl
│   │   ├── newsletter.tpl
│   │   ├── news.tpl
│   │   └── suggest.tpl
│   ├── list
│   │   ├── list.tpl
│   │   └── morecategories.tpl
│   ├── privatesales
│   │   ├── invite.tpl
│   │   └── login.tpl
│   ├── recommendations
│   │   ├── inc
│   │   │   └── list.tpl
│   │   └── recommlist.tpl
│   ├── review
│   │   ├── review_login.tpl
│   │   └── review.tpl
│   ├── search
│   │   └── search.tpl
│   ├── shop
│   │   ├── mallstart.tpl
│   │   └── start.tpl
│   ├── tags
│   │   └── tags.tpl
│   └── wishlist
│       └── wishlist.tpl
├── rdfa
│   ├── content
│   │   ├── content.tpl
│   │   └── inc
│   │       ├── business_entity.tpl
│   │       ├── delivery_charge.tpl
│   │       └── payment_charge.tpl
│   ├── details
│   │   ├── details.tpl
│   │   └── inc
│   │       ├── delivery.tpl
│   │       ├── object.tpl
│   │       ├── payment.tpl
│   │       └── price.tpl
│   └── rdfa.tpl
└── widget
├── address
│   ├── billing_address.tpl
│   └── shipping_address.tpl
├── breadcrumb.tpl
├── dynscript.tpl
├── facebook
│   ├── comments.tpl
│   ├── connect.tpl
│   ├── enable.tpl
│   ├── facepile.tpl
│   ├── init.tpl
│   ├── invite.tpl
│   ├── like.tpl
│   └── share.tpl
├── footer
│   ├── categorieslist.tpl
│   ├── info.tpl
│   ├── manufacturers.tpl
│   ├── newsletter.tpl
│   ├── services.tpl
│   └── vendors.tpl
├── header
│   ├── currencies.tpl
│   ├── languages.tpl
│   ├── loginbox.tpl
│   ├── search.tpl
│   ├── servicebox.tpl
│   └── topcategories.tpl
├── locator
│   ├── attributes.tpl
│   ├── itemsperpage.tpl
│   ├── listdisplaytype.tpl
│   ├── listlocator.tpl
│   ├── paging.tpl
│   └── sort.tpl
├── manufacturersslider.tpl
├── minibasket
│   ├── countdown.tpl
│   ├── minibasketmodal.tpl
│   ├── minibasket.tpl
│   └── newbasketitemmsg.tpl
├── product
│   ├── bargainitems.tpl
│   ├── boxproducts.tpl
│   ├── compare_links.tpl
│   ├── listitem_grid.tpl
│   ├── listitem_infogrid.tpl
│   ├── listitem_line.tpl
│   ├── list.tpl
│   └── selectbox.tpl
├── promoslider.tpl
├── reviews
│   ├── rating.tpl
│   └── reviews.tpl
├── rss.tpl
├── shoplupe
│   └── ratings.tpl
├── sidebar
│   ├── adminbanner.tpl
│   ├── categoriestree.tpl
│   ├── news.tpl
│   ├── partners.tpl
│   ├── recommendation.tpl
│   └── tags.tpl
└── trustedshops
├── info.tpl
└── ratings.tpl

Änderungen in der Struktur vom Theme „Basic“

Mit der Version 4.5 wurde das bisher alleinige Theme „Basic“ ein wenig in der Struktur verändert. Dabei gab es sowohl Änderungen der Pfadstruktur, wie auch einige Änderungen in den Dateinamen. Hat man nun ein modifiziertes Theme auf Basis von Basic, muss man dies an die neue Struktur anpassen.
https://www.oxid-esales.com/de/support-services/dokumentation-und-hilfe/archiv-oxid-eshop/design-anpassen/templates/template-struktur-des-themes-basic-ab-450.html  

Wer nun nicht die Update-App aus den Cumulative-Patches verwenden möchte, kann dies mit diesem kleinen Batchscript erledigen. Dabei werden die alten Dateien in die neue Ordernstruktur verschoben und ggf. umbenannt. Sollten in den Templates Links enthalten sein, so muss man die ebenfalls selbst noch anpassen.

Vielen Dank an KristianH (D3) für das bereitstellen der Batch-Datei!

copy+paste  – speichern als ‚basic45templateschubser.bat‘

@echo off
md email
md email\html
md email\plain
md message
md page
md page\account
md page\checkout
md page\compare
md page\details
md page\guestbook
md page\info
md page\list
md page\privatesales
md page\recommendations
md page\search
md page\shop
md page\tags
md page\wishlist
md widget
move account_login_alt.tpl page/privatesales/login.tpl
move account_login.tpl page/account/login.tpl
move account_main.tpl page/account/dashboard.tpl
move account_newsletter.tpl page/account/newsletter.tpl
move account_noticelist.tpl page/account/noticelist.tpl
move account_order.tpl page/account/order.tpl
move account_password.tpl page/account/password.tpl
move account_recommlist.tpl page/account/recommendationedit.tpl
move account_user.tpl page/account/user.tpl
move account_wishlist.tpl page/account/wishlist.tpl
move basket.tpl page/checkout/basket.tpl
move compare_popup.tpl compare_popup.tpl
move compare.tpl page/compare/compare.tpl
move contact.tpl page/info/contact.tpl
move content_plain.tpl page/info/content_plain.tpl
move content.tpl page/info/content.tpl
move details.tpl page/details/details.tpl
move email_forgotpwd_html.tpl email/html/forgotpwd.tpl
move email_forgotpwd_plain.tpl email/plain/forgotpwd.tpl
move email_invite_html.tpl email/html/invite.tpl
move email_invite_plain.tpl email/plain/invite.tpl
move email_newsletteroptin_html.tpl email/html/newsletteroptin.tpl
move email_newsletteroptin_plain.tpl email/plain/newsletteroptin.tpl
move email_order_cust_html.tpl email/html/order_cust.tpl
move email_order_cust_plain.tpl email/plain/order_cust.tpl
move email_order_owner_html.tpl email/html/order_owner.tpl
move email_order_owner_plain.tpl email/plain/order_owner.tpl
move email_owner_reminder_html.tpl email/html/owner_reminder.tpl
move email_pricealarm_owner.tpl email/html/pricealarm_owner.tpl
move email_register_html.tpl email/html/register.tpl
move email_register_plain.tpl email/plain/register.tpl
move email_sendednow_html.tpl email/html/sendednow.tpl
move email_sendednow_plain.tpl email/plain/sendednow.tpl
move email_suggest_html.tpl email/html/suggest.tpl
move email_suggest_plain.tpl email/plain/suggest.tpl
move email_wishlist_html.tpl email/html/wishlist.tpl
move email_wishlist_plain.tpl email/plain/wishlist.tpl
move err_404.tpl message/err_404.tpl
move err_accessdenied.tpl message/err_accessdenied.tpl
move err_expired_days.tpl message/err_expired_days.tpl
move err_mandates_exceeded.tpl message/err_mandates_exceeded.tpl
move err_setup.tpl message/err_setup.tpl
move err_unknown.tpl message/err_unknown.tpl
move err_unlicensed.tpl message/err_unlicensed.tpl
move err_update.tpl message/err_update.tpl
move forgotpwd.tpl page/account/forgotpwd.tpl
move guestbook_login.tpl page/guestbook/guestbook_login.tpl
move guestbook.tpl page/guestbook/guestbook.tpl
move guestbookentry.tpl page/guestbook/guestbookentry.tpl
move invite.tpl page/privatesales/invite.tpl
move links.tpl page/info/links.tpl
move list_more.tpl page/list/morecategories.tpl
move list.tpl page/list/list.tpl
move mallstart.tpl page/shop/mallstart.tpl
move moredetails.tpl moredetails.tpl
move news.tpl page/info/news.tpl
move newsletter.tpl page/info/newsletter.tpl
move order.tpl page/checkout/order.tpl
move payment.tpl page/checkout/payment.tpl
move pricealarm.tpl pricealarm.tpl
move recommadd.tpl page/account/recommendationadd.tpl
move recommlist.tpl page/recommendations/recommlist.tpl
move register_confirm.tpl page/account/register_confirm.tpl
move register_success.tpl page/account/register_success.tpl
move register.tpl page/account/register.tpl
move rss.tpl widget/rss.tpl
move search.tpl page/search/search.tpl
move security_info.tpl security_info.tpl
move start.tpl page/shop/start.tpl
move suggest.tpl page/info/suggest.tpl
move tags.tpl page/tags/tags.tpl
move thankyou.tpl page/checkout/thankyou.tpl
move user.tpl page/checkout/user.tpl
move wishlist.tpl page/wishlist/wishlist.tpl
echo ende
pause


0 Kommentare

Dein Kommentar

An Diskussion beteiligen?
Hinterlasse uns Deinen Kommentar!

Schreibe einen Kommentar

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