Wprowadzam nową metodę wysyłki i muszę dodać nową kolumnę, aby sprawdzić stawki wysyłki. Dane pochodzą z niestandardowych ustawień metody wysyłki, na przykład opisu metody. Lub jakieś pole wejściowe, w którym klient może dodać informacje (dane prawdopodobnie zostaną zapisane w ofercie, a później w kolejności).
Prawdopodobnie najłatwiejszą częścią jest wdrożenie szablonu przy użyciu
Magento_Checkout/web/template/shipping.html
Po prostu tego potrzebuje
<div data-bind="text: method.description"></div>
Problem w tym, że nie mogę wymyślić, jak dodać niestandardowe dane. Nie wystarczy dodać to:
public function collectRates(RateRequest $request)
{
if (!$this->isActive()) return false;
$method = $this->rateMethodFactory->create();
$method->setData('carrier', $this->getCarrierCode());
$method->setData('carrier_title', $this->getConfigData('title'));
$method->setData('method_title', $this->getConfigData('title'));
$method->setData('method', $this->getCarrierCode());
$method->setPrice($this->_price);
$method->setData('cost', $this->_price);
// custom
$method->setData('description', $this->getConfigData('description'));
$result = $this->rateResultFactory->create();
$result->append($method);
return $result;
}
Dane do html pochodzą z js rate (), który pobiera dane z API:
<route url="/V1/carts/:cartId/shipping-methods" method="GET">
<service class="Magento\Quote\Api\ShippingMethodManagementInterface" method="getList"/>
<resources>
<resource ref="Magento_Cart::manage" />
</resources>
</route>
Po tym jest wiele kroków, podczas gdy coś faktycznie się zbiera. znalazłem
Magento \ Quote \ Model \ Cart \ ShippingMethodConverter modelToDataObject ()
wyglądało to najbardziej obiecująco, ale jeśli spróbuję dodać do niego mój atrybut, nic się nie stanie.
Więc moje pytanie brzmi: czy rzeczywiście istnieje sposób na dodanie nowych danych do stawek wysyłki? W M1 było to możliwe. Byłoby szalone, gdyby M2 nie było możliwe.
Jest wiele powodów, dla których powinno to być możliwe. Na przykład, jeśli chciałbym wybrać metodę odbioru w sklepie z rozwijanymi wieloma sklepami lub coś podobnego.
źródło
Odpowiedzi:
Musisz to zrobić, dodając opis jako atrybut rozszerzenia, jak poniżej:
/etc/extension_attributes.xml powinno wyglądać tak:
W pliku etc / di.xml dodaj wtyczkę do przesłonięcia modelToDataObject () w Magento \ Quote \ Model \ Cart \ ShippingMethodConverter jak poniżej:
Plik wtyczki Vendor \ module \ Plugin \ Carrier \ Description.php powinien wyglądać tak:
Po tym wszystkim otrzymasz ten opis na fronend, jak poniżej:
źródło
Odpowiedź najwyżej oceniana nie działa, ponieważ zapomniał ustawić wartość „opis” w klasie \ Magento \ Quote \ Model \ Quote \ Address \ Rate . Jeśli nie utworzymy wtyczki, aby ustawić wartość Opis dla tej klasy, wówczas $ rateModel-> getMethodDescription () zawsze zwróci pusty. Oto w pełni działająca wersja rozwiązania:
[Sprzedawca] / [Moduł] /etc/extension_attributes.xml
[Sprzedawca] / [Moduł] /etc/di.xml
[Sprzedawca] / [Moduł] /Plugin/Carrier/Description.php
I w końcu:
[Sprzedawca] / [Moduł] /Plugin/Quote/Address/Rate.php
Nie zapomnij uruchomić instalatora bin / magento: di: compile, w przeciwnym razie rozszerzony atrybut nie zostanie wygenerowany.
Możesz powiązać dane ze swoim szablonem za pomocą:
Lub jako komentarz, jak poniżej:
Nie zapomnij także użyć metody $ method-> setDescription („Twój niestandardowy opis tutaj”) lub $ method-> setData („opis”, „Twój niestandardowy opis tutaj”) wewnątrz niestandardowego rozszerzenia Carrier (spójrz na oryginalne pytanie dotyczące odniesienie).
źródło
Musisz zadeklarować nazwy metod w pliku interfejsu, ścieżka do tego pliku to
Przykład:
Stała deklaracji u góry
następnie zdefiniuj metodę w następujący sposób
Następnie musisz przypisać wartości do następującego pliku
następująco
źródło