Custom Produkt Template bei Variantenauswahl

Hallo zusammen,

ich bin ziemlich neu bei Oxid. Ich habe das Problem, dass ich ein eigens Produktdetail Template angelegt habe.

die geänderten Templates stehen in:

page/details/detailsB.tpl
custom/fullproductinfoB.tpl
custom/productmainB.tpl
custom/tabsB.tpl
custom/widget/detailsB.tpl

Funktioniert auch alles wunderbar. Die Artikel haben aber Varianten, sobald eine Variante ausgewählt wird, lädt der Ajax Request wieder das original Template productmain.tpl, und meine Änderunegn sind somit weg.

Ich habe schon alles mögliche ausprobiert, aber leider keinen Erfolg. Im Forum habe ich an anderer Stelle gelesen, dass die productmain.tpl fest vorgeben ist.

Wie kann man aber dann das Template für die Detailansicht duch ein Custom Template ersetzen? Kann mir hier jemand weiterhelfen?

Gruß

coweb

zwischen den Zeilen lese ich dass kein eigenes child-theme angelegt ist - oder?
Wenn ja dann einfach die productmail.tpl unter gleichem Verzeichnis + Namen auch in das child-theme …

das template ist ein Child-template von flow. Die angepassten Dateien stehen im Child Theme.

Gruß

coweb

siehe oben:

[QUOTE=patchwork.de;182811]
Wenn ja dann einfach die productmain.tpl unter [B]gleichem [/B]Verzeichnis + Namen auch in das child-theme …[/QUOTE]

ich weis jetzt nicht recht welches Verzeichnis gemeint ist. Verstehe ich das so richtig ich muss
productmain.tpl im Verzeichnis /custom anlegen, wo auch die angepassten Dateien stehen.

ausführlich:

  • parallel zum flow-Verzeichnis legst du eine Verzeichnisstruktur mit zB dem Basisnamen custom an. Alle Unterverzeichnisse haben den gleichen Namen wir im flow-Verzeichnis.
  • in diese Struktur legst du unter gleichem Namen die Templates, die überschrieben werden sollen
    zB liegt die productmain.tpl in

…/application/views/flow/tpl/page/details/inc/productmain.tpl

deine eigene liegt dann in

…/application/views/custom/tpl/page/details/inc/productmain.tpl

Ok schon mal vielen Dank für die Antworten. Aber so genau habe ich das schon in meinem Template angelegt. Die overrides funktionieren auch. Es wird das Custom Template geladen. Das Problem ist ein anderes, vielleicht habe ich mich falsch ausgedrückt.

Bei der Auswahl von Varianten, wird per Ajax immer das Template productmain.tpl geladen, es sollte aber das custom Template productmainB.tpl geladen werden. Ich habe noch nicht die Stelle gefunden, an der sich dies beinflussen lässt.

Gruß
coweb

im ersten Beitrag hast dur geschrieben dass folgendes Template geladen wird:

custom/productmainB.tpl

(wahrscheinlich ist im aufrufenden Template (fullproductinfo.tpl) der Name geändert worden)
Das geht schief! Alle Templates in einem child-Theme müssen die gleichen Namen wie im parent haben!

die geänderten Templates stehen in:

page/details/detailsB.tpl
custom/fullproductinfoB.tpl
custom/productmainB.tpl
custom/tabsB.tpl
custom/widget/detailsB.tpl

  • mache diese Änderungen im flow-Verzeichnis rückgängig
  • lege in dem custom-Verzeichnis unter gleichem Namen im gleichen Unterverzeichnis deine geänderten Templates an
  • erstelle eine theme.php
  • aktiviere das Theme im admin
  • thats it

Im flow Verzeichnis habe ich keine Dateien geändert oder hineinkopiert. Ich habe ein Child-Theme angelegt. Eine Theme.php mit folgendem Inhalt erstellt:

/**
[I] * Theme Information
*/
$aTheme = array(
‘id’ => ‘wbc_schaumann’,
‘title’ => ‘Shop Template Schaumann’,
‘description’ => ‘a parent theme - Flow is OXID`s official responsive theme based on the CSS framework Bootstrap 3.’,
‘thumbnail’ => ‘theme.jpg’,
‘version’ => ‘1.0.0-beta’,
‘author’ => ‘<a href=“http://www.oxid-esales.com” title=“OXID eSales AG”>OXID eSales AG</a>’,
‘parentTheme’ => ‘flow’,
‘parentVersions’ => array(‘1.0.0-beta’,‘0.6’),
);
[/I]

Child Template wie folgt angelegt:

[I]/views/wbc_schaumann
/views/wbc_schaumann/tpl/
/views/wbc_schaumann/en/
/views/wbc_schaumann/de/
theme.php[/I]

Im Ordner /views/wbc_schaumann/tpl/ liegen alle angepassten Themes.

Für die Detailansicht bestimmter Artikel habe ich ein alternatives Template unter:

[I]/views/wbc_schaumann/tpl/page/details/detailsB.tp[/I]l angelegt.

alle angepassten Template die weiter aufgerufen werden habe ich im Ordner:

[I]views/wbc_schaumann/tpl/custom/[/I] abgelegt.

[I]custom/fullproductinfo.tpl
/custom/productmain.tpl
/custom/tabs.tpl
/custom/widget/details.tpl [/I]

die Namen der Templates habe ich geändert, sie sind jetzt wie im Parent.

Beim Aufruf der Artikel in der Detailansicht wird das alternative Template korrekt geladen. Funktioniert alles wunderbar. Das Problem ist, bei der Auswahl der Varianten, welches ja über AJAX passiert, erscheint wieder das original Template ohne die Anpassungen.

Ich vermute das Problem liegt im Ajax Aufruf, dort das widget oxarticledetails.php geladen. Als Standardtemplate ist dort ist widget/product/details.php hinterlegt. So wie ich das verstehe sollte aber custom/widget/details.php geladen werden damit das geänderte Template wieder geladen wird.

Ich habe gesehen, dass es unter /details einen unterordner /ajax gibt. Muss dort vielleicht noch etwas hinterlegt werden?

gruß coweb

@Patchwork: Problem ist bei einem alternativen Template was beim Artikel selbst unter “Alt. Template” eingetragen wird. Da können die Namen schon anders sein, sollten sie sogar.

@coweb:
In controllers/details.php:

    public function render()
    {
        $myConfig = $this->getConfig();

        $oProduct = $this->getProduct();

        // assign template name
        if ($oProduct->oxarticles__oxtemplate->value) {
            $this->_sThisTemplate = $oProduct->oxarticles__oxtemplate->value;
        }

        if (($sTplName = oxRegistry::getConfig()->getRequestParameter('tpl'))) {
            $this->_sThisTemplate = 'custom/' . basename($sTplName);
        }

        parent::render();

        $sPartial = $this->getConfig()->getRequestParameter('renderPartial');
        $this->addTplParam('renderPartial', $sPartial);

        switch ($sPartial) {
            case "productInfo":
                return 'page/details/ajax/fullproductinfo.tpl';
                break;
            case "detailsMain":
                return 'page/details/ajax/productmain.tpl';
                break;

Da kann man sehen dass im ersten Teil das custom Template geladen wird (oxarticles__oxtemplate->value). Im zweiten Teil für Ajax ($Partial) werden aber einfach die zwei Standardtemplates geladen (gibt zwei je nachdem wieviel nachgeladen werden muss). Diesen Teil müsste man analog zum ersten Teil anpassen, so dass bei vorhandenem oxarticles__oxtemplate->value ein anderes Template geladen wird. Wie man aus dem Namen des alternativen Templates alternative Namen für die Ajax Templates generiert, müsste man sich überlegen, da ist ja der Pfad auch noch drin. Hilft dir das weiter?

Hallo Frank,

ja ich denke das ist ein guter Ansatz. Ich werde das testen.

Gruß
coweb

Hab’s mir nochmal angeschaut, der ganze Code von $Partial und die Dateien im Ordner Ajax werden gar nicht mehr verwendet in neuen Versionen, stattdessen wird direkt das Widget aufgerufen.

Normale Detailansicht:
Controller: details.php
Templates:
-> page/details/details.tpl
-> widget/product/details.tpl
-> page/details/details.tpl
-> page/details/inc/fullproductinfo.tpl

Du hast in deinem alternativen page/details/details.tpl den Widgetaufruf geändert so dass dein Widget-Template aufgerufen wird und so weiter.

Beim Ajax-Call wird das widget aber direkt aufgerufen:
-> widget/product/details.tpl
-> page/details/details.tpl
-> page/details/inc/fullproductinfo.tpl

Und dieses erste Widget-Template steht im Controller components/widgets/oxwarticledetails.php, da müsste es geändert werden.

Ich hab die Custom Templates mal so benannt:
page/details/details.tpl -> custom/details_b.tpl
widget/product/details.tpl -> custom/widget_details_b.tpl

dann im Controller oxwarticledetails.php:

    public function render()
    {
        $oProduct = $this->getProduct();

        // Alternatives Widget Template
        if ($oProduct->oxarticles__oxtemplate->value == "custom/details_b.tpl"){
            $this->_sThisTemplate = 'custom/widget_details_b.tpl';
        }

        parent::render();

Dann wird das neue Widget auch bei Ajax geladen.

Noch eine Idee:
Wenn man den Code für das alt. Template aus details.php herausnimmt und in oxwarticledetails.php einfügt, kann man im Admin direkt das widget eintragen, das wird ja sowieso immer aufgerufen und lädt dann nochmal details, also in oxwarticledetails.php:

    public function render()
    {
        $oProduct = $this->getProduct();

        // Diesen Code in details.php entfernen und hier eintragen:
        if ($oProduct->oxarticles__oxtemplate->value) {
            $this->_sThisTemplate = $oProduct->oxarticles__oxtemplate->value;
        }

Und dann im Admin jeweils direkt das eigene Widget-Template eintragen: custom/widget_details_b.tpl