Eigenes Frontend Modul

Ich habe mal eine Verständnisfrage zur Modulprogrammierung.

Ich versuch gerade ein Modul zu schreiben welches in der productmain.tpl den Block “details_productmain_variantselections” ersetzt.

Funktioniert soweit ganz gut wenn ich nur z.B “test” in mein.tpl reinschreibe.
Nun will ich aber den ganzen Blockbereich mit einem abgeänderten Teil überschreiben. Wenn ich den gesamten Blockbereich dort hineinkopiere bekomme ich auch nur den teil angezeigt und ohne den Restbereich (auch kein Stylesheet).

Was ist daran so kompliziert? Ich hoffe jemand kann mir dabei helfen.
Hier ist meine metadata.php

<?php
/**
 CC
 *
 * @category      module
 * @package       vselect
 * @author        
 * @link          
 * @copyright (C) 20162016
 */

/**
 * Metadata version
 */
$sMetadataVersion = '1.1';

/**
 * Module information
 */
$aModule = array(
    'id'          => 'mydevselect',
    'title'       => array(
        'de' => '[TR - MYDE VSELECT]',
        'en' => 'MYDE VSELECT',
    ),
    'description' => array(
        'de' => '[TR - MYDE VSELECT Module]',
        'en' => 'MYDE VSELECT Module',
    ),
    'thumbnail'   => 'out/pictures/picture.png',
    'version'     => '1.0.0',
    'author'      => '',
    'url'         => '',
    'email'       => '',
    'extend'      => array(
        //'[ParentClassName]' => 'myde/vselect/[appropriate_folder]/mydevselect[parent_class_name]',
    ),
    'files'       => array(
        'mydevselectmodule' => 'myde/vselect/core/mydevselectmodule.php',
        
        //'[your_class_name]' => 'myde/vselect/[appropriate_folder]/mydevselect[your_class_name].php',
),
    'templates'   => array(
        
        //'[your_template].tpl' => 'myde/vselect/views/pages/[theme_folder_path]/mydevselect[your_template].tpl',
),
    'blocks'      => array(
        array(
            'template'  => 'page/details/inc/productmain.tpl',
            'block'  => 'details_productmain_variantselections',
            'file' => 'views/blocks/mydevselect_details_productmain_variantselections.tpl',
        ),
        ),
    'settings'    => array(
        /*array(
            'group' => 'mydeVSELECT[SettingsGroup]',
            'name'  => 'mydeVSELECT[SettingName]',
            'type'  => 'str',
            'value' => '[initial_setting_value]',
        ),*/
),
    'events'      => array(
        'onActivate'   => 'mydeVSELECTModule::onActivate',
        'onDeactivate' => 'mydeVSELECTModule::onDeactivate',
    ),
);

Wie sieht die mydevselect_details_productmain_variantselections.tpl aktuell aus und was genau meinst du mit dem fehlenden “Restbereich”?

Die mydevselect_details_productmain_variantselections. tpl sieht so aus.



[{* variants | md variants *}]
        [{block name="details_productmain_variantselections"}]
            [{if $aVariantSelections && $aVariantSelections.selections }]
                [{oxscript include="js/widgets/oxajax.js" priority=10 }]
                [{oxscript include="js/widgets/oxarticlevariant.js" priority=10 }]
                [{oxscript add="$( '#variants' ).oxArticleVariant(); "}]
                [{assign var="blCanBuy" value=$aVariantSelections.blPerfectFit}]
                <div id="variants" class="selectorsBox js-fnSubmit clear">
                    [{assign var="blHasActiveSelections" value=false}]
                    [{foreach from=$aVariantSelections.selections item=oList key=iKey}]
                        [{if $oList->getActiveSelection()}]
                            [{assign var="blHasActiveSelections" value=true}]
                        [{/if}]
                        [{include file="widget/product/myselectbox.tpl" oSelectionList=$oList iKey=$iKey blInDetails=true}]
                    [{/foreach}]
                </div>
                
                 [{if $blHasActiveSelections}]
                    <div class="variantReset">
                        [{* Reset link *}]
                        <a href="" class="reset">[{ oxmultilang ident="RESET_SELECTION" }]</a>

                        [{* Active selections *}]
                        <label>[{ oxmultilang ident="SELECTED_COMBINATION" suffix="COLON" }]</label>
                        [{assign var="sSelectionSep" value=""}]
                        [{strip}]
                            [{foreach from=$aVariantSelections.selections item=oSelectionList name=variantselections}]
                                [{assign var="oActiveSelection" value=$oSelectionList->getActiveSelection()}]
                                [{if $oActiveSelection }]
                                    [{$sSelectionSep}][{$oActiveSelection->getName()}]
                                    [{assign var="sSelectionSep" value=", "}]
                                [{/if}]
                            [{/foreach}]
                        [{/strip}]
                    </div>
                [{else}]
                    [{if !$blCanBuy && !$oDetailsProduct->isParentNotBuyable()}]
                        [{assign var="blCanBuy" value=true}]
                    [{/if}]
                [{/if}]
                    [{if !$blCanBuy }]
                        <div class="variantMessage">[{oxmultilang ident="DETAILS_CHOOSEVARIANT"}]</div>
                    [{/if}]

            [{/if}]
        [{/block}]
        

So sieht der Output aus.

Versuch mal das [{block name="…"}] und [{/block}] wegzulassen.

Die Seite wird jetzt geladen. Aber der Code Teil fehlt.
Ich habe hier mal einen Ausschnitt aus dem Quelltext.

So wäre es richtig:

Und so sieht es aus.

Es wird also nicht alles geladen.

Wahrscheinlich findet OXID die [{include file=“widget/product/[B]myselectbox.tpl[/B]” oSelectionList=$oList iKey=$iKey blInDetails=true}] nicht oder diese ist leer. Vielleicht musst du den Pfad so anpassen, dass du in dein Modulordner springst. Da fehlt mir aber die Erfahrung.

Ich mache das immer so: Blocks in Ordner out/blocks/ und in metadata ohne Ordnerangaben, wenn größer als 4.7…: Guck dir die metadata mal an: http://www.foxido.de/foxido-frontend-new-class-demo Modul neu starten.

auf Anhieb und mit den Platzhaltern in der gezeigten metadata.php kann ich den Fehler nicht finden, aber vielleicht hilft dir das ein bisschen auf der Suche:
https://marat.ws/debugging-module-metadata-in-oxid-eshop/

da kannst du sehen, wie der Shop deine metadata Einträge sieht und prüfen lasse, ob der Shop die dazugehörigen Dateien auch findet

Mmmh. Die bunten Bildchen auf der Seite helfen mir gerade sehr wenig. Und zu prüfen gibt es da auch nichts.

Egal.
Kann es wohl sein das die javascript Dateien im Block nicht aufgerufen werden? Ich dachte die Modullogik würde dafür sorgen oder muss da noch eine Anweisung hin?

Wenn es nichts zu prüfen gibt, dann hast du gar keine Einträge im echten Metadata.php? Dann kann ja auch nichts funktionieren.

Javascript wird eingefügt, egal ob mit oxscript Tags oder direkt, aber du sagtest eben, dass gar nichts von deinem Block angezeigt wird.
Wird also doch etwas angezeigt, nur die Scripts funktionieren nicht?

Ich habe mal einen Text eingefügt der wird angezeigt. testdas1 und testdas2

In der “mydevselect_details_productmain_variantselections.tpl” ist folgender Code als Auszug:

 [{oxscript include="js/widgets/oxarticlevariant.js" priority=10 }]
                [{oxscript add="$( '#variants' ).oxArticleVariant(); "}]
                [{assign var="blCanBuy" value=$aVariantSelections.blPerfectFit}]
                <div id="variants" class="selectorsBox js-fnSubmit clear">testdas1
                    [{assign var="blHasActiveSelections" value=false}]
                    [{foreach from=$aVariantSelections.selections item=oList key=iKey}]
                        [{if $oList->getActiveSelection()}]
                            [{assign var="blHasActiveSelections" value=true}]
                        [{/if}]
                        
                        [{include file="widgets/product/myselectbox.tpl" oSelectionList=$oList iKey=$iKey blInDetails=true}]
                    [{/foreach}]
                </div>testdas2
                

Im html Quelltext sieht das so aus:


                            
                
                
                                <div id="variants" class="selectorsBox js-fnSubmit clear">testdas1
                                                                                        
                                                            </div>testdas2
                
                                                                                                 <div class="variantMessage">Bitte wählen Sie eine Variante</div>
                    

Und auf der Seite sieht das so aus: