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: Alle Artikel aus vorhandenen Unterkategorien - Sortierung und Anzahl ändern

    karsta.de

    • Experte
    • Beiträge: 3.048
    Um die Sortierung und die Anzahl der Anzeige für die Option Konfiguration > Artikel Listen Optionen > "Artikel aus Unterkategorien anzeigen" zu verändern, erstelle ich eine updatesichere neue Datei z.B. 99_order_by_subcats.php. Nun ist mir nicht klar welche Seite ich ansprechen muss, um die neue Sortierung und das Limit zuzuweisen.
    Hat vielleicht jemand eine Idee für mich?

    So funktioniert es leider nicht:
    Code: PHP  [Auswählen]
    if ((basename($PHP_SELF) == FILENAME_PRODUCT_LISTING) && (CATEGORIES_SHOW_PRODUCTS_SUBCATS == 'true')) {
    $sorting = " ORDER BY RAND() LIMIT ".MAX_DISPLAY_SEARCH_RESULTS." ";
                               
        $listing_sql = "SELECT ".$select."
                               "
    .ADD_SELECT_DEFAULT."
                               p.products_id,
                               p.products_ean,
    .......

    BG Karsta

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

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.743
    • Geschlecht:
    Wenn ich richtig verstehe frage nach
    Code: PHP  [Auswählen]
    if(isset($_GET['cPath']) && !empty($_GET['cPath'])) {

    denn FILENAME_PRODUCT_LISTING hast du z.B. auch bei Suchergebnissen,
    während $_GET['cPath'] nur gesetzt ist wenn man sich in einer Kategorie befindet.

    Gruß,
    noRiddle

    karsta.de

    • Experte
    • Beiträge: 3.048
    Danke noRiddle!
    Es funktioniert genauso gut wie
    Code: PHP  [Auswählen]
    if (basename($PHP_SELF) != FILENAME_ADVANCED_SEARCH_RESULT) {
    aber dein Vorschlag ist für mein Vorhaben passender.

    Hatte ich eigentlich auch schon getestet, aber war nicht drauf gekommen, dass das LIMIT nicht akzeptiert wird. Heißt Sortierung passt, aber eben nicht die Festsetzung Anzahl der angezeigten Artikel.
    Da muss man scheinbar noch woanders ansetzen.

    BG Karsta

    hpzeller

    • Experte
    • Beiträge: 4.129
    • Geschlecht:
    Hallo Karsta,

    weil in der includes/classes/split_page_results.php ca. Zeile 73 folgendes steht funktioniert dein "LIMIT" im Abfragestring "$listing_sql" nicht,

    Code: PHP  [Auswählen]
          $this->sql_query .= " LIMIT " . max((int)$offset, 0) . ", " . $this->number_of_rows_per_page;

    Erleuterung: In der includes/modules/product_listing.php ca. Zeile 48 wird der Abfragestring "$listing_sql" der Klasse "splitPageResults" als Parameter über geben, und dort als "$this->sql_query" verwendet.

    Code: PHP  [Auswählen]
    $listing_split = new splitPageResults($listing_sql, (isset($_GET['page']) ? (int)$_GET['page'] : 1), $max_display_results, $list_count_key);

    Hast du dir das mit

    Code: PHP  [Auswählen]
    $sorting = " ORDER BY RAND() LIMIT ".MAX_DISPLAY_SEARCH_RESULTS." ";

    gut überlegt, denn so kann der Shopbsucher nicht mehr zu allen Produkten gelangen wenn er die Kategorien durchgeht.

    Und noch was,

    Code: PHP  [Auswählen]
    basename($PHP_SELF) == FILENAME_PRODUCT_LISTING

    ist nie True, denn  "FILENAME_PRODUCT_LISTING" wird nie direkt aufgerufen.

    Gruss
    Hanspeter

    karsta.de

    • Experte
    • Beiträge: 3.048
    Danke Hanspeter für die ausführliche Erklärung.

    Mein Vorhaben war ein schlechter Versuch auf Kategorie-Seiten mit vielen Unterkategorien ohne explizit eigene Artikel eine zufällige Auswahl von Produkten aus "seinen" Unterkategorien darzustellen und die Anzahl zu begrenzen.
    Werde mir dazu was Neues überlegen, da diese Idee so, fast das gesamte Listing des Shops betrifft.

    Danke nochmals an euch beide fürs mitdenken.

    BG Karsta

    hpzeller

    • Experte
    • Beiträge: 4.129
    • Geschlecht:
    Hallo Karsta

    Vorschlag:

    Erstelle die Datei includes/extra/modules/product_listing_split/category_has_subcategories.php mit folgendem Inhalt.

    Code: PHP  [Auswählen]
    <?php

    if (basename($PHP_SELF) == FILENAME_DEFAULT && isset($cPath) && xtc_not_null($cPath) && strpos($subcat_list, ',') !== false && CATEGORIES_SHOW_PRODUCTS_SUBCATS == 'true') {

        $sorting_and_limit = " ORDER BY RAND() LIMIT ".MAX_DISPLAY_SEARCH_RESULTS." ";

        $listing_sql_sub = "SELECT ".$select."
                               "
    .ADD_SELECT_DEFAULT."
                               p.products_id,
                               p.products_ean,
                               p.products_quantity,
                               p.products_shippingtime,
                               p.products_model,
                               p.products_image,
                               p.products_price,
                               p.products_discount_allowed,
                               p.products_weight,
                               p.products_tax_class_id,
                               p.manufacturers_id,
                               p.products_fsk18,
                               p.products_vpe,
                               p.products_vpe_status,
                               p.products_vpe_value,
                               pd.products_name,
                               pd.products_heading_title,
                               pd.products_description,
                               pd.products_short_description
                          FROM "
    .TABLE_PRODUCTS." p
                          JOIN "
    .TABLE_PRODUCTS_DESCRIPTION." pd
                               ON p.products_id = pd.products_id
                                  AND pd.language_id = '"
    .(int) $_SESSION['languages_id']."'
                                  AND trim(pd.products_name) != ''
                               "
    .$from."
                               "
    .$filter_join."
                         WHERE p.products_status = '1'
                               "
    .PRODUCTS_CONDITIONS_P."
                               "
    .$where."
                      GROUP BY p.products_id
                               "
    .$sorting_and_limit;
                               
        $listing_query_sub = xtDBquery($listing_sql_sub);
        while ($listing_sub = xtc_db_fetch_array($listing_query_sub, true)) {
          $module_content_if_category_has_subcategories[] =  $product->buildDataArray($listing_sub);
        }
     
        $module_smarty->assign('module_content_if_category_has_subcategories', $module_content_if_category_has_subcategories);
        $module_smarty->assign('CATEGORY_HAS_SUBCATEGORIES', true);                            
    }

    Dann füge in der Datei templates/dein_template/module/includes/product_listing_include.html nach

    Code: XML  [Auswählen]
    {if (!isset($STARTPAGE) && $smarty.const.PRODUCT_LIST_BOX == 'true') || ($STARTPAGE == 'true' && $smarty.const.PRODUCT_LIST_BOX_STARTPAGE == 'true')}

    folgende Zeile ein.

    Code: XML  [Auswählen]
      {if $CATEGORY_HAS_SUBCATEGORIES == true}{assign "module_content" $module_content_if_category_has_subcategories}{/if}

    Dann ersetze in der Datei templates/dein_template/module/product_listing/product_listing_v1.html

    Code: XML  [Auswählen]
    {$LISTING_FILTER}

    mit

    Code: XML  [Auswählen]
    {if $CATEGORY_HAS_SUBCATEGORIES != true}
    {$LISTING_FILTER}
    {/if}

    und  (kommt zweimal vor)

    Code: XML  [Auswählen]
    {$PAGINATION}

    mit.

    Code: XML  [Auswählen]
    {if $CATEGORY_HAS_SUBCATEGORIES != true}
    {$PAGINATION}
    {/if}

    Gruss
    Hanspeter

    karsta.de

    • Experte
    • Beiträge: 3.048
    Vielen, vielen Dank.

    Kann es leider erst später testen, habe gerade total zu tun.
    Gebe dann Rückmeldung.

    BG Karsta

    hpzeller

    • Experte
    • Beiträge: 4.129
    • Geschlecht:
    Hallo Karsta,

    habe leider erst jetzt bemerkt, dass die Seite gecached wird falls im Admin das Cachen aktiviert ist, dies muss aber wegen "ORDER BY RAND()" im DB-Abfragestring umgangen werden. Deshalb nachfolgend der korrigierte Code für die Datei includes/extra/modules/product_listing_split/category_has_subcategories.php, welcher verhindert das sowohl die Seite als auch die DB-Abfrage gecached werden, wenn eine Kategorie Unterkategorien besitzt.

    Code: PHP  [Auswählen]
    <?php

    if (basename($PHP_SELF) == FILENAME_DEFAULT && isset($cPath) && xtc_not_null($cPath) && strpos($subcat_list, ',') !== false && CATEGORIES_SHOW_PRODUCTS_SUBCATS == 'true') {
       
        $sorting_and_limit = " ORDER BY RAND() LIMIT ".MAX_DISPLAY_SEARCH_RESULTS." ";

        $listing_sql_sub = "SELECT ".$select."
                               "
    .ADD_SELECT_DEFAULT."
                               p.products_id,
                               p.products_ean,
                               p.products_quantity,
                               p.products_shippingtime,
                               p.products_model,
                               p.products_image,
                               p.products_price,
                               p.products_discount_allowed,
                               p.products_weight,
                               p.products_tax_class_id,
                               p.manufacturers_id,
                               p.products_fsk18,
                               p.products_vpe,
                               p.products_vpe_status,
                               p.products_vpe_value,
                               pd.products_name,
                               pd.products_heading_title,
                               pd.products_description,
                               pd.products_short_description
                          FROM "
    .TABLE_PRODUCTS." p
                          JOIN "
    .TABLE_PRODUCTS_DESCRIPTION." pd
                               ON p.products_id = pd.products_id
                                  AND pd.language_id = '"
    .(int) $_SESSION['languages_id']."'
                                  AND trim(pd.products_name) != ''
                               "
    .$from."
                               "
    .$filter_join."
                         WHERE p.products_status = '1'
                               "
    .PRODUCTS_CONDITIONS_P."
                               "
    .$where."
                      GROUP BY p.products_id
                               "
    .$sorting_and_limit;
                               
        $listing_query_sub = xtc_db_query($listing_sql_sub);
        while ($listing_sub = xtc_db_fetch_array($listing_query_sub)) {
          $module_content_if_category_has_subcategories[] =  $product->buildDataArray($listing_sub);
        }
     
        $module_smarty->assign('module_content_if_category_has_subcategories', $module_content_if_category_has_subcategories);
        $module_smarty->assign('CATEGORY_HAS_SUBCATEGORIES', true);
        $disable_smarty_cache = true;                            
    }

    Gruss
    Hanspeter

    karsta.de

    • Experte
    • Beiträge: 3.048
    Hallo Hanspeter,
    bin jetzt endlich zum Testen gekommen.
    Ja so funktionierts, allerdings werden trotzdem alle Artikel geladen. Es wird dann lediglich die Navigation ausgeblendet.

    Ich denke ich werde die leeren Haup-Kategorien mittels smarty-Script befüllen.

    Vielen lieben Dank für deine Ideen.

    BG Karsta

    hpzeller

    • Experte
    • Beiträge: 4.129
    • Geschlecht:
    [...]
    Ja so funktionierts, allerdings werden trotzdem alle Artikel geladen. Es wird dann lediglich die Navigation ausgeblendet.
    [...]

    Was meinst du damit? Also es sollten maximal so viele Artikel geladen werden wie die Konstante
    MAX_DISPLAY_SEARCH_RESULTS hergibt.

    Konkret wenn du folgende Zeile im Code

    Code: PHP  [Auswählen]
        $sorting_and_limit = " ORDER BY RAND() LIMIT ".MAX_DISPLAY_SEARCH_RESULTS." ";

    mit dieser ersetzt, solltest du maximal drei Artikel, welche in zufälliger Reihenfolge angezeigt werden, sehen.

    Code: PHP  [Auswählen]
        $sorting_and_limit = " ORDER BY RAND() LIMIT 3 ";

    Die Paginierung und die Filterbar sind natürlich ausgeblendet.

    So sollte es funktionieren bzw. aussehen -> https://hpzeller.com/modified2051/de/Testkategorie-2:::2.html

    PS: Den Cache musst du gegebenenfalls noch leeren.

    Gruss
    Hanspeter

    karsta.de

    • Experte
    • Beiträge: 3.048
    Hallo Hanspeter,
    gleich noch einmal nach deinen Vorgaben getestet, allerdings nicht die Navigation ausgeblendet.
    Nur so sehe ich, dass natürlich nur, dass alle Artikel geladen werden. Gleiches Ergebnis.

    Es werden dann auf jeder Seite 3 Artikel (obwohl bei der Aufzählung 8 Artikel auf einer Seite steht) angezeigt. Also bezieht sich die 3 auf die Anzahl auf einer Seite geladenen Artikel, nicht aber auf die Gesamtanzahl der geladenen Artikel in dieser Kategorie. Gehe ich auf die Navigation eine Seite weiter, werden weitere andere Artikel angezeigt.

    [ Für Gäste sind keine Dateianhänge sichtbar ]

    Habe ich was falsch verstanden?

    BG Karsta

    hpzeller

    • Experte
    • Beiträge: 4.129
    • Geschlecht:
    [...]
    gleich noch einmal nach deinen Vorgaben getestet, allerdings nicht die Navigation ausgeblendet.
    Nur so sehe ich, dass natürlich nur, dass alle Artikel geladen werden. Gleiches Ergebnis.
    [...]

    Nein es werden nicht alle Artikel geladen, es werden so viele Artikel geladen wie die Zahl nach LIMIT es vorgibt, die Paginierung gaukelt dir etwas vor was nicht stimmt. Die Paginierung musst du deaktivieren, das ist essenziell, sie verträgt sich grundsätzlich nicht mit einer zufälligen auswahl von Produkten.

    Zum Verständnis: Die Paginierung wird von der Klasse "splitPageResults" aus gesteuert, diese Klasse muss man aber umgehen wenn man ein eigenes LIMIT setzen will.

    Gruss
    Hanspeter

    karsta.de

    • Experte
    • Beiträge: 3.048
    Alles klar. Danke dir.

    BG Karsta
    6 Antworten
    3809 Aufrufe
    10. Januar 2012, 17:44:14 von Van
    0 Antworten
    1504 Aufrufe
    14. August 2012, 13:20:59 von jpaust
    0 Antworten
    1752 Aufrufe
    15. September 2011, 22:56:18 von vamon
    2 Antworten
    2684 Aufrufe
    24. März 2014, 11:13:30 von Frank_R
               
    anything