Moje pytanie jest proste: jak uzyskać identyfikator produktu z zamówienia handlowego z kodem Drupal? W tej chwili mam coś takiego:
$orders = commerce_order_load_multiple(array(), array('status' => 'pending'), TRUE);
foreach($orders as $order) {
foreach ($order->commerce_line_items['und'] as $line) {
$line_id = $line['line_item_id'];
// ... product id, where are you?
}
Mam nadzieję, że ktoś jest w stanie odpowiedzieć na to pytanie :)
Odpowiedzi:
Nie pamiętam dokładnej struktury pola referencyjnego produktu handlowego, ale musisz zrobić coś takiego.
Ostrzeżenie: ten styl kodu nie będzie działał na wielu zamówieniach, ponieważ wewnętrzna pamięć podręczna jednostek elementu zamówienia zużyje zbyt dużo pamięci. Będzie to problem, jeśli masz tysiące zamówień.
źródło
field_get_items()
aby pobrać elementy z pola i iterować przez to. Więcforeach ($order->commerce_line_items['und'] as $line) { ... }
staje$items = field_get_items('commerce_order', $order, 'commerce_line_items'); foreach ($items as $line) { ... }
itp Albo użycie entity_metadata_wrapper, który automatycznie wykonuje językach pod uwagę.Korzystając z opakowania metadanych encji, możesz także:
Ważną częścią jest tutaj sprawdzenie rodzaju elementu zamówienia, aby nie dopuścić do umieszczenia elementów zamówienia lub innych rodzajów elementów na liście identyfikatorów produktów. Dodatkowo, z uwagi na opakowanie, użyłem „surowej” wartości pola commerce_product w elemencie zamówienia. Wynika to z faktu, że „wartość” byłaby w pełni załadowanym produktem referencyjnym, a „surowa” wartość to po prostu identyfikator produktu.
źródło
Jeśli nie musisz ładować całych obiektów (elementów zamówienia, zamówień i produktów handlowych), możesz uruchomić zapytanie w ten sposób:
źródło
JOIN {field_data_commerce_product} p ON (p.entity_id = li.line_item_id AND p.entity_type = 'commerce_line_item')