Ich entwickle und entwickelte in den letzten Tagen und Wochen einige Plugins rund um den neuen JTL Shop 3. In diesem Zusammenhang braucht man als Entwickler oftmals Debug Möglichkeiten, die über ein schnödes var_dump hinausgehen. Speziell bei der Pluginentwicklung für den JTL Shop wird man oft mit komplexen Objekten und Arrays konfrontiert, die bei einer var_dump Ausgabe den kompletten Bildschirm füllen.

Im Laufe eines anderen Projektes habe ich mir angewöhnt, für schnelle Debug Ausgaben in PHP dBug zu nutzen. Die Verwendung ist denkbar einfach. Anstelle eines var_dump($meineVariable); nutzt man nach inkludieren der dBug.php einfach new dBug($meineVariable);. Ein mögliches Ergebnis (hier eine MySQL Result Ausgabe) sieht man im nebenstehenden Bild. Mehr davon auf der dBug Beispielseite.

Natürlich liegt es nahe, das inkludieren von dBug auch als JTL Plugin anzubieten. Hier ist es also:

PHP dBug for JTL Shop 3 Plugin (6.3 KiB)

Einmal aktiviert können Entwickler nun auch menschenlesbare Ausgaben erzeugen ;o) Einfach mal mit new dBug($oPlugin); ausprobieren.

Getestet habe ich das Plugin unter der JTL Shop Version 3.10 – aufgrund seiner Einfachheit sollte es aber auch in älteren Versionen funktionieren.

Erst vor einigen Wochen habe ich das gleiche Problem im JTL Shop 3 via Plugin gelöst. Nun die gleiche Anforderung in einem xtcModified: verschiedene Seiten im Onlineshop sollen komfortabel per CSS im Design angepasst werden. Ein Beispiel: Produktseiten in einer Kategorie „Garten“ sollen über einen grünen Hintergrund verfügen, solche in der Kategorie „Technik“ über einen blauen.

Was dabei auch beachtet werden soll ist die Kategoriestruktur: die Unterkategorien in „Technik“ sollen bspw. weiterhin über einen blauen Hintergrund verfügen, optional aber individuell anpassbar sein.

Ein Weg ist das Setzen des class Attributes im body Tag des Dokuments. In einem xtcModied (und sicher auch in jedem anderen xt:Commerce oder xt:Commerce Fork) können wir dies in 2 Schritten erreichen. Leider müssen wir erneut in die Kern des Systems eingreifen.

1. CSS Fragment erstellen

In includes/application_top.php nach folgendem Fragment suchen:

if (xtc_not_null($cPath)) {
	$cPath_array = xtc_parse_category_path($cPath);
	$cPath = implode('_', $cPath_array);

Danach einfügen:

// BOF cPath to CSS
foreach($cPath_array as $cPath_item)
{
	$cPath_css .= "cat_" . $cPath_item . " ";
}
$cPath_css = trim($cPath_css);
// EOF

Damit wird ein String der Art „cat_61 cat_6“ erzeugt, den wir nun noch als Wert des class Atributes des body Tags setzen.

2. class Attribut im body

In includes/header.php folgende Code suchen:

if (strstr($PHP_SELF, FILENAME_POPUP_IMAGE )) {
echo '<body onload="resize();"> ';
} else {
echo '<body>';

Und mit folgendem Code ersetzen:

// BOF cPath to CSS
if (strstr($PHP_SELF, FILENAME_POPUP_IMAGE )) {
echo '<body class="' . $cPath_css . '" onload="resize();"> ';
} else {
echo '<body class="' . $cPath_css . '">';
}
// EOF

Das Ergebnis

Mit diesen Schritten erhalten wir folgenden öffnenden body Tag in der Kategorieansicht einer Kategorie mit der ID 23 und der Elternkategorie mit der ID 1:

<body class="cat_1 cat_23">

Selbiges gilt für Produktseiten in dieser Kategorie.

JTL Shop 3 ist ein noch recht junges Shopsystem aus dem Hause JTL. Neu in Version 3 ist ein ordentliches Plugin System, das quasi beliebige Erweiterungen des Shopsystems ermöglicht (hier hatte ich bereits über JTL Shop Plugins geschrieben).

JTL Shop Plugins bei Kreativkonzentrat.de

Im Zuge des Updates eines JTL Shop der Version 2.19 habe ich mich an ein erstes Frontend Plugin gewagt. Auch um gleich die Idee hinter der Pluginarchitektur zu lernen und zu verstehen. Herausgekommen ist das Plugin Category Classes.

Gleich zu Download und Changelog

Kategorie Klassen

Die Idee hinter dem Plugin: jede Kategorie soll separat per CSS Selektor ansprechbar sein. So kann man per CSS das Look and Feel jeder Kategorie im Shop individuell gestalten. Triviales Beispiel: eine Kategorie „Garten“ kann mit grünen Hintergrundbild versehen werden, die Kategorie „Möbel“ eher in brauner Holzoptik.

So weit so gut. Im Zusammenspiel von JTL WaWi und JTL Shop können wir dies bereits mit dem Kategorieattribut „css_klasse“ behandeln. Dieses Plugin nimmt uns schlicht die Arbeit ab und setzt den Namen der Kategorie als class Attribut des body Tags der Produkt- und Kategorieseiten.

Konkret Beispiele

Ich greife obiges Beispiel auf. Folgende Kategoriestruktur ist gegeben:

  • Garten
    • Beete
    • Zubehör
  • Möbel
    • Betten
    • Zubehör

Die Kategorieseite Garten->Beete und die Seite eines Produktes in Garten->Beete hat nun folgenden öffnenden Tag:

<body class="[...] beete garten"/>

Die Kategorieseite Möbel->Betten und die Seite eines Produktes in Möbel->Betten hat nun folgenden öffnenden Tag:

<body class="[...] betten moebel"/>

Umlaute werden entsprechend ersetzt. Bestehende Werte im class Attribut werden nicht überschrieben, sonder bleiben erhalten. Die neuen Klassen werden nur hinzugefügt.

Zusätzlich habe ich eine Option eingebaut, die auch die Kategorieliste des Themes JTL-Shop3-Tiny derart abändert, dass die Kategorienamen als class Attribute der li Tags gesetzt werden. Eine Kategorieliste würde nun wie folgt aussehen:

<div class="sidebox_content">
<ul class="categories">
<li class="node active garten">
<a [...]><span>Garten</span></a><ul class="subcat">
<li class="first beete"><a [...]><span>Beete</span></a></li>
<li class="zubehoer"><a [...]><span>Zubehör</span></a></li>
</ul>
<!-- / subcat -->
</li>
<li class="node moebel">
<a [...]><span>Möbel</span></a><ul class="subcat">
<li class="first betten"><a [...]><span>Betten</span></a></li>
<li class="zubehoer"><a [...]><span>Zubehör</span></a></li>
</ul>
<!-- / subcat -->
</li>

Die Option ist standardmäßig deaktiviert und kann in der Plugin Konfiguration aktiviert werden.

Changelog

Changelog Version 1.02 – 26.10.2011

Alle Änderungen in diesem Blogpost.

Changelog Version 1.01 – 11.03.2011

Tausend Dank an Maik Waffen, der maßgeblich zu dieser Version beigetragen hat!

  • neue Einstellung: Möglichkeit, nur Rootkategorien als Klassen zu schreiben (Beispiel: bei Möbel -> Zubehör wird in Zubehör nur moebel zum class Attribut hinzugefügt)
  • Bugfix: alle unerlaubten Sonderzeichen werden aus den class Attribut entfernt
  • neue Einstellung: Ersetzungsregeln der Form ö,ä,ü:oe,ae,ue können festgelegt werden. Ersetzt bspw. ö mit oe, bevor diese als unerlaubte Sonderzeichen aus dem Klassennamen entfernt werden

Download

Nach langer Vorrede nun das Plugin als ZIP.

Category Classes JTL Shop 3 Plugin
Category Classes JTL Shop 3 Plugin
category_classes_101.zip
Version: 1.01
5.2 KiB
2036 Downloads
Details...

Getestet wurde das Plugin übrigens mit JTL Shop 3.07, also der aktuell vorliegenden Version. Die Installation läuft wie jedes JTL Shop 3 Plugin:

  1. Zip-Datei lokal entpacken
  2. den entpackten Ordner category_classes per FTP hochladen nach [shoproot]/includes/plugins/
  3. Plugin-Installation im JTL Shop Backend unter Plugins->Pluginverwaltung
  4. Konfiguration der Plugin Optionen unter Plugins->Plugins->Category Classes

Für ein Update einfach mit dem aktuellen Installationspaket den Ordner der alten Version überschreiben. Im Backend dann via Pluginverwaltung das Update durchführen. Vorsicht: die Einstellungen werden bei einem Update zurückgesetzt!

Natürlich freue ich mich über Feedback. Auch Feature Request können in den Kommentaren auf mich losgelassen werden :o)

In der nächsten Woche steht bei einem Kunden (Onlineshopbetreiber) ein Besuch von (hoffentlich netten) Finanzbeamten an. Der Grund: es steht eine Steuerrückzahlung ins Haus. Natürlich muss da mal genauer geprüft werden, ob es bei uns auch mit rechten Dingen zugeht ;)

Aus diesem Grund gleich mal altbekannte Quellen zu Pflichtangaben auf Rechnungen gesichtet und unsere Vorlagen gegen geprüft.

Was gehört denn so auf eine Rechnung?

  • den vollständigen Namen und die Anschrift des Rechnungsstellers
  • den vollständigen Namen und die Anschrift des Rechnungsempfängers
  • das Datum
  • die Steuernummer des Rechnungsstellers oder seine Umsatzsteuer-Identifikationsnummer
  • eine fortlaufende Rechnungsnummer
  • die Menge und Art der gelieferten Ware oder Leistung
  • der Zeitpunkt oder Zeitraum der Lieferung
  • eventuelle zuvor vereinbarte Nachlässe (Rabatt / Skonto)
  • die Höhe der mit dem jeweiligen Steuersatz anfallenden Steuer
  • wenn die Rechnung Waren oder Dienstleistungen mit unterschiedlichen Umsatzsteuersätzen enthält, müssen Sie für die einzelnen Posten den jeweiligen Steuersatz angeben

gekürzt, Quelle: Pflichtangaben auf Rechnungen vom 18.11.2010

Und digital?

Das steht im genannten Fall als nächstes an: elektronischer Rechnungsversand. Das Mittelstandswiki bietet hierzu erste Informationen und auch die aktuelle Internet World Business widmet sich dem Thema. Auf eine kostenfreie Quelle für die elektronische Rechnungsabwicklung wird im Artikel aufmerksam gemacht.

Die Informationsreihe „Elektronische Rechnungsabwicklung“ soll insbesondere kleinen und mittleren Unternehmen helfen, das Thema für sich richtig einzuschätzen und Hilfestellungen bei einer möglichen Einführung geben. Die Informationsreihe ist Teil eines Projekts, das im Rahmen des vom Bundesministerium für Wirtschaft und Technologie (BMWi) geförderten Netzwerks Elektronischer Geschäftsverkehr (NEG) durchgeführt wird.

Der erste Teil der Informationsreihe enthält grundlegende Informationen über die Voraussetzungen zur Nutzung der elektronischen Rechnungsabwicklung sowie einen Überblick über in Deutschland verfügbare Lösungen.

Zur Downloadseite der Marktübersicht

Nach einiger Zeit wieder ein kleiner Codeschnipsel für die JTL Warenwirtschaft hier. Hintergrund sind die eher beschränkten Möglichkeiten in der mir zugrunde liegenden JTL WaWi Version 0.99711 betreffend Inventurlisten.

Zwar bietet JTL seit kurzem die Möglichkeit, mittels externem Exporttool (JTL Ameise) teilweise komplexe Artikellisten in CSV Dateiformate zu exportieren, was dabei aber fehlt ist das Feld „Lagerort“. Auch die in der JTL WaWi integrierte Funktion zur Erstellung von Inventurlisten (Menu Artikelverwaltung -> Inventur) ist suboptimal, da sie nur den Druck oder Export als PDF vorsieht.

Möchte man eine CSV und im weiteren Verlauf eine editierbare Excel Tabelle zur Inventur nutzen (beispielsweise um den aktuellen Lagerbestand einzutragen und sofort nach Inventur automatisiert in den Datenbestand zu übernehmen), benötigen wir also einen eigene Lösung. An dieser Stelle mein Vorschlag in Form einer SQL Anfrage:

SELECT lo.cName as Lagerort, a.cArtNr as Artikelnummer, a.cName as Artikelname, a.cBarcode as EAN, a.nLagerbestand as Lagerbestand FROM (tartikel a LEFT OUTER JOIN tArtikelLagerOrt l ON (l.kArtikel = a.kArtikel)) LEFT OUTER JOIN tlagerort lo ON (l.kLagerOrt = lo.kLagerOrt)

Man kann dieses Script in diversen MS SQL Server Management Lösungen verwenden, oder die Anfrage direkt auf die Datenbank loslassen. Ich selbst habe das Snippet in eine eigene Toolsammlung für die JTL WaWi eingebunden.

Erzeugt wird durch die Anfrage eine Ergbnistabelle der Art:

Lagerort Artikelnummer Artikelname EAN Lagerbestand
A10 1234 Testartikel 1 10
A20 1234 Testartikel 1 10
A20 5678 Testartikel 2 0
999 Testartikel 3 10

Wie in der kleinen Beispielliste zu sehen, deckt das Script auch folgende Möglichkeiten in einer Inventurliste ab:

  • ein Artikel kann verschiedene Lagerorte haben
  • an einem Lagerort können verschiedene Artikel hinterlegt sein
  • Artikel können auch keinen Lagerort haben

Und nach der Inventur?

Wie oben beschrieben ist der Import aus dem erstellten CSV Format logisch der nächste Schritt. Diese Anforderungen muss ich aber derzeit noch nicht erfüllen. Ich hoffe bis dahin hat JTL ein besseres Handling der Inventur in die JTL Ameise integriert.

Optimierung?

Ich bin bei weitem kein Profi im Bereich SQL. Daher hier die obligatorische Warnung, diese Anfrage bitte an einem Testsystem zu probieren, auch wenn ich nur lesend auf die Datenbank zugreife. Ideen zur Optimierung oder Erweiterung diskutiere ich gerne in den Kommentaren!

EAN Barcode erstellt mit tec-it.comEAN stand ursprünglich für European Articel Number und wird heute im internationalen Handel genutzt, um Produkte über die Grenzen einzelner Hersteller hinweg eindeutig zu bezeichnen.

Shopbetreiber kennen EANs meist nur aus Artikel- und Preislisten, die von Produzenten gestellt werden und / oder aus der Pflege des eigenen Datenbestandes. In diesen Fällen muss man nichts Näheres über den Hintergrund einer EAN wissen. Wenn ein Shopbetreiber jedoch selbst zum Produzenten oder Zwischenhändler wird, muss er sich etwas näher mit der Materie beschäftigen: EANs müssen häufig codiert (Strichcodes) in Händlerkataloge oder auf Produktetiketten gedruckt werden. Aber der Reihe nach …

EANs werden über Vergabestellen in Kontingenten an Firmen verteilt. Hiesige Händler finden im Servicebeitrag 4 Schritte zum Barcode eine gute Anleitung der deutschen Vergabestelle GS1 Germany zur Vergabe der GLN und schließlich einzelner GTINs / EANs:

Mit der Basisnummer Ihrer GLN können Sie auch GTIN-Nummern (Global Trade Item Numbers) erstellen, die im EAN-Strichcode der überschneidungsfreien Kennzeichnung Ihrer Produkte dienen.

In den letzten Schritt – der Erstellung eines EAN Strichcodes / Barcodes – möchte ich mich einklinken und 4 Alternativen zur EAN / GTIN Barcode Erstellung aufzeigen.

2 kostenfreie Onlinegeneratoren für EANs

Wer nach der Investition für die GS1 Germany etwas sparen möchte, kann auf einige kostenfreie Online-Tools zur Barcodeerstellung zurückgreifen.

Der Online Barcode Generator von Terry Burton bietet dabei eine breite Masse von Standards und ermöglicht das Erstellen von Barcodes in den Formaten EPS, BMP, JPEG, PNG und TIFF. Zur Konfiguration der Ausgabe könne diverse Optionen angewendet werden.

EAN Barcode aus Barcodewriter Online Tool
Wer es einfacher mag ist mit den Barcode Generatoren von Tec-it.com gut beraten. Diese exportiert zwar „nur“ GIF, JPEG und PNG, erzeugt aber durch einen frei wählbaren DPI Wert auch EAN Barcodes, die für den Druck geeignet sind. Etwas umständlich ist die Navigation hin zu dem EAN Generator: hierzu im obigen Link in der mittigen die rot umrandete Box mit „EAN/UPC auswählen“.

2 Excel Plugins für EANs

Wer dutzende oder hunderte EANs zu Barcodes umwandeln muss (beispielsweise für Händlerpreislisten oder Kataloge) kommt mit den freien Tools zwangsläufig ins Schwitzen: das händische Erstellen der Barcodes dauert nicht nur sehr lange, es können sich auch Fehler bei der Arbeit einschleichen.

Fall die Produktlisten in Excel vorliegen sind hier Excel Plugins bzw. AddIns hilfreich: über Formeln der Art =ean13(1337133713378) und mitgelieferte Barcode Schriftarten werden Barcode-Grafiken in einer Tabellenzelle erzeugt. Einziger Nachteil dieser zeitsparenden und eleganten Lösungen: sie sind leider nicht kostenlos zu haben. Die Preise sind aber überschaubar.

Bei Tec-it.com ist eine Einzelplatzlizenz eines solchen Excel AddIns bereits für 84 Euro zu haben. Die Barcode Font – EAN 13 PC Suite von Fontware bietet für 93 Pfund neben ein Excel AddIn auch ein Standalone Tool, Plugins für weitere Anwendungen (Access und Crystal Reports) und mit einer eigenen DLL sogar eine dokumentierte Schnittstelle für Eigenentwicklungen.

Beide kostenpflichtige Lösungen bieten dabei Testversionen an. Einem ausgiebigem Test vor dem Kauf steht also nichts im Wege.

Ein scheinbar häufiger Fehler bei xt:Commerce und xtcModified Shops, die über eine große Anzahl von Attributen und Attributwerten für Artikel verfügen: Produktattribute, die im Adminbackend angelegt werden, werden nach dem Speichern eben nicht gespeichert. Eine Fehlermeldung bleibt dabei meist aus, das neu zugewiesene Attribut wird einfach nicht übernommen.

Dies hängt zumeist mit Standardeinstellung der suhosin bei Hostern wie Strato oder Hosteurope zusammen. Zumindest bei Hosteurope kann man diese Einstellungen via .htaccess überschreiben und so dem Fehler Herr werden. Folgendes Codesnipet in die eigene .htaccess einbinden:

php_value suhosin.post.max_array_depth 0
php_value suhosin.post.max_array_index_length 0
php_value suhosin.post.max_vars 0
php_value suhosin.request.max_array_depth 0
php_value suhosin.request.max_array_index_length 0
php_value suhosin.request.max_vars 0

Nach Aussagen des Hosteurope Supports funktioniert dieses Vorgehen nur

solange im KIS ( Administration > Webhosting > 1056521 > Skripte > Skript-Einstellungen ) unter „RPG Max Vars“ nicht „Erweitert“ ausgewählt ist.

Weitere Quellen

Für den Test der neuen JTL Shop Version stand das Aufsetzen einer Testumgebung an. Um den neuen JTL Shop 3 mit Daten aus dem Produktivsystem zu füllen, muss ein Komplettabgleich (WaWi -> Shop) durchgeführt werden. Da ich die produktive JTL WaWi bei solchen Tests gerne außen vor lasse, musste ich die Warenwirtschaft spiegeln, um dann sicher auf einem aktuellen Datenbestand zu arbeiten.

Dabei traten Probleme beim Import der vorher exportierten Datenbasis aus der JTL WaWi 0.99711 auf: wollte ich das vorher erstellte Backup Datei via WaWi Menu importieren, kam es zu folgende Fehlermeldung:

SQL Error -1 preforming exec
SQL State = 00000
SQL Message = Src:Exec Direct

Dabei war es egal, ob die JTL WaWi mit einem Microsoft SQL Server 2008, SQL Server Express 2005 oder 2008 lief. Irgendetwas klemmte. Letztendlich konnte ich das Backup doch auf einem SQL Server Express 2005 aufspielen, und zwar „nativ“ unter Mithilfe des osql.exe Dienstprogrammes. In der Kommandozeile folgendes eingeben:

osql.exe -D eazy -U sa -P [your sa password] -d master -Q "restore database eazybusiness from disk='[path to *.BAK]' with replace"

Die Platzhalter […] natürlich mit den entsprechenden eigenen Daten ersetzen. Es versteht sich von selbst, das man bei dieser Anweisung Vorsicht walten lässt (with replace): bitte nicht auf produktiven Servern / Datenbanken einsetzen.

Ich nutze vornehmlich Firebug und Notepad++ (auch npp ode NotepadPP) für die Entwicklung von kleineren Webprojekten. Notepad++ ist ein freier und mächtiger Editor für Windows und bringt das Plugin NppFTP mit, was das Editieren von Dateien direkt via FTP Verbindung ermöglicht.

„Live“ wird von mir meist nur auf einem Testsystem editiert, ab und an kommt aber auch mal ein (vermeintlich) ungefährlicher Eingriff am Produktivsystem vor.

Versteckte Dateien und Notepad++

Legt man in Notepad++ ein neues FTP Profil an, werden in der anschließenden FTP Session versteckte Dateien (bspw. eine .htaccess) standardmäßig ausgeblendet. Hinzu kommt noch, dass entfernte Dateien ohne Prompt überschrieben werden. Das geschieht natürlich auch, wenn eine neue versteckte Datei via Notepad++ am Server erstellt wird. Eine Sicherung der Serverdateien erstellt Notepad++ / NppFTP vor Synchronisierung nicht. Das Alles kann durchaus zum Problem werden.

Man stelle sich nun folgendes Szenario vor

  1. Wir vergessen alles aus dem vorherigen Abschnitt.
  2. Wir sollen ein bereits vorhandenes Projekt bearbeiten, erstellen hierzu ein neues FTP Profil in Notepad++ und legen los.
  3. Wir wollen „mal schnell“ etwas in der .htaccess am Server abändern.
  4. Uns fällt auf, dass der Server bisher gar keine solche besitzt, wundern uns nur kurz darüber und erstellen eine neue .htaccess am Server.

Was haben wir vergessen?

Erstens: den oben genanntem Punkt zu versteckten Dateien. Zweitens: das Backup. Oder umgekehrt ;o) Denken wir uns noch Folgendes hinzu, ist der GAU perfekt:

  • Es handelt sich beim Projekt um eine Eigenentwicklung, also kein bekanntes CMS.
  • Es existiert keine bekannte Konfigurationsoberfläche für den Webserver.
  • Es sind keine Backups vorhanden oder zugänglich.

Das Ergebnis ist nun mit ziemlich hoher Wahrscheinlichkeit eine „gecrashte“ Webseite und viele Bauchschmerzen, nicht nur auf Kundenseite. Muss nicht sein …

Was lernen wir daraus?

Wer auf Notepad++ nicht verzichten mag: den Editor nicht am Produktivsystemen einsetzen. Zumindest nicht ohne vernünftige Backuplösung (hier können auch automatisierte Onlinetools einspringen). Zusätzlich: an versteckte Dateien denken.

Gute freie Alternativen zu Notepad++ unter Windows sind mir nicht bekannt. Wer andere Tools nutzt oder Vorschläge hat kann diese gerne in den Kommentaren hinterlassen :o)

Schließlich: versteckten Dateien in Notepad++ sichtbar machen

Unter den Profilsettings im NppFTP Fenster im jeweiligen Profil im Reiter FTP Misc. den LIST Parameter -al eintragen (Notepad++ Version 5.7).

Vor gut einer Woche habe ich diese Liste von Shopverzeichnissen (im Grunde Webkataloge, die sich vornehmlich auf Einträge von Onlinehändlern beschränken) zusammengestellt. Für neue und kleinere Onlineshops dürften einige der hier vorgestellten Verzeichnisse durchaus als Linkquellen interessant sein.

Shopverzeichnis Alexa Rank PR Anmeldung Kommentar
andoo.de 71.330 7 Link ?jumpshop=…
shopvote.de 88.528 3 Link Bewertungsportal, go.php?
mallux.de 128.173 4 Link
onlineshops-finden.de 141.347 3 Link shoplink.php?
eshopinfo.net 245.455 4 Link Link in Form via Action
online-shops.in 329.975 3 in Kategorien
shoplister24.de 398.679 3 Link
shop-searcher.de 477.221 3 Link
cybermag.de 481.685 3 Link
shoppinglotse.de 544.157 4 Link Backlinkpflicht, nofollow
divadeo.de 593.947 3 Link Emailmarketing für Eintrag
onlineshopverzeichnis.de 637.276 3 Link auch „normaler WK“
perlink.de 816.289 3 Link nofollow
osede.de 853.793 3 Link nofollow
onlineshop-eintragen.com 1.101.898 3 Link Backlinkpflicht
listit.de 1.122.379 3 Link nofollow
produktmarkt.de 1.146.771 3 Link
onlineeinkaufszentrum.info 1.461.558 3 in Kategorien
shop-a-z.com 1.470.573 2 Link
dsvz.de 1.473.362 3 Link ladeextern.php?
buyingermany.de 1.810.232 3 Link
1a-webshops.de 2.113.777 2 Link
shops-katalog.de 2.486.524 2 Link
shopchart.de 4.439.622 3 Link Backlinkpflicht
schnaeppchen-atlas.de 6.724.887 3 Link verweis.cgi?…

Man beachte die Kommentare in den jeweiligen Zeilen: einige Shopverzeichnisse maskieren die ausgehenden Links zum eingetragenen Onlineshop (siehe letzter Post zu Preisvergleichen). Andere nutzen gleich nofollow. Bei diesen Vertretern sollte man überlegen, ob ein Eintrag der Mühe wert ist.

Lässt man die zweifelhaften Verzeichnisse außer Acht, erhält wir mit dieser Liste immerhin noch 15 solide Links für Onlineshops. Und das bei überschaubarem Aufwand.

Über Ergänzungen in den Kommentaren würde ich mich natürlich freuen.