Zurück zur Übersicht

Aktuelle Angebote in OXID eShop - der Haken an der Sache

07.03.2017

Haken an der Sache

In OXID eShop ist es möglich, aktuelle Angebote automatisch ermitteln und z. B. auf der Startseite anzeigen zu lassen. Dazu gibt es zwei Möglichkeiten - entweder Sie stellen immer nur die neu ins Sortiment aufgenommenen Produkte dar, oder Sie stellen immer die Produkte dar, die zuletzt geändert wurden.

Ich denke, in der Praxis wird Letzteres häufiger verwendet. Wenn sich zu einem Produkt die Beschreibung ändert, ein neues Bild hochgeladen wird, der Preis angepasst wird oder Ähnliches, dann möchte man vielleicht genau auf dieses Produkt auch nochmal gezielt hinweisen.

By the way, weil ich das auch immer wieder suchen muss - hier können Sie das einstellen: Gehen Sie im OXID Backend auf Stammdaten → Grundeinstellungen, Tab Einstell. und dort auf den Punkt Artikel. Dort finden Sie die Option "Neueste Artikel nach dem Erstellungsdatum berechnen. (Ansonsten nach Datum der letzten Änderung)". Wenn Sie hier kein Häkchen setzen, werden die zuletzt geänderten Artikel als neueste geladen.

Nun hat die ganze Sache aber einen Haken.

Genau genommen sogar mehrere. Denn wenn ich Download-Produkte anbiete (so wie wir bei uns im Shop), und die Download-Datei, die am Produkt hängt, ändere, wird das Aktualisierungsdatum des Artikels nicht erneuert. Es wird also von OXID nicht als Änderung erkannt, obwohl das doch durchaus eine wichtige Änderung ist. Wenn ich bei uns die Download-Datei an einem Produkt (Modul) ändere, habe ich ja sozusagen ein Modul-Update hochgeladen, was man durchaus auf der Startseite sehen soll. Dasselbe gilt für Mediadaten - wir nutzen diese, um schon vor dem Kauf Zugriff auf unsere Modul-Dokumentationen zu geben. Doch auch die Aktualisierung dieser Dateien wird von OXID nicht als Änderung des Artikels erkannt.

Was mich aber noch viel mehr stört, ist, dass der Kauf eines Produkts von OXID als Änderung erkannt wird! Wenn man die Option der letzten Änderung auswählt und aktuelle Angebote automatisch von OXID ermitteln lässt, hat man immer auch die zuletzt gekauften Produkte in der Liste! Und das finde ich ungünstig bis kontraproduktiv, denn der Kauf hat das Produkt ja nicht wirklich verändert, und dass diese Produkte hier geladen werden, kann dazu führen, dass die tatsächlich geänderten (oder auch neu aufgenommenen) Produkte in der Liste ganz schnell untergehen.

Für diese Haken gibt es einen einfachen Grund: Das Änderungsdatum im Produkt (Timestamp) wird immer vollautomatisch erneuert, wenn eine Änderung in der Artikel-Tabelle (oxarticles) vorgenommen wird. Das steuert nicht OXID, sondern die Tabelle selbst (genauer gesagt die Datenbank) über ein CURRENT_TIMESTAMP. Wenn ich Download- oder Media-Dateien zum Artikel hochlade, wird die Tabelle oxarticles nicht verändert, da diese Daten in anderen Tabellen liegen. Deshalb wird auch der Timestamp nicht erneuert.

Wenn hingegen ein Produkt gekauft wird, so wird z. B. der Lagerbestand (oxstock) aktualisiert, und auch die Anzahl gekaufter Produkte (oxsoldamount) erhöht. Beides befindet sich in der Tabelle oxarticles, und die Änderung führt dazu, dass auch der Timestamp ganz automatisch erneuert wird.

Wen das stört, so wie mich, für den habe ich mir einen kleinen Workaround überlegt.

Nämlich auf der Datenbank den CURRENT_TIMESTAMP bei Update für die Tabelle oxarticles zu entfernen, um dann die Aktualisierung dieses Datums komplett von OXID vornehmen zu lassen.

Dazu gehen Sie auf die Datenbank (phpMyAdmin). Sie können den SQL-Befehl auch unter Service -> Tools ausführen, was ich aber nicht empfehle, weil Ihnen dort die Kontrollmöglichkeiten fehlen. Führen Sie folgenden Befehl aus, um die Auto-Aktualisierung zu entfernen:

ALTER TABLE `oxarticles` CHANGE `OXTIMESTAMP` `OXTIMESTAMP` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Timestamp'

Da OXID die Spalte beim Update in aller Regel nicht verändert, dürfte diese Änderung relativ updatesicher sein.

Nun wird die letzte Aktualisierung nicht mehr automatisch von der Datenbank eingetragen. Das heißt, wir müssen das in Zukunft selbst tun. Die einfachste Möglichkeit ist, sich direkt an die save() Methode des Objekts oxarticle anzudocken. Dort kommt OXID immer vorbei, wenn der Artikel geändert wird. Wir wollen dann aber nicht jedes Mal den Timestamp erneuern (dann hätten wir ja nix gewonnen), sondern nur, wenn wir uns im Admin-Bereich befinden. Ich gehe mal davon aus, dass sämtliche Änderungen am Produkt aus dem Admin-Bereich heraus als Änderung erkannt werden sollen.

Wollen Sie es noch feingliedriger haben, werden Sie nicht darum herum kommen, die einzelnen save() Methoden der Admin-Controller zu erweitern. Aber das geht jetzt an dieser Stelle zu weit.

Wir erstellen uns also ein kleines Modul und erweitern die Klasse oxarticle. Diese sieht dann jetzt wie folgt aus:

class my_own_oxarticle extends my_own_oxarticle_parent
{
    public function save()
    {
        if ($this->isAdmin()) {
            $this->oxarticles__oxtimestamp = new oxField(date('Y-m-d H:i:s'));
        }
        parent::save();
    }
    
    protected function _skipSaveFields()
    {
        parent::_skipSaveFields();
        unset($this->_aSkipSaveFields[array_search('oxtimestamp', $this->_aSkipSaveFields)]);
    }
}

Die Methode save() setzt den Timestamp auf die aktuelle Zeit, bevor die eigentliche save()-Methode der Elternklasse aufgerufen wird. Dazu muss oxtimestamp aus dem Objekt-Attribut $_aSkipSaveFields entfernt werden. In diesem Array hat OXID alle Felder gesetzt, die aus Sicherheitsgründen nicht gespeichert werden dürfen. Da wir aber oxtimestamp jetzt nicht mehr automatisch berechnen lassen, müssen wir diesen Eintrag dauerhaft entfernen.

Damit haben wir sogar gleich noch zwei weitere Fliegen erlegt. Denn sowohl beim Download- als auch beim Media-Datei-Upload wird die save() Methode des Artikel-Objekts aufgerufen, und da wir dort nun immer den Timestamp aktualisieren, wird dieser an der Stelle dann tatsächlich auch geändert.

Voilá.

Vielleicht gibt es weitere Aspekte bei der Aktualisierung von Artikeln, die ich hier übersehen habe. Wenn Ihnen etwas einfällt, freue ich mich über Ihren Kommentar. Und wenn großes Interesse besteht, wäre ich sogar geneigt, die Anpassungen als kostenloses Mini-Modul zur Verfügung zu stellen :)

Kategorien: Pimp your Shop | Schlagworte: Neueste Produkte, OXID Tutorial, Verkaufsförderung, Workaround

Lust auf mehr?

Grips-Letter abonnieren und nichts mehr verpassen.

Der Grips-Letter erscheint alle 1 - 2 Wochen. Du kannst dich jederzeit wieder abmelden. Deine Daten werden nicht weiter gegeben. Hier erfährst du mehr über den Grips-Letter. Hier findest du unsere Datenschutzerklärung.

Beitrag kommentieren

Wie alle anderen Websites verwendet auch unsere Cookies. Wenn du unsere Website verwendest, stimmst du dem zu.

Folgende Cookies zulassen:

Alle akzeptieren

Mehr Infos


Welche Cookies werden gesetzt?

Notwendig
PHPSESSID Behält die Einstellungen der Seite des Benutzers bei allen Seitenanfragen bei.
robin_marketing_popup Sorgt dafür, dass das Marketing-Popup nicht bei jedem Seitenwechsel erneut aufpoppt.
dwa_cookie_noticed Speichert die Einwilligungen zu den Cookies für ein Jahr. Dieser Cookie kann zurückgesetzt werden, wenn die Einwilligung entzogen werden soll.
Statistik
_pk_id Matomo - Cookie zum Speichern einiger Details über den Benutzer, z. B. der eindeutigen Besucher-ID (anonymisiert), notwendig zum Zählen wiederkehrender Besucher. - Speicherdauer 13 Monate
_pk_ses Matomo-Cookie zur Speicherung Sessionabhängiger Nutzerdaten - Speicherdauer 30 Minuten