Neuigkeiten
  • Die modified eCommerce Shopsoftware ist kostenlos, aber nicht umsonst.
  • Damit wir die modified eCommerce Shopsoftware auch zukünftig kostenlos anbieten können:

Autor Thema: MODUL: Anzahl Bestellungen eines Kunden in Bestellübersicht anzeigen  (Gelesen 1760 mal)

Offline FräuleinGarn

  • Fördermitglied
  • *****
  • Beiträge: 3.330
    • Teile Beitrag
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

Offline noRiddle

  • Experte
  • *****
  • Beiträge: 10.176
  • Geschlecht: Männlich
    • Teile Beitrag
Re: MODUL: Anzahl Bestellungen eines Kunden in Bestellübersicht anzeigen
« Antwort #1 am: 09. August 2019, 22:46:49 »
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

Offline FräuleinGarn

  • Fördermitglied
  • *****
  • Beiträge: 3.330
    • Teile Beitrag
Re: MODUL: Anzahl Bestellungen eines Kunden in Bestellübersicht anzeigen
« Antwort #2 am: 10. August 2019, 20:47:57 »
[...]
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

Offline oneQ

  • Viel Schreiber
  • *****
  • Beiträge: 584
    • Teile Beitrag
Re: MODUL: Anzahl Bestellungen eines Kunden in Bestellübersicht anzeigen
« Antwort #3 am: 10. August 2019, 21:40:08 »
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.

Offline FräuleinGarn

  • Fördermitglied
  • *****
  • Beiträge: 3.330
    • Teile Beitrag
Re: MODUL: Anzahl Bestellungen eines Kunden in Bestellübersicht anzeigen
« Antwort #4 am: 10. August 2019, 21:47:53 »
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

Offline oneQ

  • Viel Schreiber
  • *****
  • Beiträge: 584
    • Teile Beitrag
Re: MODUL: Anzahl Bestellungen eines Kunden in Bestellübersicht anzeigen
« Antwort #5 am: 10. August 2019, 22:18:02 »
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

Offline noRiddle

  • Experte
  • *****
  • Beiträge: 10.176
  • Geschlecht: Männlich
    • Teile Beitrag
Re: MODUL: Anzahl Bestellungen eines Kunden in Bestellübersicht anzeigen
« Antwort #6 am: 11. August 2019, 13:11:59 »
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

Offline oneQ

  • Viel Schreiber
  • *****
  • Beiträge: 584
    • Teile Beitrag
Re: MODUL: Anzahl Bestellungen eines Kunden in Bestellübersicht anzeigen
« Antwort #7 am: 11. August 2019, 14:31:52 »
:thx:  :king:

Vielleicht sollte ich doch zum Programmierer umschulen  :hobbyhorse:

Offline FräuleinGarn

  • Fördermitglied
  • *****
  • Beiträge: 3.330
    • Teile Beitrag
Re: MODUL: Anzahl Bestellungen eines Kunden in Bestellübersicht anzeigen
« Antwort #8 am: 12. August 2019, 12:15:18 »
@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

Offline noRiddle

  • Experte
  • *****
  • Beiträge: 10.176
  • Geschlecht: Männlich
    • Teile Beitrag
Re: MODUL: Anzahl Bestellungen eines Kunden in Bestellübersicht anzeigen
« Antwort #9 am: 12. August 2019, 13:39:52 »
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.

Offline FräuleinGarn

  • Fördermitglied
  • *****
  • Beiträge: 3.330
    • Teile Beitrag
Re: MODUL: Anzahl Bestellungen eines Kunden in Bestellübersicht anzeigen
« Antwort #10 am: 12. August 2019, 14:38:48 »
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

Offline noRiddle

  • Experte
  • *****
  • Beiträge: 10.176
  • Geschlecht: Männlich
    • Teile Beitrag
Re: MODUL: Anzahl Bestellungen eines Kunden in Bestellübersicht anzeigen
« Antwort #11 am: 12. August 2019, 15:02:03 »
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

Offline FräuleinGarn

  • Fördermitglied
  • *****
  • Beiträge: 3.330
    • Teile Beitrag
Re: MODUL: Anzahl Bestellungen eines Kunden in Bestellübersicht anzeigen
« Antwort #12 am: 12. August 2019, 15:29:00 »
[...]
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

Offline noRiddle

  • Experte
  • *****
  • Beiträge: 10.176
  • Geschlecht: Männlich
    • Teile Beitrag
Re: MODUL: Anzahl Bestellungen eines Kunden in Bestellübersicht anzeigen
« Antwort #13 am: 13. August 2019, 20:12:27 »
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

Offline FräuleinGarn

  • Fördermitglied
  • *****
  • Beiträge: 3.330
    • Teile Beitrag
Re: MODUL: Anzahl Bestellungen eines Kunden in Bestellübersicht anzeigen
« Antwort #14 am: 13. August 2019, 22:54:07 »
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

600x250

Teile per facebook Teile per linkedin Teile per twitter