gelöst Admin-Bestellübersicht - zusätzliche Spalte (Kundennummer)

Thema wurde von Guyonthecouch, 28. Dezember 2017 erstellt.

  1. Guyonthecouch

    Guyonthecouch Erfahrener Benutzer

    Registriert seit:
    17. September 2016
    Beiträge:
    210
    Danke erhalten:
    24
    Danke vergeben:
    93
    Hallo liebes Forum,

    kann mir einer von euch verraten, wie ich in der Bestellübersicht im Backend eine zusätzliche Spalte in die Tabelle bekomme? Ich würde gerne die Kundennummer hinzufügen.
    Welche Datei müsste ich dafür anpassen?

    Vielen Dank und Grüße
    Cedric
     
  2. Kai Stejuhn

    Kai Stejuhn Beta-Held

    Registriert seit:
    26. September 2014
    Beiträge:
    1.409
    Danke erhalten:
    709
    Danke vergeben:
    92
  3. Guyonthecouch

    Guyonthecouch Erfahrener Benutzer

    Registriert seit:
    17. September 2016
    Beiträge:
    210
    Danke erhalten:
    24
    Danke vergeben:
    93
    #3 Guyonthecouch, 29. Dezember 2017
    Zuletzt bearbeitet: 31. Dezember 2017
    Hallo Kai,

    ich habe mir das Tutorial einmal zu Gemüte geführt und umgesetzt.
    Leider bekomme ich noch nicht die Kundennummer angezeigt. Mal schauen wo mein Fehler liegt :)

    upload_2017-12-29_16-38-49.png

    Meine Dateien sehen folgendermaßen aus:

    GXUserComponents/overloads/OrdersOverviewController/CustomColumnOrdersOverviewController.inc.php
    PHP:
    <?php
    class CustomColumnOrdersOverviewController extends CustomColumnOrdersOverviewController_parent
    {
        protected function 
    _getAssetsArray()
        {
            
    $assetsArray parent::_getAssetsArray();
            
    $assetsArray[] = MainFactory::create('Asset'DIR_WS_CATALOG.'GXUserComponents/modules/add_custom_column.js');
     
            return 
    $assetsArray;
        }
    }

    GXUserComponents/overloads/OrdersOverviewColumns/CustomColumnOrdersOverviewColumns.inc.php
    PHP:
    <?php
    class CustomColumnOrdersOverviewColumns extends CustomColumnOrdersOverviewColumns_parent
    {
        public function 
    __construct()
        {
            
    parent::__construct();
     
            
    // Custom
            
    $this->columns[] = MainFactory::create('DataTableColumn')
                                          ->
    setTitle(new StringType('KdNr'))
                                          ->
    setName(new StringType('KdNr'))
                                          ->
    setType(new DataTableColumnType(DataTableColumnType::NUMBER));
        }
    }
    GXUserComponents/overloads/OrdersOverviewAjaxController/CustomColumnOrdersOverviewAjaxController.inc.php
    PHP:
    <?php
    class CustomColumnOrdersOverviewAjaxController extends CustomColumnOrdersOverviewAjaxController_parent
    {
        protected function 
    _getTableData()
        {
            
    $tableData parent::_getTableData();
     
            foreach(
    $tableData as &$row)
            {
                
    $row['KdNr'] = $row->getCustomerId();
            }
     
            return 
    $tableData;
        }
    }
    GXUserComponents/modules/add_custom_column.js
    Code:
    $(function() {
        'use strict';
    
        // Be careful to not overwrite existing object definitions.
        jse.libs.orders_overview_columns = jse.libs.orders_overview_columns || {};
    
        // Custom column definition.
        jse.libs.orders_overview_columns.KdNr = {
            data: 'KdNr',
            minWidth: '75px',
            widthFactor: 0.9
        };
    });

    Viele Grüße
    Cedric
     
  4. Guyonthecouch

    Guyonthecouch Erfahrener Benutzer

    Registriert seit:
    17. September 2016
    Beiträge:
    210
    Danke erhalten:
    24
    Danke vergeben:
    93
    Hallo zusammen,

    leider bekomme ich noch nicht die Kundennummer angezeigt. Kann mir jemand sagen, wo mein Fehler liegt?

    GXUserComponents/overloads/OrdersOverviewAjaxController/CustomColumnOrdersOverviewAjaxController.inc.php
    PHP:
    <?php
    class CustomColumnOrdersOverviewAjaxController extends CustomColumnOrdersOverviewAjaxController_parent
    {  
        protected function 
    _getTableData()
        {
            
    $tableData parent::_getTableData();
          
            foreach(
    $tableData as &$row)
            {
                
    $row['KdNr'] = $row->getCustomerId();
            }
          
            return 
    $tableData;
        }
    }
    Viele Grüße
    Cedric
     
  5. Anonymous

    Anonymous Administrator
    Mitarbeiter

    Registriert seit:
    26. April 2011
    Beiträge:
    1.668
    Danke erhalten:
    1.263
    Danke vergeben:
    300
    Hi,

    bitte probiere mal folgendes:

    PHP:
    <?php
    class CustomColumnOrdersOverviewAjaxController extends CustomColumnOrdersOverviewAjaxController_parent

        protected function 
    _getTableData()
        {
            
    $tableData parent::_getTableData();
         
            foreach(
    $tableData as $row=>$values)
            {
                
    $tableData[$row]['KdNr'] = $values['DT_RowData']['customerId'];
            }
         
            return 
    $tableData;
        }
    }
    Ist ungetestet
     
  6. Guyonthecouch

    Guyonthecouch Erfahrener Benutzer

    Registriert seit:
    17. September 2016
    Beiträge:
    210
    Danke erhalten:
    24
    Danke vergeben:
    93
    Hallo Till,

    das hat funktioniert, vielen Dank!

    Also wie ich es jetzt verstanden habe, sind die Rohdaten auch in dem $tableData-Array gespeichert, Das war mir nicht so bewusst. Aber klappt ja jetzt :)

    Viele Grüße
     
  7. Anonymous

    Anonymous Administrator
    Mitarbeiter

    Registriert seit:
    26. April 2011
    Beiträge:
    1.668
    Danke erhalten:
    1.263
    Danke vergeben:
    300
    Folgende Daten sind bereits vorhanden:

    PHP:
    'comment' 
                'customerEmail' 
                'customerId' 
                'customerMemos'
                'customerName' 
                'id'   
                'mailStatus' 
                'purchaseDate' 
                'statusId' 
                'trackingLinks' 
                'withdrawalIds'
                'paymentMethod'
                'shippingMethod'
                'country'
                'invoiceNumbers'
                'latestInvoiceId' 
                'latestInvoiceNumber'
    Weitere Daten müssen manuell beschafft werden.
     
  8. Guyonthecouch

    Guyonthecouch Erfahrener Benutzer

    Registriert seit:
    17. September 2016
    Beiträge:
    210
    Danke erhalten:
    24
    Danke vergeben:
    93
    Ah wunderbar, danke für die Aufklärung.

    Leider funktioniert die Filterfunktion noch nicht richtig. Da es ein Integer ist, wollte ich es mit "Number" filtern.
    PHP:
    ->setType(new DataTableColumnType(DataTableColumnType::NUMBER));
    Aber irgendwie klappt das nicht und er zeigt mir immer alle Datensätze an. Auch wenn ich genau eine Nummer eingebe (ohne Wildcards)... Hast du eine Idee?
     
  9. Developer

    Developer Erfahrener Benutzer

    Registriert seit:
    7. November 2012
    Beiträge:
    2.885
    Danke erhalten:
    617
    Danke vergeben:
    113
    Darf ich fragen, warum orders.customers_id an der Stelle?
     
  10. Developer

    Developer Erfahrener Benutzer

    Registriert seit:
    7. November 2012
    Beiträge:
    2.885
    Danke erhalten:
    617
    Danke vergeben:
    113
    Sehe gerade, da wurde was geändert. :rolleyes:
     
  11. Guyonthecouch

    Guyonthecouch Erfahrener Benutzer

    Registriert seit:
    17. September 2016
    Beiträge:
    210
    Danke erhalten:
    24
    Danke vergeben:
    93
    Ja, sorry, hatte es nochmal angepasst und dann hier geradegezogen gehabt :)
    Das hatte noch zu dem Versuch gehört, die richtige Kundennummer auszugeben.
     
  12. Anonymous

    Anonymous Administrator
    Mitarbeiter

    Registriert seit:
    26. April 2011
    Beiträge:
    1.668
    Danke erhalten:
    1.263
    Danke vergeben:
    300
    Es fehlt vermutlich in der Datei GXUserComponents/overloads/OrdersOverviewColumns/CustomColumnOrdersOverviewColumns.inc.php noch das Feld was mit
    ->setField(new StringType('orders.customers_id)) zugewiesen werden muss.

    PHP:
    <?php
    class CustomColumnOrdersOverviewColumns extends CustomColumnOrdersOverviewColumns_parent
    {
        public function 
    __construct()
        {
            
    parent::__construct();
            
    // Custom
            
    $this->columns[] = MainFactory::create('DataTableColumn')
                                          ->
    setTitle(new StringType('KdNr'))
                                          ->
    setName(new StringType('KdNr'))
    ->
    setField(new StringType('orders.customers_id'))
                                          ->
    setType(new DataTableColumnType(DataTableColumnType::NUMBER));
        }
    }
     
  13. Guyonthecouch

    Guyonthecouch Erfahrener Benutzer

    Registriert seit:
    17. September 2016
    Beiträge:
    210
    Danke erhalten:
    24
    Danke vergeben:
    93
    Das war's leider noch nicht :-/

    PHP:
    class CustomColumnOrdersOverviewColumns extends CustomColumnOrdersOverviewColumns_parent
    {
        public function 
    __construct()
        {
            
    parent::__construct();
           
            
    // Custom
            
    $this->columns[] = MainFactory::create('DataTableColumn')
              ->
    setTitle(new StringType('KdNr'))
              ->
    setName(new StringType('KdNr'))
              ->
    setField(new StringType('orders.customers_id'))
              ->
    setType(new DataTableColumnType(DataTableColumnType::NUMBER));
        }
    }
     
  14. Developer

    Developer Erfahrener Benutzer

    Registriert seit:
    7. November 2012
    Beiträge:
    2.885
    Danke erhalten:
    617
    Danke vergeben:
    113
    Das wird sicherlich das Problem sein.

    Von der Theorie dürfte orders.customers_id nicht funktionieren.

    Ohne es zu testen. Muss man da nicht mit customerId auf die ID zugreifen, weil sie ja darüber verfügbar ist!? Aus der Funktion _getRowData sehe ich ja auch, was zur Verfügung steht. Aber mit orders. dürfte es ja nicht funktionieren.

    Gerade auch noch eine andere Sache. Die Kundennummer ist eigentlich die customers_cid und nicht die customers_id.
     
  15. Anonymous

    Anonymous Administrator
    Mitarbeiter

    Registriert seit:
    26. April 2011
    Beiträge:
    1.668
    Danke erhalten:
    1.263
    Danke vergeben:
    300
    @Developer Das ist schon richtig so, es muss nur noch ein Overload für GXUserComponents/overloads/OrderListGenerator/CustomersIdOrderListGenerator.inc.php erstellt werden.

    PHP:
    <?php

    class CustomersIdOrderListGenerator extends CustomersIdOrderListGenerator_parent
    {
        protected function 
    _setFilterArguments(array $filterParameters,
                                               
    IntType $startIndex null,
                                               
    IntType $maxCount null,
                                               
    StringType $orderBy null)
        {
            
    parent::_setFilterArguments($filterParameters,$startIndex,$maxCount,$orderBy);
           
            
    // Filter by customer.
            
    if(!empty($filterParameters['KdNr']))
            {
               
                if(
    strpos($filterParameters['KdNr'], '#') === 0)
                {
                    
    $this->db->where('orders.customers_id'substr($filterParameters['KdNr'], 1));
                }
                else
                {
                    
    $this->db->where('orders.customers_id'$filterParameters['KdNr']);
                }
               
            }
           
           
            return 
    $this;
        }
    }
     
  16. Guyonthecouch

    Guyonthecouch Erfahrener Benutzer

    Registriert seit:
    17. September 2016
    Beiträge:
    210
    Danke erhalten:
    24
    Danke vergeben:
    93
    #16 Guyonthecouch, 31. Dezember 2017
    Zuletzt bearbeitet: 31. Dezember 2017
    Also jetzt funktioniert das Filtern schon mal direkt auf einen Wert :)
    Mit Wildcards zu filtern funktioniert leider noch nicht hmmmm....

    Die beiden IDs sind bei den Datensätzen bei mir immer dieselben. Von daher macht das denke ich keinen Unterschied.
     
  17. Anonymous

    Anonymous Administrator
    Mitarbeiter

    Registriert seit:
    26. April 2011
    Beiträge:
    1.668
    Danke erhalten:
    1.263
    Danke vergeben:
    300
    Nur eine kleine Anpassung an der GXUserComponents/overloads/OrderListGenerator/CustomersIdOrderListGenerator.inc.php und das Filtern mit Wildcards klappt dann auch:

    PHP:
    <?php

    class CustomersIdOrderListGenerator extends CustomersIdOrderListGenerator_parent
    {
        protected function 
    _setFilterArguments(array $filterParameters,
                                               
    IntType $startIndex null,
                                               
    IntType $maxCount null,
                                               
    StringType $orderBy null)
        {
            
    parent::_setFilterArguments($filterParameters,$startIndex,$maxCount,$orderBy);
         
            
    // Filter by customer.
            
    if(!empty($filterParameters['KdNr']))
            {
                
    $this->db->group_start();
                if(
    strpos($filterParameters['KdNr'], '#') === 0)
                {
                    
    $this->db->where('orders.customers_id'substr($filterParameters['KdNr'], 1))
                        ->
    or_where('orders.customers_cid'substr($filterParameters['KdNr'], 1));
                }
                else
                {
                    
    $this->db->where('orders.customers_id'$filterParameters['KdNr'])
                        ->
    or_like('orders.customers_cid'$filterParameters['KdNr'])
                        ->
    or_like('orders.customers_id'$filterParameters['KdNr']);
                }
                
    $this->db->group_end();
            }
         
            return 
    $this;
        }
    }
    Bei dieser Änderung muss man keine Wildcards eingeben. Es findet immer eine Wildcard-Suche statt. Wenn man eine ganz genaue Kundennummer suchen möchten, muss man jetzt #1 eingeben um eine exakte Übereinstimmung zu suchen.
     
  18. Guyonthecouch

    Guyonthecouch Erfahrener Benutzer

    Registriert seit:
    17. September 2016
    Beiträge:
    210
    Danke erhalten:
    24
    Danke vergeben:
    93
    Guten Morgen,

    frohes Neues miteinander !

    Funktioniert wunderbar, vielen Dank!

    Viele Grüße
    Cedric
     
  19. Anonymous

    Anonymous Erfahrener Benutzer

    Registriert seit:
    30. Oktober 2015
    Beiträge:
    2.349
    Danke erhalten:
    573
    Danke vergeben:
    506
    Also, ich habe das mal überflogen und wenn ich das jetzt bei mir auch implementieren wollen würde, hätte ich keinen blassen Schimmer, was alles wohin kopiert werden müsste.
     
  20. Developer

    Developer Erfahrener Benutzer

    Registriert seit:
    7. November 2012
    Beiträge:
    2.885
    Danke erhalten:
    617
    Danke vergeben:
    113
    GXUserComponents/overloads/deinoverloadordner/diezuüberladenedatei.inc.php