2012-12-30 21 views
16

Zajmuję się tworzeniem skryptu (poza Magento, a nie modułem), którego celem jest wydrukowanie listy tekstowej wszystkich dostępnych produktów, ich cen i niektórych innych atrybutów . Jednak zasady cen katalogowych nie wydają się być stosowane do cen produktów. Jeśli używam któregokolwiek z poniższych:Magento: jak uzyskać cenę produktu z zastosowanymi regułami katalogowymi

$_product->getPrice() 
$_product->getFinalPrice() 

Dostaję normalną cenę (bez uwzględnienia reguł).

Jeśli używam:

$_product->getSpecialPrice() 

uzyskać NULL chyba że produkt rzeczywiście ma specjalną cenę włożonej do samego produktu (czyli jeśli cena specjalna nie jest związane z zasadami katalogu).

Próbowałem też

Mage::getModel('catalogrule/rule')->calcProductPriceRule($product,$product->getPrice()) 

jak zasugerowano w odpowiedzi udzielonej przez Fabian Blechschmidt, ale co ciekawe zwraca normalnej ceny tylko wtedy, gdy produkt jest pod wpływem jakiejkolwiek reguły katalogowej, wracając NULL inaczej.

Było podobne pytanie w StackOverflow i Magento Forums jakiś czas temu, ale dostarczona odpowiedź (która ma na celu wstawienie kodu poniżej) nie działa dla mnie (zwrócone ceny pozostają takie same).

Mage::app()->loadAreaPart(Mage_Core_Model_App_Area::AREA_FRONTEND,Mage_Core_Model_App_Area::PART_EVENTS); 

Czy ktoś ma pomysł, jak to osiągnąć?

Używam Magento 1.6.2.0. Z góry dzięki.

+2

Być może jest coś jeszcze, co się dzieje przy twoich danych lub indeksowaniu. Czy obniżona cena jest wyświetlana zgodnie z oczekiwaniami w domyślnym motywie ze wszystkimi niestandardowymi modułami wyłączonymi? – benmarks

+0

Tak, obniżone ceny wyświetlają Ok w interfejsie. Problem polegał na tym, że nie był to moduł Magento, lecz "zewnętrzny" skrypt. Wygląda na to, że Magento ładuje dodatkowe rzeczy, które są niezbędne, aby wszystko działało prawidłowo. Innymi słowy, wszystko w Magento musi naprawdę być modułem ... – faken

+1

* "wszystko w Magento musi naprawdę być modułem" * - Niezupełnie. Istnieje jednak wiele modułów, które wchodzą w interakcje na wiele sposobów, gdy aplikacja jest wykonywana. Sprawdziłbym, że instancja 'Mage_CatalogRule_Model_Observer' tworzy instancję. Być może powinieneś wkleić odpowiednie części zdalnego skryptu ('Mage :: app()' tworzenie instancji, 'loadAreaPart()' wywołanie, ładowanie produktu, itp.) – benmarks

Odpowiedz

10

odkryłem problem. Zdyskontowane ceny wyświetlają Ok w interfejsie sklepu. Problemem było to, że opracowanie scenariusza „zewnętrzne” do Magento (a więc nie modułu Magento), coś jak:

<?php 

set_time_limit(0); 
ignore_user_abort(); 
error_reporting(E_ALL^E_NOTICE); 
header("Content-Type: text/plain; charset=utf-8"); 

require_once "app/Mage.php"; 

// Get default store code 
$default_store = Mage::app()->getStore(); 
... 

za wszystko działać prawidłowo wydaje się, że trzeba podążać właściwą bootstrap Magento i rozwijać wszystko jako moduł. Mój skrypt był tak prosty, że pomyślałem, że nie będzie konieczne kodowanie pełnego modułu. Innymi słowy, wszystko w Magento powinno być naprawdę modułem.

Podsumowując, stosując podejście moduł, wszystkie metody działają zgodnie z oczekiwaniami:

$_product->getPrice() 
$_product->getFinalPrice() 
$_product->getSpecialPrice() 

Dziękuję wszystkim za wejście.

18

Dzięki Wam, znalazłem nową witrynę: http://www.catgento.com/magento-useful-functions-cheatsheet/

A oni wymienić:

Mage::getModel('catalogrule/rule')->calcProductPriceRule($product,$product->getPrice()) 

HTH

+0

Cześć, dziękuję za odpowiedź (tęskniłem za tą stroną w moich wyszukiwaniach). Wydaje mi się, że jest to dokładnie to, czego potrzebuję, ale to nie działa: ceny zwracane są takie same jak ceny pierwotne (i nie zwracają żadnej ceny, jeśli na produkt nie ma wpływu żadna reguła, chociaż później można łatwo rozwiązać). Patrzę na kod z Mage_CatalogRule_Model_Rule i powiązanych klas, wydaje się, że robię to, co chcę, ale tak nie jest. Próbowałem również opróżnić pamięć podręczną, reindeks itp., Ale wynik jest zawsze taki sam. Jeszcze raz dziękuję. – faken

+0

spróbuj załadować produkt wcześniej $ _product-> load ($ _ product-> getId()), jeśli to działa, to tracisz atrybut. STOP DONT STOP w tym punkcie. Sprawdź, którego atrybutu brakuje i dodaj go do kolekcji. kod, który wysłałeś, wygląda jak view.phtml lub coś takiego, możesz po prostu zmienić ustawienia atrybutów w backend. –

+0

Próbowałem użyć tego, ale pojawia się ten błąd: Niepoprawna metoda Mage_CatalogRule_Model_Rule :: calcProductPriceRule Cokolwiek mogę tam zrobić? – Klettseb

9

Jako zasady cenowe Katalog silnie zależą od czasu, przechowywania i wizyty klienta, musisz ustawić te parametry, aby pobrać ostateczną cenę produktu z zastosowanymi regułami ceny.

Więc w twoim przypadku, upewnij się, że pod warunkiem, produkt jest przekazywany z pożądanym sklepu i id grupy klientów, która może być ustawiony jako:

Mage::getModel('catalogrule/rule')->calcProductPriceRule($product->setStoreId('STORE_ID')->setCustomerGroupId('CUSTOMER_GROUP_ID'),$product->getPrice()) 
+0

Zadziałało. Dzięki. –

+0

Wielkie dzięki. Miałem problem, że Cronjob z rozszerzenia eksportu Feed Lengow nie uznał reguł katalogowych poprawnie dla eksportu cen. Po zastosowaniu metody setCustomerGroupId() do instancji produktu działało dobrze. Myślę, że to rozwiązanie jest o wiele lepsze niż symulowanie frontendów sklepu przez Mage :: app() -> loadAreaPart() itp. –

10

Pomogło mi to w tym numerze: http://www.magentocommerce.com/boards/viewthread/176883/ . Rozwiązanie Jernej wydaje się wiarygodne, ale nie obsługuje reguł, które nadpisują inne reguły za pomocą "zatrzymania przetwarzania" i dlatego może zastosować więcej niż jedną regułę.

$original_price = $_product->getPrice(); 
$store_id = 1; // Use the default store 
$discounted_price = Mage::getResourceModel('catalogrule/rule')->getRulePrice( 
         Mage::app()->getLocale()->storeTimeStamp($store_id), 
         Mage::app()->getStore($store_id)->getWebsiteId(), 
         Mage::getSingleton('customer/session')->getCustomerGroupId(), 
         $_product->getId()); 

// if the product isn't discounted then default back to the original price 
if ($discounted_price===false) { 
    $discounted_price=$original_price; 
} 
+0

Chociaż odpowiedź Fakena jest właściwą metodą. Jeśli chcesz być buntownikiem, to działa. –