Neues Theme hat keine Einstellmöglichkeiten


#1

Hallo zusammen,

ich möchte ein neues Theme auf Basis des “Azure” Theme erstellen. Also habe ich den Inhalt aus dem Ordner “azure” in einen neuen Ordner Namens “Meintheme” kopiert. Es funzt auch alles soweit bis auf ein Problem: Unter den Theme Einstellungen des neuen Templates sind die Einstellungen für “Bilder”, “Funktionen” und "Einstellungen weg. Dort findet sich nur der Button “speichern”.

Woran kann es liegen?

Habe das Theme in der theme.php umbenannt und auch einen Pfad in der fxstyles.css an das neue Theme angepasst…

Gruß und dank… :slight_smile:


#2

Hi zusammen,

habe mir auch mein aktuelles Theme an die neue 4.5 er angepasst und finde ebenfalls keine Einstellungsmöglichkeiten neben dem Theme Reiter. Dort wird bei mir auch nur der speichern Button angezeigt, also hänge ich mich jetzt mal an diesen Thread.

Dankeschön und allerbeste Grüße vom Chris


#3

Hi,

habt Ihr dies so wie unter “Custom themes” bei http://wiki.oxidforge.org/Tutorials/Understanding_theme_management_in_OXID_eShop_from_4.5.0 gemacht? Dann würde dies passen, denn dort steht

“Such theme will take all files ([B]and config option[/B]s) from the parent theme”.


#4

Hi Christian,

hab mir das auch mal geschwind durchgelesen und fast genauso hab ichs auch gemanaged. Allerdings möchte ich kein parent theme haben, sonder mein individuelles,
also wie gehabt ein modifiziertes basic theme. Die Konfiguration sieht nun wie folgt aus:


$aTheme = array(
    'id'           => 'meine_struempfe',
    'title'        => 'Meine Strümpfe',
    'description'  => 'Meine Strümpfe Standard Theme',
    'thumbnail'    => 'theme.jpg',
    'version'      => '1.0',
    'author'       => 'Chris Bernhard'
);

Die Einstellungsmöglichkeiten bzw. Einstellungen werden auch bei aktiviertem basic Theme, also mit der Einstellung


    'parentTheme'    => 'basic'

nicht auf mein Theme durchvererbt.

Allerbeste Grüße und Dankeschön vom Chris


#5

So, jetzt bin ich ein Stückchen weiter gekommen.
Mit der folgenden Einstellung nimmt er die Einstellungen vom basic Theme:


    'parentTheme'    => 'basic',
    'parentVersions' => array('1.4'),

Leider werden allerdings nicht alle Einstellungen korrekt vererbt. Zum Beispiel werden nun sämtliche Artikelstückzahlen hinter den Kategorieren angezeigt, obwohl ich das explizit ausgeschaltet habe. Ist ja in den Performance Einstellungen und nicht in den Theme Einstellungen…

Allerbeste Grüße und Dankeschön vom Chris


#6

Hi,

ich denke, dass diese Einstellungsmöglichkeiten erst durch bestimmte Einträge in der Datenbank vorgenommen werden können:

…theme specific config options are used in eShop source code to generate proper size images or calculate pagination so we recommend copying them from azure theme (search for “theme:azure” sql inserts in setup/sql/database.sql file).

Wenn man also ein eigenes Theme z.B. BlaBla verwenden möchte, werden dafür imho auch in der DB wie für das Azure-Theme gewisse Datenbankfelder vorhanden sein müssen.

Ich habe dieses Template-Thema für die 4.5 selber noch gar nicht probiert, denke aber, dass es für das Basic-Theme eh nicht geht, da diese neuen Möglichkeiten erst ab Azure-Theme vorhanden sind.


#7

Hi nochmal zusammen,

die Einstellungen vom basic Theme sollten meines Erachtens irgendwie auf ein komplett eingeständiges Theme vererbt werden können. Hab jetzt auf die Schnelle in der Datenbank ein bißchen gekramt und in der Tabelle oxconfigdisplay stehen Datensätze aka:


INSERT INTO `oxconfigdisplay` (`OXID`, `OXCFGMODULE`, `OXCFGVARNAME`, `OXGROUPING`, `OXVARCONSTRAINT`, `OXPOS`) VALUES
('0ec4235c2aee774aa45d772875437919', 'theme:basic', 'sIconsize', 'images', '', 1),
('0563fba1bee774aec57c192086494217', 'theme:basic', 'sThumbnailsize', 'images', '', 2),
('0563fba1bee774aec599d56894094456', 'theme:basic', 'sCatThumbnailsize', 'images', '', 3),
('02642dfaa1dee77488b1b22948593071', 'theme:basic', 'sZoomImageSize', 'images', '', 4),
('02642dfaa1dee77487d0644506753921', 'theme:basic', 'aDetailImageSizes', 'images', '', 5),
('08a9473894d473f6ed28f04e80d929fc', 'theme:basic', 'bl_showCompareList', 'features', '', 6),
('08acb2f595da54b5f865e54aa5cdb967', 'theme:basic', 'bl_showListmania', 'features', '', 7),
('08a12329124850cd8f63cda6e8e7b4e1', 'theme:basic', 'bl_showWishlist', 'features', '', 8),
('08a23429124850cd8f63cda6e8e7b4e1', 'theme:basic', 'bl_showVouchers', 'features', '', 8),
('08a34529124850cd8f63cda6e8e7b4e1', 'theme:basic', 'bl_showGiftWrapping', 'features', '', 10),
('08a45629124850cd8f63cda6e8e7b4e1', 'theme:basic', 'bl_showOpenId', 'features', '', 11),
('069425a324684b6c089769ee77426393', 'theme:basic', 'bl_perfShowLeftBasket', 'display', '', 12),
('069425a324685ee7745199.098323559', 'theme:basic', 'bl_perfShowRightBasket', 'display', '', 13),
('069425a32468ee77455199.098243559', 'theme:basic', 'bl_perfShowTopBasket', 'display', '', 14),
('05342e4cab0ee774acb3905838384984', 'theme:basic', 'blShowBirthdayFields', 'display', '', 15),
('01296159b2341d31b93423972af6150b', 'theme:basic', 'blTopNaviLayout', 'display', '', 16),
('01296159b7641d31b93423972af6150b', 'theme:basic', 'iTopNaviCatCount', 'display', '', 17),
('073455b29d0db9ee774b788731623955', 'theme:basic', 'blShowFinalStep', 'display', '', 18),
('0ec42a395d0595ee7741091898848474', 'theme:basic', 'iNewBasketItemMessage', 'display', '0|1|2|3', 19),
('0545423fe8ce213a06.20230295', 'theme:basic', 'aNrofCatArticles', 'display', '', 20),
('omc4555952125c3c2.98253113', 'theme:basic', 'blDisableNavBars', 'display', '', 21)


Das müsste man doch irgendwie auf ein anderes Theme ummünzen können, eventuell reicht es ja schon, hier einfach:


('0ec42a395d0595ee7741091898848474', 'theme:meinestruempfe', 'iNewBasketItemMessage', 'display', '0|1|2|3', 19),
('0545423fe8ce213a06.20230295', 'theme:meine_struempfe', 'aNrofCatArticles', 'display', '', 20),
('omc4555952125c3c2.98253113', 'theme:meine_struempfe', 'blDisableNavBars', 'display', '', 21)

usw. 

in die Datenbank einzutragen? Ich probiers gleich mal aus :slight_smile:

Gibt natürlich einen Duplicate Error, da die oxids Unique sind…


#8

Dies meinte ich, ja.
Bin ja auf das Ergebnis gespannt!


#9

Geht natürlich nicht so ohne Weiteres… Die Keys sind Unique und in der oxconfig gibts auch noch zig Verknüpfungen… Vielleicht könnte ja jemand mal ein Blank SQL zur Anlage eines Standardthemes hier posten, der sich mit der Datenbankstruktur besser auskennt? Das wäre doch was :slight_smile:

Ansonsten gehts halt über die Vererbung… Bis auf die Sache mit der Kategorieartikelanzahl, die sich aber bestimmt noch gibt, sobald ich alle Templates angepasst habe. Ansonsten läuft der Shop schon mal…

Allerbeste Grüße vom Chris


#10

Marco hatte ein Tutorial angekündigt, wie man ein eigenes Theme anlegt. Soll die Tage online gestellt werden.


#11

Das hier kennt ihr?


#12

Ja, das kennen wir, jetzt wird quasi nach ner Möglichkeit gesucht, die Einstellungen NICHT durchzuvererben, sondern individuell im eigenen Themereiter einstellen zu könne, dafür bräuchte man sämtliche Datenbankinserts, dürfte ja eigentlich nur die beiden vorherigen Tabellen betreffen… Wenn man die OXID leer lässt, müsste ja eigentlich automatisch eine generiert werden, wenn mich net alles täuscht…

Allerbeste Grüße vom Chris


#13

so ist das bei den Artikeln, den Herstellern/Lieferanten etc…


#14

Die Geschichte würde mich auch brennend interessieren. Vor allem, da es mir seit dem Update den Artikelvergleich nicht mehr anzeigt.


#15

Hi, schreibe in Deine theme.php folgendes rein:


$aTheme = array(
    'id'           => 'meine_struempfe',
    'title'        => 'Meine Strümpfe',
    'description'  => 'Meine Strümpfe Standard Theme',
    'thumbnail'    => 'theme.jpg',
    'version'      => '1.0',
    'author'       => 'Chris Bernhard',
    'parentTheme'    => 'basic',
    'parentVersions' => array('1.4'),
);

Dann Dein eigenes Theme aktivieren und die Einstellungen zum Artikelvergleich im basic Template treffen, dann wird dieser auch wieder angezeigt.

Allerbeste Grüße vom Chris


#16

Hmmm… das klappt irgendwie nicht, trotz geleertem Cache und tmp.


#17

Ich hoffe, Du hast das entsprechend umgemünzt auf Deine Begebenheiten, ja?

$aTheme = array(
‘id’ => ‘deintemplateordner’,
‘title’ => ‘deintemplatetitle’,
‘description’ => ‘deine template Beschreibung’,
‘thumbnail’ => ‘theme.jpg’,
‘version’ => ‘1.0’,
‘author’ => ‘Chris Bernhard’,
‘parentTheme’ => ‘basic’,
‘parentVersions’ => array(‘1.4’), // hier die richtige Versionsnummer eingegeben?
);


#18

:smiley:
Klar, ganz so schlimm stehts um meine Kenntnisse nicht.


#19

Hallo Leute, hallo Chris

jetzt wird quasi nach ner Möglichkeit gesucht, die Einstellungen NICHT durchzuvererben, sondern individuell im eigenen Themereiter einstellen zu könne,

Das wird sicherlich kommen. Wie es geht steht ja auf der oben genannten Wiki-Seite. Eine GUI dafür ist nicht soo kompliziert.

Bis dahin, kannst Du die Einstellungen hiermit kopieren.
$scriptConfig anpassen und ab dafür

<?php
/**
 * $Id$
 *
 * Bemerkenswert ist, dass die oxid in oxconfig und oxconfigdisplay nicht
 * korresponieren.
 * Wenn ein configWert gepeichert wird, bekommt der eine neue ID
 * siehe: core/oxconfig ~ 1680
 *
 * # im Frontend muß man als Admin angemeldet sein, oder in Zeile exit(Anmeldung erforderlich) auskommentieren
 * # Vor dem ersten Lauf die beiden Werte für Quelle und Ziel anpassen
 * # Datei ins root-Verzeichnis
 * # Vorher den Theme-Ordner kopieren und umbenennen
 */

// Hier anpassen.
$scriptConfig = (object) array(
    'from' => 'azure',           // Quelle
    'to'   => 'mytheme'          // Ziel
);

exit('angepasst? kommentier mich aus in Zeile:' . __LINE__);

function getShopBasePath() {
    return realpath( dirname(__FILE__) ) . DIRECTORY_SEPARATOR;
}

require_once getShopBasePath() . 'core/oxfunctions.php';
$shopConfig = oxConfig::getInstance();

if( oxSession::getVar('usr') === null || oxSession::getVar('usr') !== 'oxdefaultadmin' ) {
    exit( 'Anmeldung erforderlich.' );
}

$oDb      = oxDb::getDb(true);
$sShopId  = $shopConfig->getBaseShopId();

$sSql = "
    SELECT
        `cfg`.`oxid`                                                   AS `id`,
        `cfg`.`oxmodule`                                               AS `theme`,
        `cfg`.`oxvarname`                                              AS `name`,
        `cfg`.`oxvartype`                                              AS `type`,
        DECODE( `cfg`.`oxvarvalue`, '" . $shopConfig->sConfigKey . "') AS `value`,
        `cfgd`.`oxgrouping`                                            AS `group`,
        `cfgd`.`oxvarconstraint`                                       AS `constraint`,
        `cfgd`.`oxpos`                                                 AS `pos`
    FROM
        `oxconfig`        AS `cfg`,
        `oxconfigdisplay` AS `cfgd`
    WHERE
        `cfg`.`oxshopid` = '" . $sShopId . "'
    AND
        `cfg`.`oxmodule` = 'theme:" . $scriptConfig->from ."'
    AND(
        `cfgd`.`oxcfgmodule` = `cfg`.`oxmodule`
        AND
        `cfgd`.`oxcfgvarname` = `cfg`.`oxvarname`
    )
";

$aThemeValues = $oDb->getAll( $sSql );

if( is_array( $aThemeValues )
    && !empty( $aThemeValues ) )
{
    // lösche vorhande Einträge für das theme
    $oDb->Execute("
        DELETE FROM
            `oxconfig`
        WHERE
            `oxshopid`  = '" . $sShopId . "'
        AND
            `oxmodule` = 'theme:" . $scriptConfig->to . "'
    ");

    // lösche vorhande Einträge für das theme
    $oDb->Execute("
        DELETE FROM
            `oxconfigdisplay`
        WHERE
            `oxcfgmodule` = 'theme:" . $scriptConfig->to . "'
    ");

    foreach( $aThemeValues as $aConfig )
    {
        $cfg = (object) $aConfig;
        $sSql = "
            REPLACE INTO
                `oxconfig`
            SET
                `OXID`       = '" . $scriptConfig->to . "." . $cfg->name . "',
                `OXSHOPID`   = '" . $sShopId . "',
                `OXMODULE`   = 'theme:" . $scriptConfig->to . "',
                `OXVARNAME`  = '" . $cfg->name . "',
                `OXVARTYPE`  = '" . $cfg->type . "',
                `OXVARVALUE` = ENCODE( " . $oDb->quote( $cfg->value ) . ", " . $oDb->quote( $shopConfig->sConfigKey ) . " )
        ";
        $oDb->Execute($sSql);

        // display
        $sSql = "
            REPLACE INTO
                `oxconfigdisplay`
            SET
                `oxid`            = '" . $scriptConfig->to . "." . $cfg->name . "',
                `oxcfgmodule`     = 'theme:" . $scriptConfig->to . "',
                `oxcfgvarname`    = '" . $cfg->name . "',
                `oxgrouping`      = '" . $cfg->group . "',
                `oxvarconstraint` = '" . $cfg->constraint . "',
                `oxpos`           = '" . $cfg->pos . "'
      ";
      $oDb->Execute($sSql);
    }
} else {
    exit('Fehler. Keine Einträge für "'. $scriptConfig->from . '" gefunden' );
}

Wenn man die OXID leer lässt, müsste ja eigentlich automatisch eine generiert werden, wenn mich net alles täuscht…
Ja, wenn über das Backend die Einstellungen gespeichert werden, wird jedesmal die komplette Zeile aus der oxconfig gelöscht und eine neue angelegt, mit neuer oxid. siehe: core/oxconfig ~ 1680

ciao, Stefan


#20

Nachtrag:

Weil mir Gestern wieder das Backend stehen geblieben ist wegen fehlerhafter Einträge in System/modules habe ich mir ein script gebastelt um die Modul-Einträge ohne Backend bearbeiten zu können. Vielleicht ist es ja nützlich bzw. würdet Ihr das mal auf Brauchbarkeit respektive Funktion checken? Danke.

Datei ins Root-Verzeichnis und als Admin im Frontend anmelden.

<?php
/**
 * $Id$
 *
 * Datenbankeintrag der Module bearbeiten.
 * Falls das Backend mal wieder zerschossen ist :-)
 *
 * # Für die Benutzung muss man im Frontend als Admin-Benutzer (oxdefaultadmin)
 *   angemeldet sein.
 * # Datei ins Root-Verzeichnis
 * # http://meinedomäne.tld/diesedatei.php aufrufen.
 *
 * Zum übernehmen eines Verlauf-Eintrages wird .textContent verwendet. Ist in
 * dem Fall egal, da kein HTML drin steht und Firefox innerText nicht kennt.
 * innerText wäre besser, da keine HTML mitgenommen wird.
 * http://www.google.de/search?q=innerText+undefined
 *
 * Kann gut sein, das ältere Browser textContent auch nicht richtig umsetzen.
 * Muß man dann halt ne Funktion basteln.
 * <code>
 *     var hasInnerText = (Element.innerText !== undefined) ? true : false;
 *     if(!hasInnerText){
 *         Element.textContent = 'bla';
 *     } else{
 *         Element.innerText = 'bla';
 *     }
 * </code>
 *
 * @TODO 
 *     # Ausbauen um alle Konfigurationsschalter zu bearbeiten.
 *     # Verlauf in Datei speichern
 *
 * @version 0.1.0 | 20110427
 * @author Stefan Mayer | [email protected]
 */

function getShopBasePath() {
    return realpath( dirname(__FILE__) ) . DIRECTORY_SEPARATOR;
}

require_once getShopBasePath() . 'core/oxfunctions.php';

$shopConfig = oxConfig::getInstance();

error_reporting( E_ALL );
header('content-type:text/html; charset=utf-8');

if( oxSession::getVar('usr') === null || oxSession::getVar('usr') !== 'oxdefaultadmin' ) {
    exit( 'Anmeldung erforderlich.' );
}

$scriptConfig = (object) array(
    'delimiter'   => PHP_EOL,
    'separator'   => '=>',
    'session_key' => 'hz_modules',//basename(__FILE__)
    'redirect'    => false,
    'history'     => array()
);

$sShopId     = $shopConfig->getBaseShopId();

if( oxSession::getVar( $scriptConfig->session_key ) !== null ) {
    $scriptConfig->history = oxSession::getVar( $scriptConfig->session_key );
}


/**
 * Eintrag aus Verlauf löschen
 */
if( isset( $_GET['v']['loeschen'] ) ) {
    $time = (int)$_GET['v']['loeschen'];
    if( isset( $scriptConfig->history[$time] ) ) {
        unset( $scriptConfig->history[$time] );
    }
    $scriptConfig->redirect = true;
}

/**
 * Module speichern
 */
if( isset( $_POST['m']['speichern'] ) )
{
    $_string  = trim( $_POST['m']['module'] );
    $_lines   = explode( $scriptConfig->delimiter, $_string );
    $aModules = array();
    $sModules = '';
    foreach( $_lines as $_line ) {
        if( strpos($_line, $scriptConfig->separator ) === false ) {
            continue;
        }
        $_m = explode($scriptConfig->separator, $_line);
        if( !isset( $_m[0] ) || !isset( $_m[1] ) ) {
           continue;
        }
        $class    = trim( $_m[0] );
        $module   = trim( $_m[1] );
        if( !empty( $class ) && !empty($module) ) {
            $aModules[$class] = $module;
        }
    }
    $shopConfig->saveShopConfVar( 'aarr', 'aModules', $aModules, $sShopId, $sModule = '' );
    $_aTmp = array();
    foreach( $aModules as $class => $module ) {
        $_aTmp[] = str_pad($class,20,' ') . str_pad( $scriptConfig->separator, ( strlen( $scriptConfig->separator ) + 1 ) , ' ' ) . $module;
    }
    $scriptConfig->history[time()] = implode( PHP_EOL, $_aTmp );
    krsort($scriptConfig->history);
    $scriptConfig->redirect = true;
}

/**
 * Wenn gepeichert oder gelöscht, redirect um "reload" zu verhindern.
 */
if( $scriptConfig->redirect === true ) {
    oxSession::setVar( $scriptConfig->session_key, $scriptConfig->history );
    header('location:http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'] );
}

/**
 * Zeichenkette für die Textarea
 */
$aModules = array();
foreach( $shopConfig->getConfigParam( 'aModules' ) as $class => $module ) {
    $aModules[] = str_pad($class,20,' ') . str_pad( $scriptConfig->separator, ( strlen( $scriptConfig->separator ) + 1 ), ' ') . $module;
}
$sModules = implode( PHP_EOL, $aModules );
?>
<!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" dir="ltr" lang="de" xml:lang="en">
<head>
    <title>OXID eSales - Module bearbeiten</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta http-equiv="Content-Language" content="de" />
    <meta http-equiv="Content-Script-Type" content="text/javascript" />
    <meta http-equiv="Content-Style-Type" content="text/css" />
    <meta name="language" content="de" />
    <meta name="author" content="Stefan Mayer[[email protected]]" />
    <style type="text/css">
        body{ font-family: Arial, Helvetica, sans-serif; font-size: .8em }
        textarea{ width: 450px; }
        textarea,dd{ white-space: pre; font-family: 'courier new'; font-size: 12px; }
        dd{ padding: 10px 0; margin-bottom:10px; border-bottom: 1px dotted #333}
        dt a{ color: inherit; padding: 2px 5px; border-radius:4px; }
        dt a.setzen:hover{ background-color: green; color: #fff; }
        dt a.loeschen:hover{ background-color: red; color: #fff; }
    </style>
</head>
<body id="start">
    <h1>Module bearbeiten</h1>
    <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
        <fieldset><legend>Aktuelle Moduleinträge:</legend>
            <textarea id="hotze-module" name="m[module]" rows="15" cols="80"><?php echo $sModules; ?></textarea>
            <br />
            <input type="submit" name="m[speichern]" value="Module speichern" />
        </fieldset>
    </form>

    <h2>Hinweise:</h2>
    <ul>
        <li>Man kann Einträge auch auskommentieren in dem man die Klasse "unkenntlich" macht. z.B.: "//oxorder => ... "</li>
        <li>Achtung: Windowssystem akzeptieren "Datei.php = datei.php", Unix nicht. Schreibweise beachten.</li>
    </ul>

    <?php if( $history = oxSession::getVar( $scriptConfig->session_key ) ) : ?>
    <h2>Verlauf:</h2>
        <dl>
        <?php foreach( $history as $time => $value ) : ?>
            <dt><?php echo date('d.m.Y H:i:s', $time ); ?> ↔ <a class="setzen" href="<?php echo $_SERVER['PHP_SELF']; ?>#start" onclick="document.getElementById('hotze-module').value = document.getElementById('hotze-verlauf-<?php echo $time;?>').textContent;">setzen</a>|<a class="loeschen" href="<?php echo $_SERVER['PHP_SELF']; ?>?v[loeschen]=<?php echo $time?>">löschen</a></dt>
            <dd id="hotze-verlauf-<?php echo $time;?>"><?php echo $value; ?></dd>
        <?php endforeach; ?>
        </dl>
    <?php endif; ?>
</body>
</html>