2012-06-19 34 views
6

Muszę przedłużyć koszyk na zakupy Magento, aby dodać dodatkowy krok do lokalizatora sklepu. Rozumiem, że muszę zastąpić podstawowy kontroler OnePage (Mage_Checkout_OnepageController) i bloki (Mage_Checkout_Block_Onepage), ale co należy zrobić w odniesieniu do śledzenia dodatkowych informacji (np. Wybranych przez użytkownika opcji z mojego niestandardowego kroku).Przedłużanie koszyka produktów Magento

Odpowiedz

15

Aby uzyskać całe rozwiązanie, należy wykonać kilka kroków.

Najpierw utwórz nowy moduł. Jeśli chcesz, użyj ModuleCreator.

Następnie napisać setup script w module, aby dodać nowe pola do struktury atrybutu Magento, na przykład :

$setup = new Mage_Sales_Model_Mysql4_Setup('core_setup'); 
$setup->startSetup(); 

$setup->addAttribute('quote', 'my_attribute', array('type' => 'varchar', 'visible' => false, 'required' => false)); 
$setup->addAttribute('order', 'my_attribute', array('type' => 'varchar', 'visible' => false, 'required' => false)); 
$setup->addAttribute('invoice', 'my_attribute', array('type' => 'varchar', 'visible' => false, 'required' => false)); 
$setup->addAttribute('creditmemo', 'my_attribute', array('type' => 'varchar', 'visible' => false, 'required' => false)); 

Uwaga użycie Mage_Sales_Model_Mysql4_Setup dodanie pól do odpowiednich sales_flat_quote i sales_flat_order tabelach.

Teraz wstaw następujące wartości w pliku config.xml modułu:

<global> 

    <fieldsets> 
     <sales_convert_quote> 
      <my_attribute> 
       <to_order>*</to_order> 
      </my_attribute> 
     </sales_convert_quote> 
     <sales_convert_order> 
      <my_attribute> 
       <to_cm>*</to_cm> 
       <to_invoice>*</to_invoice> 
      </my_attribute> 
     </sales_convert_order> 
    </fieldsets> 

To poinstruuje Magento skopiować wartości niestandardowego pola z cytatem zamówić do faktury i credit_memo itp

Następnie w swoim niestandardowym kodzie blokowym/kontrolnym będziesz mógł użyć magicznych modułów pobierających i ustawiających Magento, aby zachować wartości.

$oQuote = Mage::getSingleton('checkout/session')->getQuote(); 
$oQuote->setMyAttribute('some_value'); 
$oQuote->save(); 

Powinieneś zobaczyć nową kolumnę i wartość zapisaną w sales_flat_quote. Następnie, gdy klient zakończy kasę, ta sama wartość powinna zostać zapisana w sales_flat_order.

Zauważ, że powyższy kod może zostać przedłużony do pracy quote_item i order_item po prostu zmieniając quote do quote_item etc, jeśli jednak chcesz zapisać wartości, które zostały ustawione na swoich produktów atrybutów, wtedy wymagane jest kilka dodatkowych prac.

Włóż nowy blok XML do swojego config.xml (znowu wewnątrz węzła globalnej):

<sales> 
     <quote> 
      <item> 
       <product_attributes> 
        <my_attribute /> 
       </product_attributes> 
      </item> 
     </quote> 
    </sales> 

Gdzie my_attribute jest kod atrybutu na modelu produktu. Że uczyni my_attribute dostępny na połączonego produktu, dzięki czemu można uzyskać do niego dostęp za pośrednictwem

$oQuoteItem->getProduct()->getMyAttribute() 

bez potrzeby wykonywania pełnej Mage::getModel('catalog/product')->load($oQuoteItem->getProductId()). Jest to o wiele bardziej wydajne.

Następnie potrzebny będzie obserwator, który skopiuje wartości z obiektu produktu do obiektu quote_item. Więc zadeklarować swój obserwatora w config.xml:

<events> 
     <sales_quote_item_set_product> 
      <observers> 
       <quoteitem_set_custom_data> 
        <type>singleton</type> 
        <class>mymodule/observer</class> 
        <method>setCustomDataOnQuoteItem</method> 
       </quoteitem_set_custom_data> 
      </observers> 
     </sales_quote_item_set_product> 
    <events> 

i napisać kod w swojej klasie obserwatora tak:

public function setCustomDataOnQuoteItem($oObserver){ 
    $oProduct = $oObserver->getProduct(); 
    $oQuoteItem = $oObserver->getQuoteItem(); 
    foreach(array('my_attribute') as $vAttributeCode){ 
     $oQuoteItem->setData($vAttributeCode,$oProduct->getData($vAttributeCode)); 
    } 
} 
+0

Dlaczego nikt stworzenia blogu jako jasny i pełny, jak to zrobiłeś ?? Spędziłem 2h szukając twojej odpowiedzi! Dzięki ! – LittleBigDev

Powiązane problemy