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

Thema wurde von Guyonthecouch, 28. Dezember 2017 erstellt.

  1. Guyonthecouch

    Guyonthecouch Erfahrener Benutzer

    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

  3. Guyonthecouch

    Guyonthecouch Erfahrener Benutzer

    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
     
    Zuletzt bearbeitet: 31. Dezember 2017
  4. Guyonthecouch

    Guyonthecouch Erfahrener Benutzer

    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

    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

    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

    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

    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

    Darf ich fragen, warum orders.customers_id an der Stelle?
     
  10. Developer

    Developer Erfahrener Benutzer

    Sehe gerade, da wurde was geändert. :rolleyes:
     
  11. Guyonthecouch

    Guyonthecouch Erfahrener Benutzer

    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

    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

    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

    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

    @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

    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.
     
    Zuletzt bearbeitet: 31. Dezember 2017
  17. Anonymous

    Anonymous Administrator Mitarbeiter

    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

    Guten Morgen,

    frohes Neues miteinander !

    Funktioniert wunderbar, vielen Dank!

    Viele Grüße
    Cedric
     
  19. Anonymous

    Anonymous Erfahrener Benutzer

    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

    GXUserComponents/overloads/deinoverloadordner/diezuüberladenedatei.inc.php