Revamp Webshop: Automatische Kurzbeschreibung

From revampedia

Die Kurzbeschreibung soll automatisch aus custom-fields erstellt werden.


Achtung: Auf der migrierten revamp-it Seite (auf flunder-web) zur Zeit nicht aktiv.

Da die Anpassungen in den Overrides bei jedem Joomla Update geprüft und evtl. erneuert werden müssen ist dies extrem mühsam (Stichwort: "maintenance hell"). In Zukunft könnte dies besser mittels eines Scripts, welches z.B. automatisch jeden Abend läuft, gelöst werden. Ein solches Script wäre eh nötig/sinnvoll um die bestehenden Artikel zu aktualisieren.

Lösungsmöglichkeiten

V1.

Bei der Ausgabe generieren.

(+) Ausgabe wird dynamische/automatische generiert (aktuelle Daten)

(---) Serverzeit zum erstellen, viele DB Abfragen etc.

(---) Code muss an verschiedenen Orten angepasst werden

V2.

Bei der Eingabe generieren und in der Datenbank als Kurzbeschreibung speichern.

(+) Keine Anpassung der Ausgabe nötig, diese ist automatisch überall richtig (Produktliste, einzelne Produkte etc.)

(-) Was geschieht mit bereits erfassten Artikeln ? --> diese werden im Laufe der Zeit angepasst, wir müssen eh alle Artikel nochmals überprüfen

V2 ist besser.

Funktionsweise / Verständnis

Innerhalb der Testumgebung: rochen:/var/www/revamp/jodir_ut/..

Das Backend verwendet die sogenannte "isis" template.

Für die Produkt-Editier Ansicht wurde bereits ein "template override" erstellt.

Wo ist dieses ?

caydin@rochen:/var/www/revamp/jodir_ut$ grep -r "neue Artikelnummer" *
administrator/templates/isis/html/com_virtuemart/product/product_edit_information.php:	[ \ ]
	echo ' neue Artikelnummer: ';include '/var/www/revamp/shop2csv/next_sku.php';?>
[ ... ]

BTW/Bemerkung: Wo werden doch gleich im Joomla Adm. die Overrides erstellt ? Auf Anhieb nicht gefunden...

--> Erweiterungen --> Template --> in der Spalte Template auf den Namen klicken

Die Kurzbeschreibung View findet sich somit unter:

/var/www/revamp/jodir_ut/administrator/templates/isis/html/com_virtuemart/product

in der Datei: product_edit_description.php

Dort wird sie ausgelesen mittels:

<textarea class="inputbox" name="product_s_desc"
 id="product_s_desc" cols="65" rows="3" >
    <?php echo $this->product->product_s_desc; ?>
</textarea>

Das Formular ist:

<form method="post" name="adminForm" action="index.php" enctype="multipart/form-data" id="adminForm">

Problem

Die Eingabe der Kurzbeschreibung und die Eingabe der Custom Fields erfolgt über dasselbe Formular. Daher ist es in der View nicht einfach so möglich die Kurzbeschreibung aus den Custom Fields zu erstellen.

Dies müsste somit nach dem Submit gemacht werden. Das Formular wird an index.php geschickt und was dann geschieht ist schwer nachvollziehbar... Irgendwann endet es wohl im Product Controller. Eine Anpassung von Controllers ist aber durch Overrrides nicht vorgesehen.

Es lassen sich dazu zwar einige Seiten finden, diese scheinen aber nicht wirklich aktuell:

http://stackoverflow.com/questions/28536095/joomla-how-to-override-component-controller Scheint zwei Lösungen anzubieten Es ist mir nicht klar wie diese im Detail funktionieren

"2. Add a special task to your view, and intercept it with a system plugin in OnAfterRoute(). You won't be touching the original controller, but your plugin will fire before the original controller, so it can take action, manipulate input and output, and eventually avoid invoking the original controller altogether."

--> https://docs.joomla.org/Plugin/Events/System#onAfterRoute

Wie wird ein "special task" zur view hinzugefügt ? onAfterRoute aktzeptiert keine Argumente und liefert keine zurück, wie werden damit Daten manipuliert ?

scheint ziemlich kompliziert / umständlich

rochen:/var/www/revamp/jodir_ut$ wc -l $(find .)

[ ... ]

  3074615 insgesamt

OMG

Lösung:

Die Kurzbeschreibung wird beim laden der Editier-Ansicht aus den custom-fields zusammengesetzt (und ins Formular eingetragen).

Bei einer Änderung der custom-fields muss zwei mal gespeichert werden, damit die Kurzbeschreibung wieder aktuell ist.

Umsetzung

Die Hauptsächlichen Anpassungen finden in der View statt: product_edit_description.php

Diese als Override ausgeführt:

<joomla root>/administrator/templates/isis/html/com_virtuemart/product/product_edit_description.php

Zur Entwicklung habe ich diese in ein Verzeichnis in meinem home auf rochen kopiert: ~/revamp-webshop/kurzbeschr-cust-fields/

Um diese dann jeweils wieder zurück ins Joomla Verzeichnis zu kopieren verwende ich folgendes Script.

./copyback:

#!/bin/bash
#
#

sudo -u www-data \
    cp product_edit_description.php \
    /var/www/revamp/jodir_ut/administrator/templates/isis/html/com_virtuemart/product/

Um bei der erzeugten Kurzbeschreibung einen Suffix einzufügen habe ich im custom-fields-plugin ein zusätzliches Feld eingefügt. Z.B. für die Angabe von Einheiten.

Dies ist direkt gemacht, unter: <joomla root>/plugins/vmcustom/param/

In den Dateien param.php und param.xml.

Eine Kopie der angepassten Plugin Dateien liegt auch noch in meinem home:

/home/caydin/revamp-webshop/kurzbeschr-cust-fields/plugins-vmcustom-param

Siehe source-code für weitere Details.

Anpassungen

2016-11-11 impl. prod.
2016-11-10 am testsystem gemacht

  • Leere custom-fields werden bei der kurzbeschreibung ausgelassen. Das nächste Feld aus der Reihenfolge wird verwendet (unter Selbsterstellte Felder --> Benutzerdef. Gruppe wählen --> Sortierung).
  • Enthält ein custom-field einzig den Wert "ja", dann wird der Title für die Kurzbeschreibung verwendet. (Title unter Wählen Sie ein Plugin, nicht der Titel zuoberst.)

2016-11-09

Trotz der Verwendung von Overrides macht es Sinn, die Änderungen an den Dateien möglichst gering zu halten. Da diese bei einem Update jeweils geprüft und allenfalls angepasst werden müssen. Daher habe ich den Hauptteil der Änderungen in die separate Datei autogen_shortdesc.php "ausgelagert". Diese Datei ist dann mittels include in der product_edit_description.php eingebunden.

2016-11-02, nach virtuemart Update

Nach update von Virtuemart können customfields in der Ansicht "Selbsterstellte Felder" nicht mehr gelöscht werden.

Behebung:

Es wurden alle product_edit... views im override erstellt (wahrscheinlich durch erstellung des override über den Joomla Admin.). Dadurch waren noch die alten views aktiv. Eigentlich genügt nur die oben erwähnte geändert Datei product_edit_description.php. (Die Datei product_edit_information.php wird für das anzeigen der nächsten Artikelnummer (Anp. F.W.) gebraucht.)

Anwendung

Wenn für ein Produkt Custom Fields gesetzt sind, unter: Produkt [Bearbeiten] --> Selbsterstellte Felder --> Benutzerdefinierter Feld-Typ

Wird eine automatische Kurzbeschreibung erzeugt.

Die Kurzbeschreibung kann dann nicht mehr von hand geändert werden und es erscheint der Hinweis:

Info: CUSTOMFIELDS VORHANDEN
Kurzbeschreibung wird automatisch erzeugt.
Achtung: Nach Änderung von Custom Fields zwei mal speichern.

Bei Änderungen der Customfields, muss zweimal gespeichert werden.

Beim ersten speichern wird die angepasste Kurzbeschreibung neu ins Formular geladen. Beim zweiten mal von dort aus in der Datenbank gespeichert. Wenn nur einmal gespeichert wird geht keine Information verloren, die erzeugte Kurzbeschreibung wird einfach noch nicht im Frontend angezeigt.

Wenn keine Custom Fields gesetzt sind kann die Kurzbeschreibung normal ausgefüllt werden und es erscheint der Hinweis:

Info: KEINE CUSTOMFIELDS VORHANDEN
Kurzbeschreibung eingeben oder Custom Fields erstellen.

Es werden die ersten fünf custom-fields verwendet (kann im code angepasst werden).

Geordnet werden diese unter: Selbsterstellte Felder (übersicht Links) --> Benutzerdefinierte Gruppe

Die Anzeige von einem Suffix bzw. einer Einheit in der Kurzbeschreibung kann in den custom-field Einstellungen definiert werden.

Z.B. unter: Selbsterstellte Felder --> Feld Cache --> Kurzbeschreibung Suffix/Einheit

Bei einem update des custom-field-plugins, müsste dieses wieder angepasst werden.

Fazit / Auswertung

Die ganze Anpassung ist ziemlich hacky und unschön.

Das Joomla Override System ist für einfache Anpassungen der Views sicherlich gut geeignet. Für weitergehende Anpassungen wie diese ist es aber nicht gedacht.

Das ganze System mit den Custom Fields ist extrem hacky, kompliziert, umständlich, unübersichtlich und unverständlich.

Generell sind Anpassungen wie diese wohl nicht zu empfehlen.