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: MODUL: Anzahl Bestellungen eines Kunden in Bestellübersicht anzeigen

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.707
    • Geschlecht:
    [...]
    Wenn das in deinem Sinne ist, dann würde ich ein Paket zusammenstellen, hier hochladen und Tomcraft bitten den Titel zu ändern und das Modul in die Übersicht der Module für Shops ab Version 2.0.0.0 einzupflegen.
    [...]

    Mach.

    Gruß,
    noRiddle

    *NACHTRAG*
    Wobei, "Titel ändern", warum ?

    Timm

    • Fördermitglied
    • Beiträge: 6.318
    Damit es dann "Modul: Anzahl Bestellungen eines Kunden in admin/orders.php anzeigen lassen" heißt. Aber das passiert wohl automatisch, wenn es von Bastelecke zu Module verschoben wird.  :tomato:

    Gruß Timm

    Timm

    • Fördermitglied
    • Beiträge: 6.318
    Hier nun als Paket.

    Gruß Timm

    [EDIT Tomcraft 14.08.2019: Modul in Beitrag 1 ergänzt.]

    Tomcraft

    • modified Team
    • Gravatar
    • Beiträge: 46.161
    • Geschlecht:
    Danke euch beiden! :thx:

    Grüße

    Torsten

    Timm

    • Fördermitglied
    • Beiträge: 6.318
    @oneQ
    In der Freude über das updatesichere Modul von noRiddle hab ich ganz vergessen auch dir für die Bereitstellung deines Codebeispiels zu danken. Danke.

    Gruß Timm

    Timm

    • Fördermitglied
    • Beiträge: 6.318
    Hier noch ein Screenshot, wie es dann aussieht, wenn man Anzahl der Bestellungen und die Kommentare anzeigt.

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

    Gruß Timm

    [EDIT Tomcraft 14.08.2019: Screenshot in Beitrag 1 ergänzt.]

    Timm

    • Fördermitglied
    • Beiträge: 6.318
    Wie ich zu Anfang vermutet hatte, werden mehrere Bestellungen eines Gasts nicht zusammengezählt.

    1) Könnte man entweder z.b. über die gleiche Emailadresse nur bei Gastkonten diese Bestellungen zusammenzählen?

    2) Oder kann man hilfsweise die Anzahl der Bestellungen nur für Kundengruppe Neue Kunden anzeigen lassen? Dann wüsste man gleich, wann es sich um eine Gastbestellung handelt und man dann den Namen manuell eingibt in der Suche um die Anzahl der Bestellungen herauszufinden.

    Vielleicht sogar dann den Namen klickbar machen, dass man direkt zur Seite https://www.example.com/admin/customers.php?search=Vorname%20Nachname gelangt.

    Gruß Timm

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.707
    • Geschlecht:
    Du hast ja Wünsche..., tststs,...  :no-happy:
    Spaß beiseite:
    Ich schaue mir das morgen (ääh, heute..., schon so spät  :-O) mal an, an Gast-Bestellungen habe ich noch gar nicht gedacht (dafür brauche ich, als Nicht-Schop-Betreiber, ja euch).

    Gruß,
    noRiddle

    Timm

    • Fördermitglied
    • Beiträge: 6.318
    Danke dir.

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.707
    • Geschlecht:
    Folgende Probleme und Gedanken tuen sich auf mit deinem Wunsch:
    • Um die Anzahl Bestellungen zu bekommen die ein und derselbe Gast getätigt hat benötigen wir einen eindeutigen Parameter. Es böte sich die E-Mail-Adresse an. Das Problem dabei ist, daß ein und derselbe Kunde seine Mail-Adresse ändern bzw. eine andere verwenden kann.
      - Auch bei einem "echten" Konto, also kein Gast-Konto, kann der Inhaber des Kontos seine Mail-Adresse ja übrigens ändern. -
      In der DB-Tabelle orders, deren Daten wir nutzen, wird die zum Zeitpunkt der Bestellung verwendete Mail-Adresse gespeichert, sie kann jedoch aus genannten Gründen von der Mail-Adresse welche in der DB-Tabelle customers gespeichert ist abweichen und es können somit später (oder früher) getätigte Bestellungen mit anderer Mail-Adresse getätigt worden sein, obwohl es sich um denselben Kunden handelt. Es stellt sich also die Frage wie man einen Gast eindeutig als denselben Kunden wie einen Kunden aus einer anderen Gast-Bestellung identifizieren will.
      Man könnte von der Versand- und/oder Konto-Adresse ausgehen (auch ein Gast-Konto ist ja eigtl. ein Konto). Aber auch Adressen können sich ändern.
    • Wie die Erweiterung bislang ist ist sie ziemlich schnell. Wenn wir die Queries zu komplex machen, sprich, auch Konto- und Versandadresse vergleichen, wird es (evtl. gravierende) Performance-Einbußen geben.
      Dies vor allem auch deshalb weil wir vorher alles mit einer einzigen Query machen konnten (Verwendung von mySQL IN()), nun aber Queries in einer Schleife machen müssen um die Gast-Bestellungen zu zählen.

    Für den dem die evtl. nicht korrekte Anzahl an Bestellungen bei Gast-Bestellungen egal ist und es testen möchte habe ich das kombinierte Skript (Anzahl Bestellungen und Kommentare) mal so umgebaut, daß man alles oben im File bei
    //BOC config
    konfigurieren kann.

    Man kann insgesamt in dem genannten Bereich bestimmen
    • ob man überhaupt Gast-Bestellungen zählen will
      (würde dann ausschließlich mit übereinstimmender Mail-Adresse geprüft),
      wenn nicht würde bei jeder Gast-Bestellung (1) stehen.
    • ob man außerdem noch zusätzlich auf Adresse-Übereinstimmung prüfen möchte (Strasse, PLZ, Ort),
      was ich nicht empfehlen würde. Adresse kann sich schnell mal ändern, Mail-Adresse eher seltener.
    • ob man auch die Kommentare mitanzeigen lassen möchte
    • wenn 3. true, ob man lediglich den ersten (ältesten) Kommentar anzeigen lassen möchte

    Es gibt also nun ein File für Alles. Extra für dich FräuleinZwirn..., äääh, Garn. :hust: :-D

    Here you go
    (bitte testen, ich habe keine Umgebung mit genügend Gast-Bestellungen zur Verfügung momentan):
    Code: PHP  [Auswählen]
    <?php
    /**************************************************************************************************
    * file: 13_add_to_ordlist.php
    * use: display total amount of orders per customer in order listing
           optional: display also comments of order (with option to display all or only first (oldest))
    * path: /admin/includes/extra/footer/
    *
    * (c) noRiddle 08-2019
    **************************************************************************************************/


    if(strpos($PHP_SELF, FILENAME_ORDERS) && !isset($_GET['action']) && xtc_db_num_rows($orders_query) > 0) {
        //BOC config
        $tot_ord_debug = false; //debug ? (true will display certain generated arrays in footer area for control purposes, see code)

        $we_have_ord_comments = true; //want to display comments of orders ?
        $only_first_comment = false; //if $we_have_ord_comments is set to true, want to display all comments or only first (oldest) one ?

        $try_count_guest_orders = true; //try to count also guest orders (comparing mail-address)
        $compare_also_shipp_address = false; //compare not only mail-address but also shipping-address when trying to count orders placed by guests
        //EOC config

        xtc_db_data_seek($orders_query, 0);

        $queried_custs = array();
        $ord_cust_map = array();
        if($we_have_ord_comments === true) {
            $ord_comm_arr = array();
        }
       
        while($ord = xtc_db_fetch_array($orders_query)) {
            $ord_cust_map[$ord['orders_id']] = $ord['customers_id'];
        }

        $collect_unique_custids = array_unique($ord_cust_map);
        $custs_str = implode(',', $collect_unique_custids);
        if($we_have_ord_comments === true) {
            $ord_id_array = array_keys($ord_cust_map);
            $ordc_in_str = implode(',', $ord_id_array);
        }

    //debug
    if($tot_ord_debug === true) {
        echo '<pre>$ord_cust_map: '.print_r($ord_cust_map, true).'</pre>';
        echo '<pre>$collect_unique_custids: '.print_r($collect_unique_custids, true).'</pre>';
    }
     
        $try_count_guest_orders === true ? $hmo_add_select = ' customers_email_address,'.($compare_also_shipp_address === true ? ' customers_street_address, customers_city, customers_postcode,' : '') : '';
        $how_many_orders_query = xtc_db_query("SELECT COUNT(*) AS total_orders,".$hmo_add_select." account_type, customers_id FROM " . TABLE_ORDERS . " WHERE customers_id IN(".$custs_str.") GROUP BY customers_id");

        while($custs_total_arr = xtc_db_fetch_array($how_many_orders_query)) {
            if($try_count_guest_orders === true && $custs_total_arr['account_type'] == '1') {
                $hmo_add_guest_select = $compare_also_shipp_address === true ? " AND customers_street_address = '".xtc_db_input($custs_total_arr['customers_street_address'])."'
                                                                                 AND customers_city = '"
    .xtc_db_input($custs_total_arr['customers_city'])."'
                                                                                 AND customers_postcode = '"
    .xtc_db_input($custs_total_arr['customers_postcode'])."'"
                                                                             : '';
                $how_many_orders_guest_query = xtc_db_query("SELECT COUNT(*) AS total_guest_orders
                                                               FROM "
    . TABLE_ORDERS . "
                                                              WHERE customers_email_address = '"
    .xtc_db_input($custs_total_arr['customers_email_address'])."'"
                                                              .$hmo_add_guest_select);

                $how_many_orders_guest_arr = xtc_db_fetch_array($how_many_orders_guest_query);
            }
           
            $hmo_result_arr = array('total_orders' => $custs_total_arr['account_type'] == '0' ? $custs_total_arr['total_orders'] : ($custs_total_arr['account_type'] == '1' ? $how_many_orders_guest_arr['total_guest_orders'] : ''),
                                    'account_type' => $custs_total_arr['account_type']
                                   );
            if(isset($custs_total_arr['customers_email_address'])) { //which is effectively if($try_count_guest_orders === true)
                $hmo_result_arr['customers_email_address'] = $custs_total_arr['customers_email_address'];

                if($compare_also_shipp_address === true) {
                    $hmo_result_arr['customers_street_address'] = $custs_total_arr['customers_street_address'];
                    $hmo_result_arr['customers_city'] = $custs_total_arr['customers_city'];
                    $hmo_result_arr['customers_postcode'] = $custs_total_arr['customers_postcode'];
                }
            }

            $queried_custs[$custs_total_arr['customers_id']] = $hmo_result_arr;
        }

    //debug
    if($tot_ord_debug === true) {
        echo '<pre>$queried_custs: '.print_r($queried_custs, true).'</pre>';
    }

        if($we_have_ord_comments === true) {
            $orders_history_query = xtc_db_query("SELECT orders_id, comments FROM " . TABLE_ORDERS_STATUS_HISTORY . " WHERE orders_id IN(".$ordc_in_str.") ORDER BY orders_id DESC, date_added");

            if(xtc_db_num_rows($orders_history_query) > 0) {
                while($orders_comments = xtc_db_fetch_array($orders_history_query)) {
                    $ord_comm_arr[$orders_comments['orders_id']][] = $orders_comments['comments'];
                }
    if($tot_ord_debug === true) {
        echo '<pre>$ord_comm_arr: '.print_r($ord_comm_arr, true).'</pre>';
    }

                if(!empty($ord_comm_arr)) {
                    foreach($ord_comm_arr as $ordid => $comm_arr) {
                        $ord_comments = "";
                       
                        if($only_first_comment !== true) {
                            for($oc = 0, $ocl = count($comm_arr); $oc < $ocl; $oc++) {
                                if($comm_arr[$oc] != '') {
                                    $ord_comments .= '<span style="display:block; margin:0 0 3px 0; padding:0 0 3px 0; border-bottom:1px dotted #000;">'.nl2br($comm_arr[$oc]).'</span>';
                                }
                            }

                            echo '<span class="ord-comm tooltip" data-ord="ord-'.$ordid.'" style="padding:0 0 0 10px; float:right;">'.(!empty($ord_comments) ? '<img src="images/icons/comment2.gif" style="border:0;"><em>'.$ord_comments.'</em>' : '').'</span>';
                        } else {
                            if($comm_arr[0] != '') {
                                $ord_comments .= '<span style="display:block; margin:0 0 3px 0; padding:0 0 3px 0;">'.nl2br($comm_arr[0]).'</span>';
                            }

                            echo '<span class="ord-comm tooltip" data-ord="ord-'.$ordid.'" style="padding:0 0 0 10px; float:right;">'.(!empty($ord_comments) ? '<img src="images/icons/comment2.gif" style="border:0;"><em>'.$ord_comments.'</em>' : '').'</span>';
                        }
                    }
                }
            }
        }

        foreach($ord_cust_map as $ordid => $custid) {
            echo '<span class="ord-tot" data-ordc="ordc-'.$ordid.'" style="display:inline-block; padding:0 0 0 10px;'.($queried_custs[$custid]['account_type'] == '1' ? ' color:#c00;' : '').'" title="No. of orders'.($queried_custs[$custid]['account_type'] == '1' ? ' (GAST)' : '').'">('.$queried_custs[$custid]['total_orders'].')</span>';
        }
    ?>
    <style>
    .tooltip:hover em {bottom:auto; top:100%;}
    </style>
    <script>
    $(function() {
        var $tbc = $('.tableBoxCenter tbody tr');

        $tbc.each(function(index) {
            var $skip_header = $tbc.eq(index + 1),
                $tbc_dtc = $skip_header.find('.dataTableContent'),
                $tbc_dtc_oid = $tbc_dtc.eq(1).text(),
                $class_data_var = 'ordc-'+$tbc_dtc_oid;
    <?php
    if($we_have_ord_comments === true) {
    ?>
            var $class_data_cvar = 'ord-'+$tbc_dtc_oid;
    <?php
    }
    ?>

            $tbc_dtc.eq(0).addClass($class_data_var);
           
            $('span[data-ordc='+$class_data_var+']').appendTo($skip_header.find('.'+$class_data_var));
    <?php
    if($we_have_ord_comments === true) {
    ?>
            $('span[data-ord='+$class_data_cvar+']').appendTo($skip_header.find('.'+$class_data_var));
    <?php
    }
    ?>
        });
    });
    </script>
    <?php
    }
    ?>

    Zusatz-Informationen:
    • Die Zahlen bei Gast-Bestellungen sind nun rot, wodurch man Gast-Bestellungen leicht erkennen kann. Im title-tag (mouseover) steht dann auch noch (GAST) dabei.
    • Ich habe gesehen, daß es manchmal sehr lange Namen im ersten Feld (Spalte Kunden) gibt und deshalb die Anzahl und das Kommentar-Icon verschoben leicht überlappend dargestellt werden.
      Man kann das lösen indem man im CSS-Bereich des Files der Tabellenzelle folgenden Style gibt
      .dataTableContent {position:relative;}
      um dann das span mit der Klasse ord-comm absolute positionieren zu können und mittels der Werte für top und left bzw. right sich das nach Gusto psoitionieren kann, sodaß es okay aussieht.
      Auch könnte man die Inline-Styles überhaupt in den CSS-Block auslagern, wäre sicherlich sinnvoll.
      Das überlasse ich euch.

    Gruß,
    noRiddle

    Timm

    • Fördermitglied
    • Beiträge: 6.318
    Ich fühl mich geehrt, dass du das extra für mich gemacht hast  :-* Auch wenn es von meiner Seite eigentlich für alle sein sollte und von deiner sicher auch ist.

    Chapeau, das ist echt nice, dass nun alles in einem file untergebracht ist.

    Ich denke es funktioniert, aber der Weg zur Erkenntnis war sehr steinig und eigentlich hab ich grad richtig schlechte Laune, obwohl deine Lösung doch so gut ist.

    Wo schaut man als erstes? Bei seinen eigenen Testbestellungen. Und genau da hat es nicht hingehauen. Exakt die gleichen Daten zu Adressen und Email in den Bestellungen haben auf einer admin/orders.php?page=1 6 Bestellungen angezeigt und auf der nächsten page=2 2 Bestellungen. Da fragt man sich dann natürlich was falsch läuft? Dann gibt man wie sonst bei der Suche den Namen oder die Email der Bestellung in der Adminsuche ein, um die Anzahl der Bestellungen herauszubekommen und findet kein Kundenkonto mit dem Namen oder Email. Dann kommt erstmal das unschöne Gefühl, dass irgendwas im Shop nicht funktioniert. Wenn man sich dann die DB und deinen Code zu Gemüte führt, dann kommt man drauf, dass die Adminsuche in der Tabelle customers sucht und dein Tool in der Tabelle orders. Das erklärt, warum man über die Suche den Namen nicht findet. Und irgendwann kommt man auch drauf, dass im eingeloggten Zustand und dann der Nutzung zu Testzwecken von Amazon Pay z.b., wo die Kundendaten extern übernommen werden für die Bestellung, in der Tabelle orders eine neue customers_id generiert wird, die nicht zu der des Admins in der Tabelle customers passt und in diese dann auch gar nicht in die Tabelle customers übertragen wird, sondern dann nur in Tabelle orders existiert. Über den zeitlichen Verlauf hat man dann scheinbar gleiche Testbestellungen, die aber unterschiedliche customers_id in der Tabelle orders haben. Nur wenn sie direkt nacheinander gemacht werden scheint die customers_id gleich zu bleiben und es kommt auf der einen Seite zu 6 Bestellungen und auf der anderen zu 2.

    Ob man daraus jetzt etwas fürs Modul ableiten kann/sollte kann ich grad nicht sagen.

    Bei allen normalen Bestellungen scheint es aber generell zu funktionieren.

    Einzig was nicht ganz richtig ist, dass ein angelegtes Gast Konto ohne Bestellung die "Anzahl der Bestellungen" auch im 1 erhöht, obwohl keine Bestellung stattgefunden hat. Also es wird ein Gastkonto angelegt und nicht bestellt. Dann später wieder ein Gastkonto angelegt und bestellt und die Zahl hinter dem Namen ist eine 2 , obwohl nur eine Bestellung stattgefunden hat.

    Ich bin übers WE auswärts und kann erst nächste Woche nochmal genauer testen. Bin ja jetzt gleich bei einer der ersten Testkonten gleich auf ein längeres Problem gestoßen, wofür dein Modul aber nichts kann. Dann kann ich auch mal die Parsetime vergleichen wenn man auch die Versandadresse als Suchkriterium nutzt in zwei Shops mit sehr unterschiedlicher Anzahl an Kunden.

    Gruß Timm

    EDIT: Wenn man die möglichen Performanceverluste mal ausblendet - Wäre es nicht sinnvoller in der Kundenadresse zu suchen statt in der Versandadresse? Ein Kunde mit der immer gleichen Kundenadresse (bis zu einem Umzug) kann jedes Mal eine andere Versandadresse angeben wie privat, Arbeit oder Packstation und das würde dann nicht zusammengezählt werden.

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.707
    • Geschlecht:
    Mmh, habe jetzt nicht alles auf Anhieb nachvollziehen können, ist schon komplex die Sache.
    Aber, daß es customers_ids gibt die nur in der DB-Tabelle orders vorkommen kann ich mir nur dann erklären wenn Konten gelöscht wurden (Konto im Sinne = "echtes" oder Gast-Konto mit Einträgen in den DB-Tabellen customers und address_book). Das kann natürlich 1. sein wenn man Konten gelöscht hat und 2. wenn "Sollen Gast-Konten nach erfolgter Bestellung gelöscht werden? (Bestelldaten bleiben erhalten)" auf 'Ja' steht (Backend => Konfiguration => Kunden Details).
    Da mein Skript aber wirklich nur in die DB-Tabelle orders schaut dürfte es eigentlich mit den Ergebnissen keine Probleme geben, es sei denn ich habe einen Fehler eingebaut.

    [...] Exakt die gleichen Daten zu Adressen und Email in den Bestellungen haben auf einer admin/orders.php?page=1 6 Bestellungen angezeigt und auf der nächsten page=2 2 Bestellungen. [...]

    Sicher, daß die Daten gleich sind ?
    *EDIT*
    Das wäre: Mail-Adresse, Versand-Adresse-Straße, Versand-Adresse-Ort, Versand-Adresse-PLZ
    *END_EDIT*
    Kann eigentlich nicht sein.
    Ich schau's mir aber nochmal an bis nächste Woche.

    Gruß,
    noRiddle

    *NACHTRAG*
    Zu deinem EDIT:
    Das würde ich auch so sehen wenn es sich um ein "echtes" Konto handelt. Bei einem Gast-Konto gibt man doch gleich bei Kontoerstellung die Adresse an an welche man die Ware gesendet haben möchte, oder ?

    Timm

    • Fördermitglied
    • Beiträge: 6.318
    [...] daß es customers_ids gibt die nur in der DB-Tabelle orders vorkommen kann ich mir nur dann erklären wenn Konten gelöscht wurden [...]

    Genau so einen Kunden hab ich auch noch gleich am Anfang beim testen mit dabei gehabt der sein Konto anscheinend selbst gelöscht hat, wo man den dann auch nicht über die Adminsuche mehr finden kann. Manchmal läufts einfach nicht  :’-(

    Gastkonten löschen steht auf - nein
    Kundenkonten von mir gelöscht - nein

    [...]
    Sicher, daß die Daten gleich sind ?
    *EDIT*
    Das wäre: Mail-Adresse, Versand-Adresse-Straße, Versand-Adresse-Ort, Versand-Adresse-PLZ
    *END_EDIT*
    Kann eigentlich nicht sein.
    Ich schau's mir aber nochmal an bis nächste Woche.
    [...]

    Ja! Hatte paar Stunden Zeit.  :-D Es ist wirklich immer nur die customers_id in Tabelle orders unterschiedlich. Bei den 6 ist sie natürlich gleich und bei den 2 auch wieder gleich. Aber bei den 6 ist eine andere als bei den 2. Aber mir fällt grad auf, dass es bei diesen Adminbestellungen egal ist, weil es ja immer Bestellungen eines "Neuer Kunde" sind und dann über die customers_id zugeordnet wird und die Adressprüfung gar nicht wirkt, selbst wenn sie aktiviert ist. Insofern kein Problem deines Moduls. Ein eingeloggter Kunde wird ja auch im Normalfall kein Zahlungsmodul nutzen, dass die Adresse extern holt (Amazon Pay, Paypal Express) und er dadurch eine neue customers_id für diese Bestellung erhält.

    [...]
    *NACHTRAG*
    Zu deinem EDIT:
    Das würde ich auch so sehen wenn es sich um ein "echtes" Konto handelt. Bei einem Gast-Konto gibt man doch gleich bei Kontoerstellung die Adresse an an welche man die Ware gesendet haben möchte, oder ?

    Ich könnte mir vorstellen, dass die Wahrscheinlichkeit, dass die Kundenadresse öfter gleich ist als die Versandadresse einfach höher ist. Ich hab Kunden die immer wieder, obwohl es mehr Arbeit macht, ein Gastkonto anlegen. Und die geben immer die gleiche Kundenadresse an. Aber halt ab und zu auch mal eine abweichende Lieferanschrift.

    Gruß Timm

    EDIT: Zu prüfen wäre natürlich ob sich die customers_id in Tabelle orders nur bei einem admin ändern kann (warum auch immer) oder auch bei einem "Neuer Kunde" oder "Gast".

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.707
    • Geschlecht:
    Hatte noch einen Code-Verhaspeler drin.
    Soll statt

    Code: PHP  [Auswählen]
    $try_count_guest_orders === true ? $hmo_add_select = ' customers_email_address,'.($compare_also_shipp_address === true ? ' customers_street_address, customers_city, customers_postcode,' : '') : '';

    so lauten

    Code: PHP  [Auswählen]
    $hmo_add_select = $try_count_guest_orders === true ? ' customers_email_address,'.($compare_also_shipp_address === true ? ' customers_street_address, customers_city, customers_postcode,' : '') : '';

    Außerdem habe ich den Konfigurations-Parameter $compare_also_shipp_address umbenannt in $compare_also_cust_address. Es wurde ohnehin bereits die Kunden- und nicht die Versand-Adresse verglichen.

    Hier nochmals komplett:
    Um Mißverständnissen vorzubeugen: Das ist die (korrigierte) Version aus Antwort #24 mit diesen Features

    [...]
    Für den dem die evtl. nicht korrekte Anzahl an Bestellungen bei Gast-Bestellungen egal ist und es testen möchte habe ich das kombinierte Skript (Anzahl Bestellungen und Kommentare) mal so umgebaut, daß man alles oben im File bei
    //BOC config
    konfigurieren kann.

    Man kann insgesamt in dem genannten Bereich bestimmen
    • ob man überhaupt Gast-Bestellungen zählen will
      (würde dann ausschließlich mit übereinstimmender Mail-Adresse geprüft),
      wenn nicht würde bei jeder Gast-Bestellung (1) stehen.
    • ob man außerdem noch zusätzlich auf Adresse-Übereinstimmung prüfen möchte (Strasse, PLZ, Ort),
      was ich nicht empfehlen würde. Adresse kann sich schnell mal ändern, Mail-Adresse eher seltener.
    • ob man auch die Kommentare mitanzeigen lassen möchte
    • wenn 3. true, ob man lediglich den ersten (ältesten) Kommentar anzeigen lassen möchte
    [...]

    @FräuleinGarn
    Du mußt für deine Zwecke evtl. $compare_also_cust_address in der Config auf true stellen,
    damit für das Zählen von Gast-Bestellungen auch die Kunden-Adresse zusätzlich zur Mail-Adresse verglichen wird.

    Code: PHP  [Auswählen]
    <?php
    /**************************************************************************************************
    * file: 13_add_to_ordlist.php
    * use: display total amount of orders per customer in order listing
           optional: display also comments of order (with option to display all or only first (oldest))
    * path: /admin/includes/extra/footer/
    *
    * (c) noRiddle 08-2019
    **************************************************************************************************/


    if(strpos($PHP_SELF, FILENAME_ORDERS) && !isset($_GET['action']) && xtc_db_num_rows($orders_query) > 0) {
        //BOC config
        $tot_ord_debug = false; //debug ? (true will display certain generated arrays in footer area for control purposes, see code)

        $we_have_ord_comments = true; //want to display comments of orders ?
        $only_first_comment = false; //if $we_have_ord_comments is set to true, want to display all comments or only first (oldest) one ?

        $try_count_guest_orders = true; //try to count also guest orders (comparing mail-address)
        $compare_also_cust_address = false; //compare not only mail-address but also customer-address when trying to count orders placed by guests
        //EOC config

        xtc_db_data_seek($orders_query, 0);

        $queried_custs = array();
        $ord_cust_map = array();
        if($we_have_ord_comments === true) {
            $ord_comm_arr = array();
        }
       
        while($ord = xtc_db_fetch_array($orders_query)) {
            $ord_cust_map[$ord['orders_id']] = $ord['customers_id'];
        }

        $collect_unique_custids = array_unique($ord_cust_map);
        $custs_str = implode(',', $collect_unique_custids);
        if($we_have_ord_comments === true) {
            $ord_id_array = array_keys($ord_cust_map);
            $ordc_in_str = implode(',', $ord_id_array);
        }

    //debug
    if($tot_ord_debug === true) {
        echo '<pre>$ord_cust_map: '.print_r($ord_cust_map, true).'</pre>';
        echo '<pre>$collect_unique_custids: '.print_r($collect_unique_custids, true).'</pre>';
    }
     
        $hmo_add_select = $try_count_guest_orders === true ? ' customers_email_address,'.($compare_also_cust_address === true ? ' customers_street_address, customers_city, customers_postcode,' : '') : '';
        $how_many_orders_query = xtc_db_query("SELECT COUNT(*) AS total_orders,".$hmo_add_select." account_type, customers_id FROM " . TABLE_ORDERS . " WHERE customers_id IN(".$custs_str.") GROUP BY customers_id");

        while($custs_total_arr = xtc_db_fetch_array($how_many_orders_query)) {
            if($try_count_guest_orders === true && $custs_total_arr['account_type'] == '1') {
                $hmo_add_guest_select = $compare_also_cust_address === true ? " AND customers_street_address = '".xtc_db_input($custs_total_arr['customers_street_address'])."'
                                                                                 AND customers_city = '"
    .xtc_db_input($custs_total_arr['customers_city'])."'
                                                                                 AND customers_postcode = '"
    .xtc_db_input($custs_total_arr['customers_postcode'])."'"
                                                                             : '';
                $how_many_orders_guest_query = xtc_db_query("SELECT COUNT(*) AS total_guest_orders
                                                               FROM "
    . TABLE_ORDERS . "
                                                              WHERE customers_email_address = '"
    .xtc_db_input($custs_total_arr['customers_email_address'])."'"
                                                              .$hmo_add_guest_select);

                $how_many_orders_guest_arr = xtc_db_fetch_array($how_many_orders_guest_query);
            }
           
            $hmo_result_arr = array('total_orders' => $custs_total_arr['account_type'] == '0' ? $custs_total_arr['total_orders'] : ($custs_total_arr['account_type'] == '1' ? $how_many_orders_guest_arr['total_guest_orders'] : ''),
                                    'account_type' => $custs_total_arr['account_type']
                                   );
            if($tot_ord_debug === true) {
                if(isset($custs_total_arr['customers_email_address'])) { //which is effectively if($try_count_guest_orders === true)
                    $hmo_result_arr['customers_email_address'] = $custs_total_arr['customers_email_address'];

                    if($compare_also_cust_address === true) {
                        $hmo_result_arr['customers_street_address'] = $custs_total_arr['customers_street_address'];
                        $hmo_result_arr['customers_city'] = $custs_total_arr['customers_city'];
                        $hmo_result_arr['customers_postcode'] = $custs_total_arr['customers_postcode'];
                    }
                } //we don't need that, only for debugging purposes
            }

            $queried_custs[$custs_total_arr['customers_id']] = $hmo_result_arr;
        }

    //debug
    if($tot_ord_debug === true) {
        echo '<pre>$queried_custs: '.print_r($queried_custs, true).'</pre>';
    }

        if($we_have_ord_comments === true) {
            $orders_history_query = xtc_db_query("SELECT orders_id, comments FROM " . TABLE_ORDERS_STATUS_HISTORY . " WHERE orders_id IN(".$ordc_in_str.") ORDER BY orders_id DESC, date_added");

            if(xtc_db_num_rows($orders_history_query) > 0) {
                while($orders_comments = xtc_db_fetch_array($orders_history_query)) {
                    $ord_comm_arr[$orders_comments['orders_id']][] = $orders_comments['comments'];
                }
    if($tot_ord_debug === true) {
        echo '<pre>$ord_comm_arr: '.print_r($ord_comm_arr, true).'</pre>';
    }

                if(!empty($ord_comm_arr)) {
                    foreach($ord_comm_arr as $ordid => $comm_arr) {
                        $ord_comments = "";
                       
                        if($only_first_comment !== true) {
                            for($oc = 0, $ocl = count($comm_arr); $oc < $ocl; $oc++) {
                                if($comm_arr[$oc] != '') {
                                    $ord_comments .= '<span style="display:block; margin:0 0 3px 0; padding:0 0 3px 0; border-bottom:1px dotted #000;">'.nl2br($comm_arr[$oc]).'</span>';
                                }
                            }

                            echo '<span class="ord-comm tooltip" data-ord="ord-'.$ordid.'" style="padding:0 0 0 10px; float:right;">'.(!empty($ord_comments) ? '<img src="images/icons/comment2.gif" style="border:0;"><em>'.$ord_comments.'</em>' : '').'</span>';
                        } else {
                            if($comm_arr[0] != '') {
                                $ord_comments .= '<span style="display:block; margin:0 0 3px 0; padding:0 0 3px 0;">'.nl2br($comm_arr[0]).'</span>';
                            }

                            echo '<span class="ord-comm tooltip" data-ord="ord-'.$ordid.'" style="padding:0 0 0 10px; float:right;">'.(!empty($ord_comments) ? '<img src="images/icons/comment2.gif" style="border:0;"><em>'.$ord_comments.'</em>' : '').'</span>';
                        }
                    }
                }
            }
        }

        foreach($ord_cust_map as $ordid => $custid) {
            echo '<span class="ord-tot" data-ordc="ordc-'.$ordid.'" style="display:inline-block; padding:0 0 0 10px;'.($queried_custs[$custid]['account_type'] == '1' ? ' color:#c00;' : '').'" title="No. of orders'.($queried_custs[$custid]['account_type'] == '1' ? ' (GAST)' : '').'">('.$queried_custs[$custid]['total_orders'].')</span>';
        }
    ?>
    <style>
    .tooltip:hover em {bottom:auto; top:100%;}
    </style>
    <script>
    $(function() {
        var $tbc = $('.tableBoxCenter tbody tr');

        $tbc.each(function(index) {
            var $skip_header = $tbc.eq(index + 1),
                $tbc_dtc = $skip_header.find('.dataTableContent'),
                $tbc_dtc_oid = $tbc_dtc.eq(1).text(),
                $class_data_var = 'ordc-'+$tbc_dtc_oid;
    <?php
    if($we_have_ord_comments === true) {
    ?>
            var $class_data_cvar = 'ord-'+$tbc_dtc_oid;
    <?php
    }
    ?>

            $tbc_dtc.eq(0).addClass($class_data_var);
           
            $('span[data-ordc='+$class_data_var+']').appendTo($skip_header.find('.'+$class_data_var));
    <?php
    if($we_have_ord_comments === true) {
    ?>
            $('span[data-ord='+$class_data_cvar+']').appendTo($skip_header.find('.'+$class_data_var));
    <?php
    }
    ?>
        });
    });
    </script>
    <?php
    }
    ?>

    @FräuleinGarn
    Ich kann keinen Fehler im Code finden was den Vergleich von
    customers_email_address
    customers_street_address
    customers_city
    customers_postcode

    betrifft.

    Das Folgende kann ich nicht nachvollziehen:

    [...]
    Einzig was nicht ganz richtig ist, dass ein angelegtes Gast Konto ohne Bestellung die "Anzahl der Bestellungen" auch im 1 erhöht, obwohl keine Bestellung stattgefunden hat. Also es wird ein Gastkonto angelegt und nicht bestellt. Dann später wieder ein Gastkonto angelegt und bestellt und die Zahl hinter dem Namen ist eine 2 , obwohl nur eine Bestellung stattgefunden hat.
    [...]

    Es wird ja nur die DB-Tabelle orders abgefragt. Ein Gast-Konto ohne Bestellung kann auch keinen Eintrag in der genannten Tabelle orders haben.

    Was du zu AmazonPay und verschiedenen customers_ids sagst habe ich nicht ganz verstanden.
    Willst du sagen, daß ein und derselbe Kunde, mit einem "echten" Konto, in der DB-Tabelle orders mit verschiedenen customers_ids auftauchen kann ? Ich würde das für einen Bug halten, wenn dem so wäre. Das kann meine Erweiterung wie sie jetzt ist natürlich nicht abfangen.

    Gruß,
    noRiddle

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.707
    • Geschlecht:
    @FräuleinGarn
    Hast du nochmal geschaut ?

    Gruß,
    noRiddle
    Marktplatz - Eine große Auswahl an neuen und hilfreichen Modulen sowie modernen Templates für die modified eCommerce Shopsoftware
    1 Antworten
    2077 Aufrufe
    07. Juli 2011, 13:20:36 von Tobi1981
    23 Antworten
    9041 Aufrufe
    29. Mai 2011, 14:52:59 von Tomcraft
    94 Antworten
    40305 Aufrufe
    14. August 2019, 14:43:16 von Timm