Frage

Ich versuche, dem Kundenraster von Magento einige zusätzliche Spalten hinzuzufügen.Ich habe eine Bestellanzahl, die erfolgreich funktioniert (Gesamtanzahl der Bestellungen, die ein Kunde aufgegeben hat)

Ich versuche, das letzte Bestelldatum einzugeben, aber ich kann es nicht zum Laufen bringen.Hat das schon jemand gemacht oder kann mir jemand die richtige Richtung weisen, wie das geht?

Dies ist mein aktueller Code, aber er ist fehlerhaft und zeigt nur eine SQL-Abfrage an.

    $orderTableName = Mage::getSingleton('core/resource')
        ->getTableName('sales/order');
    $collection->getSelect()
        ->joinLeft(
            array('orders' => $orderTableName),
            'orders.customer_id=e.entity_id',
            array(
                'order_count' => 'COUNT(customer_id)',
                'last_order' => 'MAX(created_at)'
            )
        );
    $collection->groupByAttribute('entity_id');
War es hilfreich?

Lösung

Hier ist ein Arbeitsbeispiel für CE 1.8.1: generasacodicetagpre.

und generasacodicetagpre.

Der Ausgang ist

Bestellungen

Andere Tipps

Hier ist, wie ich das machen würde.
Ich würde 2 Attribute namens erstellen last_order_date und orders_count auf der Kundenentität, die nur im Backend sichtbar sind.Oder gar nicht sichtbar. Hier ist eine Möglichkeit, sie hinzuzufügen.

Das würde ich einen Beobachter auf der erstellen checkout_submit_all_after ereignis, das die Werte dieser Attribute ändern würde.
So etwas in der Art:

public function checkoutSubmitAllAfter($observer) {
    $order = $observer->getEvent()->getOrder();
    if ($order) { //if on onepage checkout;
        $customer = $order->getCustomer();
        $lastOrderDate = $order->getCreatedAt();
        $increment = 1;
    }
    else { //if on multishipping checkout
       $orders = $observer->getEvent()->getOrders();
       //get last order that's the important one;
       $order = $orders[count($orders) - 1];
       $customer = $order->getCustomer();
       $lastOrderDate = $order->getCreatedAt();
       $increment = count($orders);
    }
    if ($customer && $customer->getId()) { //check if the customer is logged in
       //make sure you have a clean instance of the customer
       //this line may not be needed. Test with it and without it.
       $customer = Mage::getModel('customer/customer')->load($customer->getId());
       //set the new values on the customer entity
       $customer->setLastOrderDate($lastOrderDate);
       $customer->setOrdersCount((int)$customer->getOrdersCount() + $increment);
       $customer->save();
    }
}

Ich habe den Code nicht getestet, daher habe ich möglicherweise etwas verpasst.

Jetzt haben Sie die Werte, die Sie für das Kundenobjekt benötigen, und Sie brauchen keine verrückte Join- oder Sortierreihenfolge und insbesondere keine group by.
Sie können fügen Sie Ihre 2 neuen Spalten hinzu im Kundenraster und Sie können sie sogar einfach sortier- und filterbar machen.

Wenn Sie bereits Kunden in Ihrer Datenbank haben, benötigen Sie ein einmaliges Skript, das die Werte für die vorhandenen Kunden festlegt.
Aber Sie können diese Werte leicht identifizieren.

Wenn Sie wie ich nur den Status "Vollständig" benötigen, fügen Sie einfach hinzu . ' AND o.status LIKE "complete" ' nach . ' WHERE o.customer_id = e.entity_id ';

Ich habe auch das gesamte vom Kunden ausgegebene Geld hinzugefügt (also die Summe aller abgeschlossenen Bestellungen)

    $total_pricesql ='SELECT sum(o.base_grand_total)'
        . ' FROM ' . Mage::getSingleton('core/resource')->getTableName('sales/order') . ' AS o'
        . ' WHERE o.customer_id = e.entity_id ' . ' AND o.status LIKE  "complete" ';
    $expr = new Zend_Db_Expr('(' . $total_pricesql . ')'); 

    $collection->getSelect()->from(null, array('total_price'=>$expr));

und später in derselben Datei

    $this->addColumn('total_price', array(
        'header' => Mage::helper('sales')->__('Total'),
        'index' => 'total_price',
        'type'  => 'number',
        'filter'    => false,
    ));

also ändere @ Amastys erste Codes:

protected function _prepareCollection() {
$collection = Mage::getResourceModel('customer/customer_collection')
    ->addNameToSelect()
    ->addAttributeToSelect('email')
    ->addAttributeToSelect('created_at')
    ->addAttributeToSelect('group_id')
    ->joinAttribute('billing_postcode', 'customer_address/postcode', 'default_billing', null, 'left')
    ->joinAttribute('billing_city', 'customer_address/city', 'default_billing', null, 'left')
    ->joinAttribute('billing_telephone', 'customer_address/telephone', 'default_billing', null, 'left')
    ->joinAttribute('billing_region', 'customer_address/region', 'default_billing', null, 'left')
    ->joinAttribute('billing_country_id', 'customer_address/country_id', 'default_billing', null, 'left');



// add 3 new fields as sub queries      
$sql ='SELECT MAX(o.created_at)'
    . ' FROM ' . Mage::getSingleton('core/resource')->getTableName('sales/order') . ' AS o'
    . ' WHERE o.customer_id = e.entity_id ' . ' AND o.status LIKE  "complete" ';
$expr = new Zend_Db_Expr('(' . $sql . ')'); 

$collection->getSelect()->from(null, array('last_order_date'=>$expr));

$sql ='SELECT COUNT(*)'
    . ' FROM ' . Mage::getSingleton('core/resource')->getTableName('sales/order') . ' AS o'
    . ' WHERE o.customer_id = e.entity_id ' . ' AND o.status LIKE  "complete" ';
$expr = new Zend_Db_Expr('(' . $sql . ')'); 

$collection->getSelect()->from(null, array('orders_count'=>$expr));

$total_pricesql ='SELECT sum(o.base_grand_total)'
    . ' FROM ' . Mage::getSingleton('core/resource')->getTableName('sales/order') . ' AS o'
    . ' WHERE o.customer_id = e.entity_id ' . ' AND o.status LIKE  "complete" ';
$expr = new Zend_Db_Expr('(' . $total_pricesql . ')'); 

$collection->getSelect()->from(null, array('total_price'=>$expr));

//echo $collection->getSelect(); exit;      

$this->setCollection($collection); return parent::_prepareCollection();}

und der zweite Code:

protected function _prepareColumns() {
$this->addColumn('entity_id', array(
    'header'    => Mage::helper('customer')->__('ID'),
    'width'     => '50px',
    'index'     => 'entity_id',
    'type'  => 'number',
));

$this->addColumn('last_order_date', array(
    'header'    => Mage::helper('customer')->__('Last Order Date'),
    'type'      => 'datetime',
    'align'     => 'center',
    'index'     => 'last_order_date',
    'gmtoffset' => true,        
));

$this->addColumn('orders_count', array(
    'header'    => Mage::helper('customer')->__('Orders Count'),
    'index'     => 'orders_count',
));

$this->addColumn('total_price', array(
    'header' => Mage::helper('sales')->__('Total'),
    'index' => 'total_price',
    'type'  => 'number',
    'filter'    => false,
));

........
........

Hier hat ich das Problem mit dem Filter- und Ordnungsarbeiten gelöst, generakodicetagcode: generasacodicetagpre.

dann auf _prepareCollection: generasacodicetagpre.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top