Oxid 6 Modul ohne Composer erstellen/portieren

ich möchte gerne ein Modul (ohne Composer) schreiben bzw. von V4 auf V6 portieren, leider schon sehr lange vergeblich, trotz vieler Anleitungen und Beispiele anderer. Deshalb versuche ich es jetzt mal hier mit einem für mich recht einfach erscheinenden Beispiel:

Das Modul verändert die Methode ‘getMediaUrls()’ in
‘/vendor/oxid-esales/oxideshop-ce/source/Application/Model/Article.php’
Es soll der SQL-Abfrage ’ ORDER BY OXDESC’ hinzugefügt werden, damit die Reihenfolge der Medien-Links alphabetisch sortiert wird. ‘sortmediaurls’ ist der Name des Modulordners, ‘sortmediaurls.php’ ist die Klasse darin, die ‘sortmediaurls_parent’ erweitert.

aus der alten V4-Version:

class sortmediaurls extends sortmediaurls_parent
public function getMediaUrls()
{
    if ( $this->_aMediaUrls === null ) {
        $this->_aMediaUrls = oxNew("oxlist");
        $this->_aMediaUrls->init("oxmediaurl");
        $this->_aMediaUrls->getBaseObject()->setLanguage( $this->getLanguage() );
        $sViewName = getViewName( "oxmediaurls", $this->getLanguage() );
        $sQ = "select * from {$sViewName} where oxobjectid = '".$this->getId()."' ORDER BY OXDESC";
        $this->_aMediaUrls->selectString($sQ);
    }
    return $this->_aMediaUrls;
}

wird für V6:

class sortmediaurls extends sortmediaurls_parent
public function getMediaUrls()
{
    if ( $this->_aMediaUrls === null ) {
        $this->_aMediaUrls = oxNew(\OxidEsales\Eshop\Core\Model\ListModel::class);
        $this->_aMediaUrls->init("oxmediaurl");
        $this->_aMediaUrls->getBaseObject()->setLanguage($this->getLanguage());
        $sViewName = getViewName("oxmediaurls", $this->getLanguage());
        $sQ = "select * from {$sViewName} where oxobjectid = :oxobjectid ORDER BY OXDESC";
		$this->_aMediaUrls->selectString($sQ, [
            ':oxobjectid' => $this->getId()
        ]);
    }
    return $this->_aMediaUrls;
}

Hab ich da schon was falsch gemacht?
Aber in der metadata.php v1 steht ja auch noch

'extend'       => array(
    'oxarticle' => 'sortmediaurls/sortmediaurls'

aber wenn ich hier ‘oxarticle’ zu ‘Article’ ändere, wie Klasse nun ja heißt, wird das Modul scheinbar auch nicht vom Shop erkannt, es erscheint nicht im Adminbereich, es gibt keine Fehler dazu und die geänderte Funktion im Frontend ist auch nicht zu sehen.

Was muss hier in die metadata.php, oder liegt mein Fehler ganz woanders?

Generell gibt es den Blog Artikel How to (quickly) port a module to OXID 6 • OXIDforge um von V4 auf V6 zuspringen, aber dies bezieht sich auf die 6.0 Serie. Mittleweile sind wir bei der 6.2 Serie und demnächst folgt die 6.3 Serie. Daher wäre die erste Frage auf welche Serie geht es den aktuell hin? 6.0, 6.1, 6.2 oder 6.3?

Dies wird nur bei Metadata Versionen 1.0 und 1.1 glaube ich funktionieren, mittlerweile gelten diese Metadata Versionen mittlerweile als veraltet, dass heißt Du wirst langfristig nicht darum herumkommen auf Metadata Version 2.0 zu wechseln und zumindest eine composer.json Datei für Dein zu portierendes Modul anlegen müssen.

Neulich gab es extra den Sicherheitshinweis, dass man sich bei seinen Modulen seinen Namen bei Composer sichern soll, weil sonst ist dies ein Einfallstor wie sich Schadecode in den Shop einschleusen kann wenn man beim nächsten Composer Update nicht genau hinschaut was man sich dort einlädt.

Nichtsdestotrotz ist es möglich individuelle Module umzusetzen die nicht bei Composer gelistet sind und wo man über die Composer Konfiguration in der composer.json angegeben kann in welchen Path das Modul liegt und das es eben nicht von Composer Extern geprüft wird um es einzuladen.

Der erste Schritt wäre der obigen verlinkten Anleitung zu folgen.

Dort ist der Quellcode vom PayPal Modul welches mit ausgeliefert wird der beste Ansatzpunkt um sich es dort abzugucken um bei Deinen Beispiel mit oxarticle zu bleiben kannst Du Dir folgende Zeile angucken paypal/metadata.php at v6.2.2 · OXID-eSales/paypal · GitHub dies ist aber in Abhängigkeit zu Deiner definierten Metadata Version wenn diese 2.0 oder höher dann kannst Du es so lösen wie im PayPal Modul. Ansonsten ist der OXID eShop noch abwärtskompatibel und Du kannst oxarticle noch so verwenden.

Noch eine Ergänzung wenn Du bereits die Serie 6.2 verwendest, dann musst Du Dein Modul noch anmelden damit es im Admin erscheint, weil ab der Serie 6.2 haben Module 4 Zustände (bisher 2). Weitere Infos unter Module — OXID eShop developer documentation 6.2.0 documentation

1 Like

Welche Version benutzt Du denn? Die alten Module kannst noch in 6.1 nutzen. Ab 6.2. musst anders arbeiten und aus metadata 1.x wird 2.x und aus

wird etwas wie:

‘extend’ => array(
\OxidEsales\Eshop\Application\Model\Article::class => \sortmediaurls\sortmediaurls::class,
),

Die Anmeldung des Moduls musst dann local machen und composer.json auf den Server kopieren.

1 Like

Ich verwende Oxid CE 6.2.3

Schade, ich hatte gehofft man kann kleine einfache Module auch weiterhin wie früher umsetzen, ohne die Details von Composer lernen zu müssen.

die Metadata.php hab ich nun geändert,

<?php
$aModule = array(
    'id'           => 'sortmediaurls',
    'title'        => 'sortmediaurls',
    'description'  => 'adds ORDER BY criteria to the getMediaUrls() function of oxarticle',
    'thumbnail'    => '',
    'version'      => '2.0',
    'author'       => 'ploxid',
    'extend'       => array(
		\OxidEsales\Eshop\Application\Model\Article::class => \sortmediaurls\sortmediaurls::class
    )
);
?>

ich kämpfe noch mit dem Erstellen der composer.json

{
    "name": "sortmediaurls",
    "description": "adds ORDER BY criteria to the getMediaUrls() function of oxarticle",
    "type": "oxideshop-module",
    "keywords": ["oxid", "modules", "eShop"],
    "homepage": "https://www.oxid-esales.com/en/home.html",
    "license": [
        "GPL-3.0-only",
        "proprietary"
    ],
    "extra": {
        "oxideshop": {
            "blacklist-filter": [
                "documentation/**/*.*"
            ],
            "target-directory": "sortmediaurls"
        }
    },
    "require": {
        "php": ">=5.6",
        "lib-curl": ">=7.26.0",
        "lib-openssl": ">=1.0.1",
        "ext-curl": "*",
        "ext-openssl": "*"
    },
    "autoload": {
        "psr-4": {
            "\\sortmediaurls\\": "../../../source/modules/sortmediaurls"
        }
    }
}

aber wenn das richtig ist, dann müsste ich danach das Modul per

composer require sortmediaurls

installieren, und dann mit

vendor/bin/oe-console oe:module:activate sortmediaurls

per konsole aktivieren, damit es im adminbereich von oxid erscheint, wo ich es endlich wirklich aktivieren kann?

ne, mir fällt grade auf, dass ich noch ein viel grundlegenderes verständnisproblem hab, ich muss ja erstmal einen unterordner im ordner vendor anlegen, von dem aus das modul dann per composer in den source-ordner installiert wird, oder nicht? und dafür wiederum muss ich erstmal einen ordner anlegen in dem mehrere module gruppiert werden, oder nicht? oder packe ich das modul einfach in vendor/oxid-esales/?

Genau eine gute Übersicht für einen Einstieg findest Du unter dem Wiki Eintrag Anleitung: Composer für Shopbetreiber

Ja, das geht schon in die richtige Richtung. Aber ist noch unvollständig.

Nein, im vendor Verzeichnis wird nicht gearbeitet. Das ist ein generisches Verzeichnis.

Nein, dies geht in die falsche Richtung.

1 Like

In der Demo findest ein Modul für 4 und 6.