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

    Timm

    • Fördermitglied
    • Beiträge: 6.343
    Moin,

    gibt es eine updatesichere Variante sich die Anzahl der Bestellungen eines Kunden in der admin/orders.php als extra Spalte anzeigen zu lassen? Also direkt in der Übersicht aller Bestellungen. Nicht erst wenn man auf Bestellung bearbeiten klickt.

    Zb ähnlich, wie es in "MODUL: Kommentare in Bestellübersicht als Tooltip anzeigen für Shopversion 2.x" umgesetzt wurde.

    Mir ist klar, dass es vermutlich nichts bringt, wenn der Kunde mehrfach als Gast bestellt, außer man prüft das über die Emailadresse, die sich aber auch ändern kann.

    Gruß Timm



    Screenshot vom fertigen Modul:

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

    [EDIT Tomcraft 14.08.2019: Modul ergänzt.]
    [EDIT Tomcraft 14.08.2019: Screenshot ergänzt.]

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

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.747
    • Geschlecht:
    Soweit ich das überblicke ist die Antwort 'Ja'.
    Und, Respekt, du hast bereist soviel Durchblick, daß du Beziehungen verstehst. In der Tat ist die von dir verlinkte Erweiterung nicht weit weg von dem was du erreichen möchtest (womit ich auf meinen update-sicheren Vorschlag dort verweise).

    Du mußt nur die richtige Query zusammenstellen und das Ergebnis in ein '<td>ERGEBNIS</td>' packen, sowie, ein wenig mehr tricky, das Javascript so anpassen, daß die Tabellenzelle an der richtigen Stelle hinzugefügt wird (außerdem der Überschrift-tr ein td hinzufügen).

    Mehr kann ich dazu auf die Schnelle und aus Zeitgründen nicht sagen.
    Sicherlich findet sich jemand anders der das weiter ausfeilt.

    Gruß,
    noRiddle

    Timm

    • Fördermitglied
    • Beiträge: 6.343
    [...]
    Du mußt nur die richtige Query zusammenstellen [...]

    :flee-mrgreen:

    Danke dir erstmal. Vielleicht findet ja jemand mal die Zeit. Noch gehts auch so, aber ist halt umständlich immer per Hand den Namen einzutippen und nachzuschauen.

    Nutze das um jede weitere Bestellung anders zu verpacken, damit es immer wieder ein neues Erlebnis beim auspacken ist.

    Gruß Timm

    Q

    • Fördermitglied
    • Beiträge: 1.502
    Ich habe vor Ewigkeiten die Druckversion der Bestellung mal auf die Wünsche des Shopbetreibers umgebaut. Damit ich die Originalversion nicht kille, habe ich das komplett separat geändert und einige Datein hinzugefügt. Da steht u.a. oben rechts auf dem Ausdruck eine Zahl in (x), die die Anzahl der Bestellungen angibt. Würde ja für diesen Zweck fast reichen, falls ihr die Bestellungen auch noch klassisch ausdruckt.

    Timm

    • Fördermitglied
    • Beiträge: 6.343
    Hallo oneQ,

    ja das würde eigentlich auch reichen. Wir drucken die Bestellung aus und nach dieser wird dann gepackt und anschließend kommt die Rechnung in den Buchhaltungsordner. Der Kunde würde diese nicht bekommen, weil der Kunde seine per pdf in der Bestellmail schon erhält.

    Könntest du deine Version hier anhängen?

    Gruß Timm

    Q

    • Fördermitglied
    • Beiträge: 1.502
    Ist aber nicht updatesicher und jetzt etwas zusammengestückelt, weil ich das nicht als "Paket" habe.

    Notiert hatte ich mir dazu noch folgendes:

    1.6.3)  Anzahl der Kundenbestellungen
    .\includes\classes\order.php

    suche:

    Code: PHP  [Auswählen]
         $this->customer = array('id' => $order['customers_id'],

    davor einfügen:

    Code: PHP  [Auswählen]
    require_once(DIR_FS_INC . 'xtc_count_customer_orders.inc.php');

    suche:

    Code: PHP  [Auswählen]
    'cIP' => $order['customers_ip']

    danach einfügen:

    Code: PHP  [Auswählen]
    'order_count' => xtc_count_customer_orders($orders_check['total'])

    An gewünschter Stelle in /templates/TEMPLATE/admin/print_order.html einfügen:

    Code: PHP  [Auswählen]
    {$order_customer.order_count}                  

    Vielleicht reicht das ja schon als Hinweis.

    Um mit der angehängten Datei klar zu kommen (habe die gerade nochmal überflogen und festgestellt das die schon etwas grausam zusammengestückelt ist...) noch die händischen Anpassungen - hoffe die sind vollständig.  :-?

    In der orders.php habe ich dann entsprechend Buttons hinzugefügt.

    Sinngemäß:

    Code: PHP  [Auswählen]
    '</a> <a class="button" target="_blank" href="'.xtc_href_link(FILENAME_ORDERS_PRINT, xtc_get_all_get_params(array ('oID')).'oID='.$oInfo->orders_id).'">'.BUTTON_PRINT.'</a>');

    und für filenames noch eine Datei in admin/includes/extras/filnames erstellt:

    Code: PHP  [Auswählen]
    <?php
    // ORDERS_PRINT by oneQ
            define('FILENAME_ORDERS_PRINT', 'orders_print.php');
    ?>

    Die anhängende Datei ist wirklich ziemlich alt (aus 2011 übernommen) und von müsste so aus modified Version 1.05 stammen. :oops: Funktioniert aber anscheinend noch. 8-)

    Also viel Spaß damit

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.747
    • Geschlecht:
    Hier mal meine Version die ähnlich herangeht wie in bereits zitiertem "Kommentare in Bestellübersicht..."
    Wie auch dort zu speichern in /admin/includes/extra/footer/.

    Code: PHP  [Auswählen]
    <?php
    /*********************************************************************
    * file: 11_total_orders_ordlist.php
    * use: display total amount of orders per customer in order listing
    * path: /admin/includes/extra/footer/
    *
    * (c) noRiddle 08-2019
    *********************************************************************/


    if(strpos($PHP_SELF, FILENAME_ORDERS) && !isset($_GET['action'])) {
        $tot_ord_debug = false; //debug ?

        xtc_db_data_seek($orders_query, 0);

        $queried_custs = array();
        $ord_cust_map = 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);

    //debug
    if($tot_ord_debug === true) {
        echo '<pre>'.print_r($ord_cust_map, true).'</pre>';
        echo '<pre>'.print_r($collect_unique_custids, true).'</pre>';
    }
     
        $how_many_orders_query = xtc_db_query("SELECT COUNT(*) AS total_orders, 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)) {
            $queried_custs[$custs_total_arr['customers_id']] = $custs_total_arr['total_orders'];
        }

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

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

        $oc.each(function(index) {
            var $tbc_dtc = $tbc.eq(index + 1).find('.dataTableContent');

            $oc.eq(index).appendTo($tbc_dtc.eq(0));
        });
       
    });
    </script>
    <?php
    }
    ?>

    Anzahl der bislang mit dem Konto getätigten Bestellungen erscheint in Klammern hinter dem Kundennamen (bei Mousover zeigt es "No. of orders").
    Es ist so gebaut, daß es mit den eingangs zitierten "Kommentare in Bestellübersicht..." kompatibel ist und zusammen funktioniert.

    Wenn man allerdings letztgenannte Implementation bereits hat sollte man die Skripte zusammenfügen, damit nicht zweimal eine Rücksetzung der $orders_query mittels xtc_db_data_seek() und die Zusweisung von Results in einer while-Schleife gemacht wird.
    Z.B. so:

    Code: PHP  [Auswählen]
    <?php
    /*********************************************************************
    * file: 12_add_to_ordlist.php
    * use: display total amount of orders per customer in order listing
    * path: /admin/includes/extra/footer/
    *
    * (c) noRiddle 08-2019
    *********************************************************************/


    if(strpos($PHP_SELF, FILENAME_ORDERS) && !isset($_GET['action'])) {
        //BOC config
        $tot_ord_debug = false; //debug ?
        $we_have_ord_comments = true;
        //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>'.print_r($ord_cust_map, true).'</pre>';
        echo '<pre>'.print_r($collect_unique_custids, true).'</pre>';
    }
     
        $how_many_orders_query = xtc_db_query("SELECT COUNT(*) AS total_orders, 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)) {
            $queried_custs[$custs_total_arr['customers_id']] = $custs_total_arr['total_orders'];
        }

    //debug
    if($tot_ord_debug === true) {
        echo '<pre>'.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");
       
            while($orders_comments = xtc_db_fetch_array($orders_history_query)) {
                $ord_comm_arr[$orders_comments['orders_id']][] = $orders_comments['comments'];
            }
           
            //echo '<pre>'.print_r($ord_comm_arr, true).'</pre>';
           
            foreach($ord_comm_arr as $ordid => $comm_arr) {
                $ord_comments = "";
               
                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>';
            }
        }

        foreach($ord_cust_map as $ordid => $custid) {
            echo '<span class="ord-tot" style="display:inline-block; padding:0 0 0 10px;" title="No. of orders">('.$queried_custs[$custid].')</span>';
        }
    ?>
    <style>
    .tooltip:hover em {bottom:auto; top:100%;}
    </style>
    <script>
    $(function() {
        var $tbc = $('.tableBoxCenter tr'),
            $ot = $('.ord-tot');
    <?php
    if($we_have_ord_comments === true) {
    ?>
        var $oc = $('.ord-comm');
    <?php
    }
    ?>

        $ot.each(function(index) {
            var $tbc_dtc = $tbc.eq(index + 1).find('.dataTableContent');

            $ot.eq(index).appendTo($tbc_dtc.eq(0));
        });
    <?php
    if($we_have_ord_comments === true) {
    ?>
        $oc.each(function(index) {
            var $tbc_dtc = $tbc.eq(index + 1).find('.dataTableContent');

            $oc.eq(index).appendTo($tbc_dtc.eq(0));
        });
    <?php
    }
    ?>
    });
    </script>
    <?php
    }
    ?>

    Wer die "Kommentare in Bestellübersicht..." nicht hat/will und lediglich die Anzahl der Bestellungen angezeigt haben möchte, stellt oben im Skript bei config $we_have_ord_comments auf false.

    Gruß,
    noRiddle

    Q

    • Fördermitglied
    • Beiträge: 1.502
    :thx:  :king:

    Vielleicht sollte ich doch zum Programmierer umschulen  :hobbyhorse:

    Timm

    • Fördermitglied
    • Beiträge: 6.343
    @noRiddle
    Ganz großes Kino. Vielen vielen Dank. Funktioniert, wenn man alle Kommentare anzeigen möchte plus die Anzahl der Bestellungen.

    Was mir beim Versuch des mergens aufgefallen ist, dass du eine deiner ersten Versionen aus dem Thread "MODUL: Kommentare in Bestellübersicht als Tooltip anzeigen für Shopversion 2.x" als Grundlage genommen hast.

    Später wurden noch mindestens folgende Stellen geändert zu:

    Code: PHP  [Auswählen]
    if(strpos($PHP_SELF, FILENAME_ORDERS) && !isset($_GET['action']) && xtc_db_num_rows($orders_query) > 0) {

    hinterer Teil zusätzlich

    und

    Code: PHP  [Auswählen]
    $orders_history_query_str = "SELECT orders_id, comments FROM " . TABLE_ORDERS_STATUS_HISTORY . " WHERE orders_id IN(".$ordc_in_str.") ORDER BY orders_id DESC, date_added ASC";
            $orders_history_query = xtc_db_query($orders_history_query_str);

    ASC hinzugefügt und der letzte Teil hinzugefügt

    Würdest du das in der Version für alle noch ergänzen? Denke auch anhand deiner Kommentare im anderen Thread, dass du das für wichtig hieltest.

    Persönliche Bitte:
    Ich habs versucht zu mergen, um nur den ersten Kommentar anzuzeigen. Manche Stellen scheinen auch klar. Aber spätestens im unteren Javascript Teil nach

    Code: PHP  [Auswählen]
    $(function() {

    sieht es bei mir ganz anders aus. Außerdem wurden auch leicht andere Variablen genutzt im neuen Modul, oder zb ein var hinzugefügt, wo ich überhaupt nicht weiß, was nun für mich richtig ist.

    Könntest du bitte meine Version für nur einen Kommmentar anpassen, damit auch die Bestellanzahl angezeigt wird?

    Anbei meine aktuellste Version:

    Code: PHP  [Auswählen]
    <?php
    /*******************************************
    * file: 10_ord_comments.php
    * use: display comments in order_listing
    * (c) noRiddle 11-2017
    * contributions: hpzeller
    *******************************************/


    if(strpos($PHP_SELF, FILENAME_ORDERS) && !isset($_GET['action']) && xtc_db_num_rows($orders_query) > 0) {

        $ordc_in_str = ''; // <= das habe ich neu eingefügt, noRiddle
        $ord_comm_arr = array();
        xtc_db_data_seek($orders_query, 0);
       
        while($ord = xtc_db_fetch_array($orders_query)) {
            $ordc_in_str .= "'".$ord['orders_id']."'".',';
        }
        $ordc_in_str = rtrim($ordc_in_str, ',');
       
        //echo '<pre>'.$ordc_in_str.'</pre>';
       
        if($ordc_in_str != '') { // <= ANFANG neue if-Clause, noRiddle  
            $orders_history_query_str = "SELECT orders_id, comments FROM " . TABLE_ORDERS_STATUS_HISTORY . " WHERE orders_id IN(".$ordc_in_str.") ORDER BY orders_id DESC, date_added ASC";
            $orders_history_query = xtc_db_query($orders_history_query_str);
           
            while($orders_comments = xtc_db_fetch_array($orders_history_query)) {
                $ord_comm_arr[$orders_comments['orders_id']][] = $orders_comments['comments'];
            }
           
            //echo '<pre>'.print_r($ord_comm_arr, true).'</pre>';
           
            foreach($ord_comm_arr as $ordid => $comm_arr) {
                $ord_comments = "";
               
                    if($comm_arr[0] != '') {
                        $ord_comments .= '<span class="ord-comment">'.nl2br($comm_arr[0]).'</span>';
                    }
           
                echo '<span class="ord-comm tooltip pos" data-ord="ord-'.$ordid.'">'.(!empty($ord_comments) ? '<img src="images/icons/comment.png"><em>'.$ord_comments.'</em>' : '').'</span>';
            }
    ?>
    <style>
    .tooltip:hover em{bottom:auto;top:100%;}
    .pos{float:right;padding-right:5px;}
    .ord-comment{display:block;margin:0 0 3px 0;padding:0 0 3px 0;}
    </style>
    <script>
    $(function() {
        /*var $tbc = $('.tableBoxCenter tbody tr'),
            $oc = $('.ord-comm');

        $oc.each(function(index) {
            var $tbc_dtc = $tbc.eq(index + 1).find('.dataTableContent');

            $oc.eq(index).appendTo($tbc_dtc.eq(0));
        });*/
       
        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 = 'ord-'+$tbc_dtc_oid;

            $tbc_dtc.eq(0).addClass($class_data_var);
           
            $('span[data-ord='+$class_data_var+']').appendTo($skip_header.find('.'+$class_data_var));
        });
    });
    </script>
    <?php
        } // <= ENDE neue if-Clause, noRiddle
    }
    ?>

    Da meine fehlenden Programmierkenntnisse ja nicht dein Problem sein sollen und ich nicht kostenlos hier was abgreifen möchte, würde ich im Gegenzug für deine Mühen eine kleine Spende an einen Empfänger deiner Wahl tätigen (dich selbst, das modified Projekt oder irgendwas anderes deiner Wahl).

    Gruß Timm

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.747
    • Geschlecht:
    Code: PHP  [Auswählen]
     && xtc_db_num_rows($orders_query) > 0

    in der anfänglichen if-Clause ist dafür da abzufangen wenn es keine Bestellungen zum Anzeigen gibt (was ja über die Filter-Funktionen oben passieren kann). Das war hpzellers sinnvolle Idee. *EDIT* Habe ich in meinen Versionen oben vergessen, sorry. *END_EDIT*

    ASC bei date_added kann man eigtl. auch weglassen da ASC der Default ist wenn nichts angegeben wird. Allerdings gibt es Aussagen im I-Net, daß man sich auf den Default nicht verlassen könne. Das ASC ist also sicherer.

    [...]
    ASC hinzugefügt und der letzte Teil hinzugefügt
    [...]

    Was du mit "...der letzte Teil hinzugefügt" meinst verstehe ich nicht.

    Das Javascript welches du hast macht eine sichere Zuordnung über den Text in der zweiten Spalte, also über die Bestellnummer (hatte ich in dem anderen Thread "MODUL: Kommentare in Bestellübersicht als Tooltip anzeigen für Shopversion 2.x" gepostet).
    Wie ich's hier jetzt habe wird sich lediglich auf die Reihenfolge der angezeigten Bestellungen verlassen, was aber auch funktioniert.

    Es ist mir jetzt zu viel Aufwand alle möglichen Versionen zu vergleichen. Das mit den Kommentaren bei den Bestellungen ist ja auch schon eine Weile her, sodaß ich mich nicht genau an alles erinnere.

    Ersetze doch einfach in meiner hier geposteten Version für beide Implementationen (also im zweiten Code in Antwort #6) diesen Code-Teil:

    Code: PHP  [Auswählen]
                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>';
                    }
                }

    hiermit:

    Code: PHP  [Auswählen]
                if($comm_arr[0] != '') {
                    $ord_comments .= '<span class="ord-comment">'.nl2br($comm_arr[0]).'</span>';
                }

    und du solltest haben was du möchtest, also lediglich den ersten (= ältesten) Kommentar angezeigt bekommen.

    Gruß,
    noRiddle

    *NACHTRAG*
    Was Spenden aus Freude über die Community-Hilfe betrifft kann, aber muß nicht, gerne an das modified-Team gespendet werden.

    Timm

    • Fördermitglied
    • Beiträge: 6.343
    Danke dir, probier ich nachher gleich aus.

    [...]
    [...]
    ASC hinzugefügt und der letzte Teil hinzugefügt
    [...]

    Was du mit "...der letzte Teil hinzugefügt" meinst verstehe ich nicht.
    [...]

    In deiner neuen Version hier heißt es:

    Code: PHP  [Auswählen]
    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");
       
            while($orders_comments = xtc_db_fetch_array($orders_history_query)) {
                $ord_comm_arr[$orders_comments['orders_id']][] = $orders_comments['comments'];
            }

    in der aktuellsten Version deiner Kommentare in Bestellung anzeigen war es so:

    Code: PHP  [Auswählen]
    $orders_history_query_str = "SELECT orders_id, comments FROM " . TABLE_ORDERS_STATUS_HISTORY . " WHERE orders_id IN(".$ordc_in_str.") ORDER BY orders_id DESC, date_added ASC";
            $orders_history_query = xtc_db_query($orders_history_query_str);
           
            while($orders_comments = xtc_db_fetch_array($orders_history_query)) {
                $ord_comm_arr[$orders_comments['orders_id']][] = $orders_comments['comments'];
            }

    Da ist das ASC zusätzlich und folgende Zeile

    Code: PHP  [Auswählen]
    $orders_history_query = xtc_db_query($orders_history_query_str);

    Für meine Version mit nur erstem Kommentar:

    Das

    Code: PHP  [Auswählen]
    $ordc_in_str = ''; // <= das habe ich neu eingefügt, noRiddle

    und

    Code: PHP  [Auswählen]
    if($ordc_in_str != '') { // <= ANFANG neue if-Clause, noRiddle
    ......
        } // <= ENDE neue if-Clause, noRiddle

    Sollte ich dennoch einfügen, oder? Das bekomm ich aber hin. Schwierig war für mich der Javascript Teil.

    BTW: Den Javascript Teil hattest du für mich angepasst, da Kommentare teilweise zu anderen Bestellungen zugeordnet wurden, wenn es keine Order history gab. Dazu hatte ich dann auch ein Ticket #1444eröffnet und in der nächsten Shopversion wird das auch gefixed sein. Also muss ich dann nachher mal schauen, ob es auch mit dem neuen Javascript funktioniert. Und andere mit Shopversion <2.0.5.0 wissen eventuell woran es liegt, wenn sie später mal hier reinschauen.

    Gruß Timm

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.747
    • Geschlecht:
    Der Unterschied in den von dir zitierten Codes ist doch lediglich der, daß im ersten Fall die Query in einem einzigen Befehl ausgeführt wird und im zweiten Fall der eigentliche Befehl erst in einen String gespeichert und dann die Query mittels xtc_db_query() ausgeführt wird. Ist egal welche Version du nimmst.

    Die Sache mit

    Code: PHP  [Auswählen]
    $ordc_in_str = '';

    und

    Code: PHP  [Auswählen]
    if($ordc_in_str != '') {

    verhält sich so:
    In der neuen kombinierten Version ist die Defintion des erstgenannten nicht mehr nötig weil die Variable anders gebildet wird.
    Das zweitgenannte ist obsolet seit es in der anfänglichen if-Clause diesen Zusatz gibt

    Code: PHP  [Auswählen]
     && xtc_db_num_rows($orders_query) > 0

    weil nun sowieso nichts ausgeführt wird wenn es keine Bestellungen zur Anzeige gibt;
    denn das war der Hintergrund für die Abfrage

    Code: PHP  [Auswählen]
    if($ordc_in_str != '') {

    Das kannst du aber doch der Diskussion im anderen Thread entnehmen.

    Okay, das mit dem Javascript ist wohl doch komplexer, ich erinnere mich, daß du, seltsamerweise, leere Order-Histories hattest.
    Ich werde später, wenn ich mehr Zeit habe, alle drei Versionen mit dem genau-zuordnenden Javascript hier posten.
    • Die Version um die es in diesem Thread geht
    • die kombinierte Version mit "Kommentare in Bestellübersicht..."
      und
    • die kombinierte Version wenn lediglich der erste Kommentar angezeigt werden soll

    Gruß,
    noRiddle

    Timm

    • Fördermitglied
    • Beiträge: 6.343
    [...]
    Das kannst du aber doch der Diskussion im anderen Thread entnehmen.
    [...]

    Das ist das blöde, wenn man keine Ahnung hat und nur abschreibt. Sorry ich hatte das so von hier (MODUL: Kommentare in Bestellübersicht als Tooltip anzeigen für Shopversion 2.x) übernommen, wo du das für mich angepasst hast, wegen der Fehlermeldung bzgl undefined variable. Hatte dir aber anscheinend eine fehlerhafte Vorlage ein paar Beiträge vorher als Ausgangsmaterial gegeben, weil mir das nicht bewusst war.

    [...]
    Okay, das mit dem Javascript ist wohl doch komplexer, ich erinnere mich, daß du, seltsamerweise, leere Order-Histories hattest.
    Ich werde später, wenn ich mehr Zeit habe, alle drei Versionen mit dem genau-zuordnenden Javascript hier posten.
    • Die Version um die es in diesem Thread geht
    • die kombinierte Version mit "Kommentare in Bestellübersicht..."
      und
    • die kombinierte Version wenn lediglich der erste Kommentar angezeigt werden soll
    [...]

     :hug: :thx:

    Gruß Timm

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.747
    • Geschlecht:
    So, here you go:

    Die Version um die es in diesem Thread geht:

    Code: PHP  [Auswählen]
    <?php
    /*********************************************************************
    * file: 11_total_orders_ordlist.php
    * use: display total amount of orders per customer in order listing
    * 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) {
        $tot_ord_debug = false; //debug ?

        xtc_db_data_seek($orders_query, 0);

        $queried_custs = array();
        $ord_cust_map = 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);

    //debug
    if($tot_ord_debug === true) {
        echo '<pre>'.print_r($ord_cust_map, true).'</pre>';
        echo '<pre>'.print_r($collect_unique_custids, true).'</pre>';
    }
     
        $how_many_orders_query = xtc_db_query("SELECT COUNT(*) AS total_orders, 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)) {
            $queried_custs[$custs_total_arr['customers_id']] = $custs_total_arr['total_orders'];
        }

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

        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;" title="No. of orders">('.$queried_custs[$custid].')</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;

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

    Die kombinierte Version mit "Kommentare in Bestellübersicht...":

    Code: PHP  [Auswählen]
    <?php
    /*********************************************************************
    * file: 12_add_to_ordlist.php
    * use: display total amount of orders per customer in order listing
    * 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 ?
        $we_have_ord_comments = true;
        //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>'.print_r($ord_cust_map, true).'</pre>';
        echo '<pre>'.print_r($collect_unique_custids, true).'</pre>';
    }
     
        $how_many_orders_query = xtc_db_query("SELECT COUNT(*) AS total_orders, 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)) {
            $queried_custs[$custs_total_arr['customers_id']] = $custs_total_arr['total_orders'];
        }

    //debug
    if($tot_ord_debug === true) {
        echo '<pre>'.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>'.print_r($ord_comm_arr, true).'</pre>';
    }

                if(!empty($ord_comm_arr)) {
                    foreach($ord_comm_arr as $ordid => $comm_arr) {
                        $ord_comments = "";
                       
                        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>';
                    }
                }
            }
        }

        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;" title="No. of orders">('.$queried_custs[$custid].')</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
    }
    ?>

    Die kombinierte Version wenn lediglich der erste Kommentar angezeigt werden soll:

    Code: PHP  [Auswählen]
    <?php
    /*********************************************************************
    * file: 12_add_to_ordlist.php
    * use: display total amount of orders per customer in order listing
    * 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 ?
        $we_have_ord_comments = true;
        //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>'.print_r($ord_cust_map, true).'</pre>';
        echo '<pre>'.print_r($collect_unique_custids, true).'</pre>';
    }
     
        $how_many_orders_query = xtc_db_query("SELECT COUNT(*) AS total_orders, 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)) {
            $queried_custs[$custs_total_arr['customers_id']] = $custs_total_arr['total_orders'];
        }

    //debug
    if($tot_ord_debug === true) {
        echo '<pre>'.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>'.print_r($ord_comm_arr, true).'</pre>';
    }

                if(!empty($ord_comm_arr)) {
                    foreach($ord_comm_arr as $ordid => $comm_arr) {
                        $ord_comments = "";
                       
                        if($comm_arr[0] != '') {
                            $ord_comments .= '<span style="display:block; margin:0 0 3px 0; padding:0 0 3px 0; border-bottom:1px dotted #000;">'.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;" title="No. of orders">('.$queried_custs[$custid].')</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
    }
    ?>

    Für die letzten beiden Versionen gilt:
    Wer die Kommentare nicht angezeigt haben möchte kann $we_have_ord_comments auf false stellen..., oder er benutzt die erste Version.

    Ich hoffe ich habe nichts übersehen.

    Gruß,
    noRiddle

    Timm

    • Fördermitglied
    • Beiträge: 6.343
    Ich habe alle 3 Varianten getestet und sie funktionieren!

    Vielen Dank für die grandiose Arbeit!!!

    Ich persönlich würde in Version 3 die dotted line entfernen, da nur ein Kommentar angezeigt wird. Und man könnte noch "use" in jeder Datei entsprechend des Zwecks ändern.

    Da images/icons/comment2.gif in einer Shopstandardversion nicht vorhanden ist, muss man das noch hochladen. Ich würde wie im Thread "MODUL: Kommentare in Bestellübersicht als Tooltip anzeigen für Shopversion 2.x" vorgeschlagen, das etwas modernere Icon bevorzugen.

    Version 3 mit den Änderungen würde so aussehen

    Code: PHP  [Auswählen]
    <?php
    /***************************************************************************************
    * file: 12_add_to_ordlist.php
    * use: display total amount of orders per customer and display first comment in order listing
    * 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 ?
        $we_have_ord_comments = true;
        //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>'.print_r($ord_cust_map, true).'</pre>';
        echo '<pre>'.print_r($collect_unique_custids, true).'</pre>';
    }
     
        $how_many_orders_query = xtc_db_query("SELECT COUNT(*) AS total_orders, 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)) {
            $queried_custs[$custs_total_arr['customers_id']] = $custs_total_arr['total_orders'];
        }

    //debug
    if($tot_ord_debug === true) {
        echo '<pre>'.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>'.print_r($ord_comm_arr, true).'</pre>';
    }

                if(!empty($ord_comm_arr)) {
                    foreach($ord_comm_arr as $ordid => $comm_arr) {
                        $ord_comments = "";
                       
                        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/comment.png" 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;" title="No. of orders">('.$queried_custs[$custid].')</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
    }
    ?>

    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.

    Gruß Timm

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.747
    • 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.343
    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.343
    Hier nun als Paket.

    Gruß Timm

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

    Tomcraft

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

    Grüße

    Torsten

    Timm

    • Fördermitglied
    • Beiträge: 6.343
    @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.343
    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.343
    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.747
    • 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.343
    Danke dir.

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.747
    • 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.343
    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.747
    • 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.343
    [...] 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.747
    • 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.747
    • Geschlecht:
    @FräuleinGarn
    Hast du nochmal geschaut ?

    Gruß,
    noRiddle

    Timm

    • Fördermitglied
    • Beiträge: 6.343
    Nein noch nicht. Brauch ich etwas Zeit zu wo ich mich auch konzentrieren kann und im Moment haben Frau und Kind Urlaub und ich komm zu nichts  :flee-mrgreen:

    Ich versuche es Abends mal die Tage. Danke dir vielmals.

    Gruß Timm

    Timm

    • Fördermitglied
    • Beiträge: 6.343
    Sorry noch keine Zeit gehabt, aber ein Fehler ist mir noch aufgefallen.

    Neueste Version von dir ist drauf mit Einstellung Kommentare anzeigen ja; erster Kommentar anzeigen ja; try_count_guest_orders ja, compare_also_cust_address nein.

    Kunde bestellt zuerst als Neuer Kunde.
    Später bestellt er nochmal als Gast.

    Dann steht bei der ersten früheren Bestellung in schwarz eine (1) und bei der zweiten neueren Bestellung als Gast eine rote (2).

    Er scheint also nur bei Gastbestellungen auch die Bestellung von neuen Kunden hinzuzuzählen, aber nicht bei Bestellung eines neuen Kunden seine Bestellungen als Gast.

    Gruß Timm

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.747
    • Geschlecht:
    Eine Vermischung von "echten" Konten und Gast-Konten ist nie beabsichtigt gewesen.
    Daß ein Kunde als Gast und mit einem "echten" Konto mit jeweils derselben Mail-Adresse bestellen kann habe ich nicht bedacht.
    Ich habe deshalb beim Zählen der Bestellungen eines Gast-Kontos noch den account_type hinzugefügt, sodaß wirklich nur Gast-Bestellungen gezählt werden und es keine Vermischung gibt.

    Es werden gezählt
    • Alle Bestellungen mit demselben "echten" Konto.
    • Wenn $try_count_guest_orders auf true steht
      • alle Bestellungen eines Gasts mit derselben E-Mail-Adresse
      • wenn außerdem $compare_also_cust_address auf true steht
        alle Bestellungen eines Gastes mit derselben E-Mail-Adresse und derselben PLZ und desselben Ortes und derselben Strasse

    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 account_type = 1
                                                                AND 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
    }
    ?>

    Natürlich kann es sein, daß man wissen will wieviele Bestellungen es gab mit ausschließlich derselben Mail-Adresse wie die in der angezeigten Bestellung verwendete, ohne Unterscheidung zwischen Gast- und "echtem" Konto.
    Das kann man sich ja erweitern wenn man das so möchte. Ich baue nicht mehr weiter daran.

    Gruß,
    noRiddle

    japadi83

    • Mitglied
    • Beiträge: 111
    • Geschlecht:
    Vielen Dank für den Code und die Anleitung noRiddle, funktioniert super!  :thumbs:

    Ich habe nun versucht die Anzahl auch auf der Bestelldetailseite (orders_info_blocks.php) einzubauen, bekomme jedoch dort kein Ergebnis angezeigt.
    Wäre es möglich die Anzahl auch dort anzeigen zu lassen?
    Da ich in der Regel die Bestellung direkt über die Berstellnummer-Suche aufrufe, wäre die Anzeige dort sehr hilfreich für mich.

    Danke und Gruß
    Patrick

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.747
    • Geschlecht:
    Für die Einzelansicht der Bestellungen müsstest du eine Datei in /admin/includes/extra/modules/orders/orders_info_blocks_end/ anlegen in welcher die nötigen Queries gemacht werden.
    Das Ergebnis in ein wenig HTML schreiben, ausgeben und mittels Javascript an die gewünschte Position schieben.

    Gruß,
    noRiddle

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.747
    • Geschlecht:
    @FräuleinGarn

    Hat sich hier eigentlich bezüglich deines Problemes mit dem Zählen der Bestellungen einzelner Kunden  noch etwas ergeben ?

    Gruß,
    noRiddle

    Timm

    • Fördermitglied
    • Beiträge: 6.343
    Natürlich kann es sein, daß man wissen will wieviele Bestellungen es gab mit ausschließlich derselben Mail-Adresse wie die in der angezeigten Bestellung verwendete, ohne Unterscheidung zwischen Gast- und "echtem" Konto.
    Das kann man sich ja erweitern wenn man das so möchte. Ich baue nicht mehr weiter daran.

    Gruß,
    noRiddle

    Ich hatte deinen letzten Satz ernst genommen und deshalb nicht weiter hier gefragt, da du schon mehr als genug getan hast. Im Verlauf der Zeit zeigt sich, dass das Modul sehr gut funktioniert und es nur bei bestimmten Konstellationen, die aber eher selten sind, nicht ganz richtig zählt. Ich hatte mir auch ein paar Beispielbestellungen dafür notiert, falls das Thema nochmal aufkommt.

    Bin grad nicht ganz im Thema drin, aber er zählt wohl nicht richtig, wenn Gast und Neukundenbestellungen eines Kunden gemischt sind. Und er zählt wohl nur nicht richtig, wenn die letzte Bestelllung eine Neukundenbestellung ist. Andersherum wenn es erst Neukunden und dann Gastbestellungen sind, dann zählt er das wohl richtig zusammen. Ich vermute, dass die Wahrscheinlichkeit höher ist, dass ein Kunde der den Shop erstmalig testet mit einer Gastbestellung und ab der zweiten Bestellung als Neuer Kunde bestellt häufiger ist, als erst als Neuer Kunde und dann als Gast. Insofern wäre es, wenn es denn kompliziert ist das in beide Richtungen richtig zu zählen, besser, wenn er bei erst Gast und dann Neuer Kunde richtig zählt.

    Auf jeden Fall nochmals vielen Dank - das Modul leistet mir gute Dienste.

    Gruß Timm

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.747
    • Geschlecht:
    "nicht ganz richtig zählt" wäre definitionswürdig.
    Da die Prüfung beim Zählen der Gast-Konten auch den account_type mit berücksichtigt (und der ist bei Gast-Konten == 1) dürfte eigtl. nichts verkehrt gezählt werden. Ich kann aber einen Denkfehler haben.
    Wenn du allerdings zufrieden bist, die mom. Funktion dir also ausreicht, will ich nichts gesagt haben.

    Gruß,
    noRiddle

    Timm

    • Fördermitglied
    • Beiträge: 6.343
    Ich bin gerade auswärts und wie gesagt nicht ganz im Thema drin. Ich glaube mich zu erinnern, dass wenn jemand bspw 3 mal als Gast bestellt hat und dann als Neuer Kunde, dass dann dort keine 4 steht sondern eine 1. Wenn jemand aber 3 mal als neuer Kunde bestellt und dann einmal als Gast, dann stünde dort eine 4. Wenn er dann wieder als Neuer Kunde bestellt würde vermutlich eine 4 dahinter stehen und nicht 5.

    Das andere Problem war wohl wenn Kunden mehrfach aber mit unterschiedlichen Emailadressen bestellen.

    Falls du irgendwann mal Zeit und Muße hast, könnte ich dir privat einen Zugang zu meinem Testshop schicken, in dem ich dann eine entsprechende Sicherung der DB einpflege, mit Angabe der entsprechenden Bestellnummern. Vielleicht ist es dann leichter nachvollziehbar. Müsste ich dann aber erstmal vorbereiten. Zur Zeit läuft da eine 2.0.5.0, die darauf wartet, dass endlich die 2.0.5.1 erscheint.

    Gruß Timm

    Andreas Kroll

    • Fördermitglied
    • Beiträge: 249
    • Geschlecht:
    Beitrag leider im falschen Thread eingefügt.
    Bitte löschen.
    MfG
    Andreas
    Shop Hosting
    1 Antworten
    2092 Aufrufe
    07. Juli 2011, 13:20:36 von Tobi1981
    23 Antworten
    9109 Aufrufe
    29. Mai 2011, 14:52:59 von Tomcraft
    94 Antworten
    40565 Aufrufe
    14. August 2019, 14:43:16 von Timm