rechtstexte für onlineshop
Neuigkeiten
  • Die modified eCommerce Shopsoftware ist kostenlos, aber nicht umsonst.
    Spenden
  • Damit wir die modified eCommerce Shopsoftware auch zukünftig kostenlos anbieten können:
    Spenden
  • Thema: Artikel aus Unterkategorien anzeigen - Kategorie-Ausnahmen ermöglichen?

    voodoopupp

    • Fördermitglied
    • Beiträge: 1.852
    • Geschlecht:
    Generell ist die Funktion "Artikel aus Unterkategorien anzeigen" ja recht praktisch.
    Dennoch macht es dann hin und wieder mal weniger, weil man die Kategoriepfade einfach unpraktisch getrennt hat oder aber einfach die Kategorien nicht überall getrennt sind.

    Doofes Beispiel:
    einmal hat man unter der Überkategorie Kopfbedeckungen diese Unterkategorien: Stirnbänder, Mützen und Schals.
    Da dürfen alle Artikel in der Übersicht gerne zusammen gezeigt werden. Die sind ja auch nicht zwingend nach Geschlechtern trennbar.

    Dann hat man aber in einer anderen Ecke des Shops Boxershorts, Stringtangas und Negligees unter dem Reiter Unterwäsche. Nun hat man im Shop aber 1000 Negligees und Tangas, aber nur 20 Boxershorts. Da ist das Ergebnis in der Überkategorie etwas arg weiblich bestimmt :D

    Wenn man nun also manuell eine bessere Mischung dort anzeigen lassen möchte oder aber nur ausgewählte Artikel, klappt das nicht. Denn durch die Einstellung im Backend werden in jeder Kategorie alle Artikel der Unterkategorien angezeigt, auch wenn man hier manuell Artikel reinverlinkt hat.

    Nun bin ich auf der Suche nach einer Möglichkeit, bestimmte Kategorien davon auszunehmen, so dass hier wirklich nur die verlinkten Artikel angezeigt werden.

    Artikel einfach in die Überkategorien zu verlinken und den Schalter im Backend rauszunehmen ist nicht zielführend, da das extrem aufwendig wäre dies dauerhaft für jede Kategorie durchführen zu müssen - und eben auch bei 95% der Fälle gut funktioniert.

    Hab ja stark die /includes/modules/default.php im Verdacht, dort kommt diese Stelle vor:

    Code: PHP  [Auswählen]
    if (CATEGORIES_SHOW_PRODUCTS_SUBCATS == 'true') {
    ...

    Nur leider habe ich dort nicht das gewünschte hinbekommen, versuche mich wohl wie immer an den falschen Dingen bzw. an den falschen Stellen  :lol:

    Würde mich über Ideen freuen :)

    Viele Grüße
    Dominik

    Linkback: https://www.modified-shop.org/forum/index.php?topic=42825.0

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.743
    • Geschlecht:
    Die von dir genannte Konstante wird noch an anderen Stellen benutzt.
    Update-sicher geht es leider auch nicht.

    Wenn du's unbedingt benötigst könntest du Folgendes machen:
    In /inc/xtc_get_subcategories.inc.php  suchst du das
    Code: PHP  [Auswählen]
          $join = " AND trim(cd.categories_name) != '' ";
          $conditions .= " AND c.categories_status = 1 ";
          $conditions .= CATEGORIES_CONDITIONS_C;

    und machst daraus das
    Code: PHP  [Auswählen]
          $join = " AND trim(cd.categories_name) != '' ";
          $conditions .= " AND c.categories_status = 1 ";
          $conditions .= $my_excluded_sub_cats != '' ? " AND c.categories_id NOT IN(".$my_excluded_sub_cats.")" : ''; //exclude some catagories, voodoopupp
          $conditions .= CATEGORIES_CONDITIONS_C;

    $mey_excluded_sub_cats  mußt du noch irgendwo definieren und der wert der Variablen muß das Format haben
    Code: PHP  [Auswählen]
    $my_excluded_sub_cats = 'X,Y,Z';

    wobei X,Y,Z die auszuschließenden Kategorie-IDs sind.

    Entweder du definierst es direkt in der Funktion, z.B. unter
    Code: PHP  [Auswählen]
        $conditions = '';

    oder du legst dir eine Konfigurations-Möglichkeit in z.B. Konfiguration => Artikel Listen Optionen an und benutzt dann die Konstante im Code.
    Bei Verwendung der Konstanten, die den Vorteil hätte, daß du die nicht zu berücksichtigenden Kategorie-IDs später mal ohne Code-Eingriff im Backend leicht anpassen könntest, sollte man die Werte noch absichern à la:
    Code: PHP  [Auswählen]
        $conditions = '';
        $my_excluded_sub_cats = DEINE_KONSTANTE != '' ? array_map('intval', explode(',', DEINE_KONSTANTE)) : '';
     
    Um die Konfigurations-Möglichket zu bauen müsstest du ein wenig Aufwand betreiben, da du dafür einen MySQL-Befehl absetzen müsstest à la
    Code: SQL  [Auswählen]
    INSERT INTO configuration (configuration_id, configuration_key, configuration_value, configuration_group_id, sort_order, last_modified, date_added, use_function, set_function) VALUES (NULL, 'DEINE_KONSTANTE', '', 8, 11, NULL, NOW(), NULL, NULL);

    und dazu in PHP-Dateien in /lang/SPRACHE/extra/admin/  die Beschriftung für die Einstellung im Backend definieren:
    Code: PHP  [Auswählen]
    define('DEINE_KONSTANTE_TITLE', 'blablabla');
    define('DEINE_KONSTANTE_DESC', 'blubberblubber');

    Anstatt DEINE_KONSTANTE solltest du natürlich einen eigenen aussagekräftigen Konstanten-Namen wählen, z.B. MY_EXCLUDED_SUBCATS.

    Das ist doch mal 'ne Anleitung, oder ?

    Gruß,
    noRiddle

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.743
    • Geschlecht:
    *NACHTRAG*
    Wenn du die Variante mit der Konstanten benutzt muß der Teil mit dem MySQL-Befehl so aussehen:
    Code: PHP  [Auswählen]
    $conditions .= $my_excluded_sub_cats != '' ? " AND c.categories_id NOT IN(".implode(',', $my_excluded_sub_cats).")" : ''; //exclude some catagories, voodoopupp

    voodoopupp

    • Fördermitglied
    • Beiträge: 1.852
    • Geschlecht:
    Hallo Oli,

    wow, kann ich da nur sagen - das ist wirklich ne Anleitung!!!  Wirklich ganz ganz große Klasse.
    :thumbs:

    Ich habe das zu allererst mal mit nur in der Datei eingebaut, um die Funktionalität zu prüfen!
    Dabei musste ich zuerst festgestellt, dass es leider nicht wie gewünscht funktioniert (evtl. der gleiche Fehler, den ich vorab schon selber auch gemacht hatte...)

    Habe mir den Select dann mal in der Datenbank zusammengestellt und den Fehler gefunden.

    Hier
    ...
    Code: PHP  [Auswählen]
    $conditions .= $my_excluded_sub_cats != '' ? " AND c.categories_id NOT IN(".$my_excluded_sub_cats.")" : ''; //exclude some catagories, voodoopupp
    ....
    bzw. hier
    *NACHTRAG*
    Wenn du die Variante mit der Konstanten benutzt muß der Teil mit dem MySQL-Befehl so aussehen:
    Code: PHP  [Auswählen]
    $conditions .= $my_excluded_sub_cats != '' ? " AND c.categories_id NOT IN(".implode(',', $my_excluded_sub_cats).")" : ''; //exclude some catagories, voodoopupp

    muss beides mal die Abfrage nicht auf die categories_id gehen, sondern auf die parent_id, sprich so
    Code: PHP  [Auswählen]
          $conditions .= $my_excluded_sub_cats != '' ? " AND c.parent_id NOT IN(".$my_excluded_sub_cats.")" : ''; //exclude some catagories, voodoopupp
    oder so
    Code: PHP  [Auswählen]
    $conditions .= $my_excluded_sub_cats != '' ? " AND c.parent_id NOT IN(".implode(',', $my_excluded_sub_cats).")" : ''; //exclude some catagories, voodoopupp

    Dann funktioniert das ganz perfekt! Ganz großes Kino  :thx:

    *NACHTRAG*
    Wenn du die Variante mit der Konstanten benutzt muß der Teil mit dem MySQL-Befehl so aussehen:
    Code: PHP  [Auswählen]
    $conditions .= $my_excluded_sub_cats != '' ? " AND c.categories_id NOT IN(".implode(',', $my_excluded_sub_cats).")" : ''; //exclude some catagories, voodoopupp

    Das habe ich auch geprüft und kann bestätigen, dass das zwingend notwendig ist:
    testweise habe ich im neuen Feld im Backend mal unsere Kategorie "567" eingefügt, dann wurde dabei aber auch gleichzeitig die Kategorie "67" ebenso behandelt und zeigte keine Artikel der Unterkategorien mehr an.

    Sobald man das wie von dir geschrieben umsetzt funktioniert die Sache dann wie gewünscht!

    Da die Sache so gut und praktisch funktioniert und sicher auch für den ein oder anderen Shopbetreiber eine praktische Funktionalität ist, habe ich mal das entsprechende Ticket 2450 erstellt :)

    Viele Grüße
    Dominik

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.743
    • Geschlecht:
    Das war mal wieder so'n Schnellschuß von mir, ohne Prüfung.
    Ich habe gerade mal geschaut wo die Funktion xtc_get_subcategories()  noch so benutzt wird.
    Da das an einigen Stellen der Fall ist wo die Änderung nicht sein darf geht das so leider nicht.
    Man müsste sich also eine eigene Funktion (z.B. custom_xtc_get_subcategories())  bauen mit dem geänderten Code und diese dann in /inc/xtc_get_product_path.inc.php  und /includes/modlues/default.php  benutzen.

    Außerdem müsste man noch Abfragen einbauen à la
    "wenn die parent_id X ist dann ist $my_excluded_sub_cats = A,B
    wenn sie jedoch Y ist, dann ist $my_excluded_sub_cats = D,E
    "
    usw.,
    denn ansonsten kann man das ja 1. nur auf eine einzige parent_id  anwenden und 2. würde bei allen anderen eine unnötige Abfrage in der Query sein.

    Zu
    Code: SQL  [Auswählen]
    AND c.parent_id NOT IN()
    Ich hatte es nicht getestet aber verstehen tue ich nicht was du sagst.
    Nehmen wir an du hast die Kategorie mit ID 5 und diese hat die Unterkategorien mit den IDs 6,7,8.
    Davon willst du jedoch die Artikel aus der 8 nicht anzeigen lassen.
    Die in die Funktion übergebene parent_id  ist die 5 der Hauptkategorie, denn deren Unterkategorien willst du ja holen, willst dabei jedoch die 8 ausschließen. Die 8 ist aber nicht parent_id  sondern eine der eruierten categories_id.
    D.h. du willst die auszuschließenden Kategorien ja aus diesem ausschließen
    Code: SQL  [Auswählen]
    SELECT c.categories_id

    außer eben die 8, also
    Code: SQL  [Auswählen]
    SELECT c.categories_id
    ...
    WHERE c.categories_id NOT IN(8);

    Gruß,
    noRiddle

    voodoopupp

    • Fördermitglied
    • Beiträge: 1.852
    • Geschlecht:
    Hmm, okay - habe jetzt nicht wirklich getestet, wo genau diese Funktion alles vorkommt, sondern mich einfach nur auf mein aktuelles Problem beschränkt und in verschiedenen Konstellationen getestet.

    Wenn das anderweitige Auswirkungen hat, dann macht das so leider doch wenig Sinn.
    Dann wäre der Ansatz in der default.php an sich doch nicht ganz so verkehrt gewesen, um es entsprechend zu beschränken.

    ...
    Zu
    Code: SQL  [Auswählen]
    AND c.parent_id NOT IN()
    Ich hatte es nicht getestet aber verstehen tue ich nicht was du sagst.
    Nehmen wir an du hast die Kategorie mit ID 5 und diese hat die Unterkategorien mit den IDs 6,7,8.
    Davon willst du jedoch die Artikel aus der 8 nicht anzeigen lassen.
    Die in die Funktion übergebene parent_id  ist die 5 der Hauptkategorie, denn deren Unterkategorien willst du ja holen, willst dabei jedoch die 8 ausschließen. Die 8 ist aber nicht parent_id  sondern eine der eruierten categories_id.
    D.h. du willst die auszuschließenden Kategorien ja aus diesem ausschließen
    Code: SQL  [Auswählen]
    SELECT c.categories_id

    außer eben die 8, also
    Code: SQL  [Auswählen]
    SELECT c.categories_id
    ...
    WHERE c.categories_id NOT IN(8);

    Da hast du mich missverstanden oder aber ich habe mich nicht gründlich genug ausgedrückt.

    Da die Funktion ja "Artikel aus Unterkategorien anzeigen" heißt, macht diese Funktion genau das:
    sie zeigt in Elternkategorien die Artikel der Unterkategorien an.

    Und nun möchte ich in einigen wenigen Elternkategorien genau das verhindern: ich möchte nicht verhindern, dass aus einer bestimmten Unterkategorie die Artikel angezeigt werden, sondern ich möchte das für eine bestimmte Überkategorie generell verhindern.

    Ich beziehe mich mal auf die von dir genannten IDs mit einem weiteren Beispiel:
    Überkategorie
    "Geschenke für Männer" (ID 5)

    Unterkategorien:
    Geschenke für Jungs (ID 6)
    Geschenke für Papa (ID 7)
    Geschenke für Opa (ID 8)

    Nun werden unter "Geschenke für Männer" alle Artikel aus Jungs, Papa & Opa gezeigt. Jetzt hat man dort ganz spezielle Produkte die genau auf die Klientel passen, sprich Artikel auf denen "bester Bruder", "bester Opa", "bester Papa" steht oder lustige Geschenke für 10 Jährige...

    Nun kommt ein Kunde über eine Suchmaschine und landet auf der Landingpage "Geschenke für Männer", eben weil er danach gesucht hat. Tendenziell ist das aber meist keiner der was für seinen Papa oder Opa sucht, noch seinen Kindern was schenken will. Eher jemand der als Ehepartner/in ihrem/seinem Mann was schenken will oder aber jemand der seinem Kumpel irgendwas schenken will.

    Daher sollten auf dieser Seite eben besser passende, neutralere Artikel angezeigt werden, als in den entsprechenden Unterkategorien. Daher sollen hier separat bestimmte Artikel reinverlinkt werden.

    Aber durch das Aktivieren der Funktion im Backend, landen dennoch alle Unterkategorie-Artikel in der Überkategorie und verwässern und verschlechtern das Ergebnis für den Kunden.

    Und genau deshalb möchte ich eine Überkategorie definieren können, die wenn aufgerufen wird, sich so verhält, als ob sie keine Unterkategorien hätte.

    Und dafür muss es dann eben eher so aussehen:
    Code: PHP  [Auswählen]
    SELECT c.categories_id
    ...
    WHERE c.parent_id NOT IN(5);
     

    Denn die Kategorien 6,7,8 haben jeweils die parent_id 5 gesetzt.

    Nachdem ich also deine Ausführungen gelesen habe, verstehe ich auch, warum es nicht funktioniert hatte, denn du wolltest bestimmte Unterkategorien ausschließen, ich habe aber eben die Überkategorie eingetragen  :lol:

    Grüße
    Dominik
    Tendenziell sind

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.743
    • Geschlecht:
    Verstehe, dann hatte ich wahrscheinlich nicht richtig gelesen (habe gerade keine Lust nochmal alles zu lesen ;-)).
    Dann müsstest du an zwei Stellen, nämlich denen wo CATEGORIES_SHOW_PRODUCTS_SUBCATS vorkommt, was neben der /includes/modlues/default.php  auch die /inc/xtc_get_product_path.inc.php  ist, die Abfrage erweitern
    Code: PHP  [Auswählen]
    if (CATEGORIES_SHOW_PRODUCTS_SUBCATS == 'true' && !in_array($current_category_id, $my_excluded_cats_for_subcats)) {
    für erstgenannte
    und
    Code: PHP  [Auswählen]
    if (CATEGORIES_SHOW_PRODUCTS_SUBCATS == 'true' && !in_array($categories_id, $my_excluded_cats_for_subcats)) {
    für zweitgenannte Datei.

    $my_excluded_sub_cats  müsste dann ein Array sein, welches du global in einer Datei in /includes/extra/application_top/application_top_end/  so definieren könntest:
    Code: PHP  [Auswählen]
    $my_excluded_cats_for_subcats = array(X,Y,Z);

    wobei X, Y und Z die IDs sind die du ausschließen möchtest.

    Gruß,
    noRiddle

    voodoopupp

    • Fördermitglied
    • Beiträge: 1.852
    • Geschlecht:
    Hi Oli,

    besten Dank - das funktioniert :)

    Mein Fehler war dass ich das nicht als in_array abgefragt hatte, und daduruch das nicht sauber hinbekommen habe :)
    Genau an der Stelle hatte ich auch angesetzt, aber es nicht zum Laufen bekommen...

    Was ich nur nicht ganz verstehe:
    die default.php ist doch für die Anzeige im Frontend in den Kategorie/Product-Listungen zuständig.

    Wofür genau muss ich die Anpassung in /inc/xtc_get_product_path.inc.php durchführen? Die ermittelt doch meines Wissens nach nur den Kategoriepfad des Artikels? Aber brauche ich das im Listing bzw. wofür schließe ich das aus?!

    Wenn über die default.php der Artikel nicht angezeigt wird, wofür dann noch den nicht notwendigen Kategoriepfad umstricken? Wo denke ich falsch?

    Grüße
    Dominik

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.743
    • Geschlecht:
    Die /includes/modlues/default.php  ist für jegliches Produkt-Listing verantwortlich, d.h. Startseitenartikel, alle Kategorieseiten, alle Herstellerseiten.

    Ich habe nicht geprüft wo überall /inc/xtc_get_product_path.inc.php  benutzt wird. Fest steht, daß dort CATEGORIES_SHOW_PRODUCTS_SUBCATS abgefragt wird und meine Erfahrung zeigt, daß man bei Code-Änderungen immer aufpassen muß, daß die Änderung nicht unvorhergesehene Folgen hat.
    Habe nun mal durchgescannt. Kannst die Änderung in dieser Datei in der Tat weglassen.

    Gruß,
    noRiddle

    voodoopupp

    • Fördermitglied
    • Beiträge: 1.852
    • Geschlecht:
    Sauber!

    Danke nochmals für deinen weiteren Check, war mir eben nicht sicher, ob das wirklich notwendig ist. Aber gut, möchte ja auch schlauer werden....

    Grüße
    Dominik
    Werbung / Banner buchen