Widget in Modul einbauen

Hallo zusammen,

ich bin grad ganz neu bei Oxid und baue mit meinen Kollegen für einen Kunden damit einen Shop.

Für die Sidebar brauchen wir ein extra Widget, um dort einige Tutorialvideos gesammelt anzuzeigen, die im Backend getrennt von den Artikeln gepflegt werden sollen.
Mithilfe einiger Threads hier im Forum und den Tutorials im Wiki hab ich jetzt ein funktionierendes Widget, allerdings statt aus der Datenbank im Moment mit statischen Werten.
Dazu hab ich ein Backend-Modul, das schon ins Menü eingebunden ist, auch dort gibts noch nicht allzuviel zu machen, also es wird nur eine Hallo Seite ausgegeben.

Mein Problem ist jetzt, dass ich am liebsten das oben genannte Widget auch in das Modul kapseln würde, also hab ich das Widget genommen, in das Modul-Verzeichnis kopiert und in der metadata.php eingetragen, dass es von oxWidget erben soll, so wie es auch bisher war. Allerdings krieg ich es jetzt nicht mehr hin, dass das Widget überhaupt etwas ausgibt.

Ziel sollte es sein, dass quasi alle Änderungen nur im Modul-Verzeichnis sind und der restliche Code unverändert bleibt. Ich habe jetzt im Forum nichts genaues dazu gefunden wie man das am besten machen kann und hoffe, dass mir vielleicht trotzdem jemand helfen kann.

Nachfolgend einmal der Code, der als Widget direkt funktioniert.
Den würde ich gerne komplett in das Modul kopieren und dann eben das Template an den Sidebar-Block anhängen.

Ich hab mich da von der oxwvendorlist.php inspirieren lassen

oxwvideolist.php

<?php

/**
 * Video list widget.
 * Forms video list.
 */
class oxwVideoList extends oxWidget
{
    /**
     * Current class template name.
     *
     * @var string
     */
    protected $_sThisTemplate = 'widget/sidebar/videolist.tpl';

    /**
     * Template variable getter. Returns vendorlist for search
     *
     * @return array
     */
    public function getVideolist()
    {
        if ( $this->_aVideolist === null ) {
            $this->_aVideolist = array(
                0 => array(
                    'url'   => 'http://youtube.com',
                    'img'   => 'foo.jpg',
                    'title' => 'Reparieren',
                    'text'  => 'Mit den Werkzeugen, .'
                ),
                1 => array(
                    'url'   => 'http://youtube.com',
                    'img'   => 'bar.jpg',
                    'title' => 'Schleifen',
                    'text'  => 'Mit den Werkzeugen, ..'
                ),
                2 => array(
                    'url'   => 'http://youtube.com',
                    'img'   => 'foobar.png',
                    'title' => 'Wachsen',
                    'text'  => 'Mit den Werkzeugen, ...'
                ),
                3 => array(
                    'url'   => 'http://youtube.com',
                    'img'   => 'barfoo.png',
                    'title' => 'Schweißen',
                    'text'  => 'Mit den Werkzeugen, ....'
                )
            );
        }
        return $this->_aVideolist;
    }

}

videolist.tpl

[{assign var="videos" value=$oView->getVideolist()}]
[{if $videos}]
    [{block name="sidebar_videos"}]
        <div class="well sidebox video-list">
            <div class="sidebox-title"><h3>Video Anleitungen in HD</h3></div>
            [{foreach from=$videos item=_video}]
                <div class="sidebox-item video-item media">
                    <a class="sidebox-item-link pull-left" href="[{$_video.url}]">
                        <img class="sidebox-item-img media-object" src="[{$_video.img}]" />
                    </a>
                    <div class="sidebox-item-text media-body">
                        <h3 class="media-heading">[{$_video.title}]</h3>
                        <p>[{$_video.text}]</p>
                        <a href="[{$_video.url}]">Video abspielen</a>
                    </div>
                    <br class="clearfix">
                </div>
            [{/foreach}]
        </div>
    [{/block}]
[{/if}]

so ganz spontan würde ich folgendes probieren:
im $_sThisTemplate nur den Basename drin lassen
und in metadata das Template auch mit dem Basename registrieren

So hatte ich das gestern auch schon drin, allerdings hat es mir dann nix mehr gezeigt.
Im Moment hab ich dieses Widget dann per folgendem Code direkt im sidebar Template eingebunden.

[{oxid_include_widget cl="em_videolist_widget" noscript=1 nocookie=1}]

Wenn es im Modul ist, ist die Änderung gegenüber dem oben geposteten Code nur der Name em_videolist_widget, das von em_videolist_widget_parent extended
und eben das $_sThisTemplate = ‘em_videolist_widget.tpl’

Die metadata.php sieht dann wie folgt aus.

<?php

/**
 * Module information
 */
$aModule = array(
    'id' => 'em-videolist',
    'title' => 'EM - Videoliste',
    'description' => 'EM - Videoliste Beschreibung',
    'extend' => array(
        'oxAdminView' => 'em-videolist/admin/em_videolist',
        'oxWidget' => 'em-videolist/components/widgets/em_videolist_widget'
    ),
    'files' => array(
    ),
    'templates' => array(
        'em_videolist.tpl' => 'em-videolist/out/admin/tpl/em_videolist.tpl',
        'em_videolist_widget.tpl' => 'em-videolist/out/tpl/em_videolist_widget.tpl'
    ),
);

Was ich noch festgestellt habe, wenn ich den Code oben ins sidebar-Template eingebunden habe, komme ich nicht mehr auf die normale URL, sondern werde automatisch immer auf http://<meine-url>/index.php?cl=start&redirected=1 weitergeleitet. Auch Kategorien oder andere Seiten gehen dann nicht mehr.

Edit: Im Backend bei Module werden mir beide Klassen korrekt angezeigt

Habe das mal benutzt um die neue Struktur zu testen. Was mir aufgefallen ist, die deutsche Doku sagt man soll blocks vom /modules Ordner aus angeben, das scheint aber nicht zu stimmen: https://bugs.oxid-esales.com/view.php?id=4789

Ich hab den Test angehängt.

wow super, also das Testmodul klappt genau so wie ich es haben wollte.
In einem anderen hier im Forum hatte ich das mit den Blocks auch gefunden, aber da hatte ich eben auch davor dann noch das Modul-Verzeichnis stehen, vielleicht hat es dann deshalb nicht geklappt.

Kann es sein, dass dieser oben genannte Redirect durch ein fehlendes Template ausgelöst wird, bzw. wenn Oxid das nicht korrekt auflösen kann?
Anscheinend gibts da auch Probleme mit dem extend-Array, wenn ich darin von einer eigenen Klasse extenden lasse, klappt das, aber von einer internen oxid-Klasse bringt mir jedesmal die Startseite.

Vielen Dank schon mal, damit kann ich auf jedenfall weiterarbeiten.

Dein extendsarray von oben geht so nicht:


    'extend' => array(
        'oxAdminView' => 'em-videolist/admin/em_videolist',
        'oxWidget' => 'em-videolist/components/widgets/em_videolist_widget'
    ),

der extends array ist dafür da bestehende Klassen transparent zu erweitern, z.B. oxarticle. oxAdminView und oxWidget können so nicht erweitert werden, weil die Klassen direkt von ihnen erben:

class oxwBetaNote extends oxWidget

Du willst ja auch gar nicht die Klasse oxWidget ändern, sondern du willst eine eigene Klasse verwenden, die von oxWidget erbt. Für eigene Klassen ist das “files”-Array da, die Einträge dort werden vom Autoloader gefunden. Wenn du also im Template hast:

[{oxid_include_widget cl="oxwVideoList"}]

dann muss die Klasse oxwVideoList im files-Array stehen sonst wird sie nicht gefunden.

Dann gibt es einen redirect aber auch einen Eintrag in EXCEPTION_LOG.txt.

Dann hatte ich das beim Forum durchforsten falsch verstanden, ich dachte, das ist dafür da, dass ich in der Klasse schreiben kann

“klassenname extends klassenname_parent”

und quasi über dieses Array sagen, dass OxWidget die Parent-Klasse ist.
Habe jetzt aber beide meine Klassen über files eingebunden und alles klappt.

So, nochmal eine kurze Rückmeldung,

das Modul ist fertig und meinem Chef gefällts =)

vielen Dank nochmal für die Hilfe