Мой вопрос прост: как мне получить идентификаторы продукта из коммерческого заказа с кодом Drupal? У меня сейчас что-то вроде этого:
$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?
}
Надеюсь, кто-нибудь сможет ответить на этот вопрос :)
Ответы:
Я не могу вспомнить точную структуру ссылочного поля коммерческого продукта, но вам нужно сделать что-то подобное.
Предупреждение, этот стиль кода не будет работать для многих заказов, поскольку внутренний кэш для сущностей позиций будет использовать слишком много памяти. Это будет проблемой, если у вас есть тысячи заказов.
источник
field_get_items()
чтобы получить элементы из поля и вместо этого выполнить итерацию. Такforeach ($order->commerce_line_items['und'] as $line) { ... }
становится$items = field_get_items('commerce_order', $order, 'commerce_line_items'); foreach ($items as $line) { ... }
и т. Д. Или используйте entity_metadata_wrapper, который автоматически учитывает языки.Используя обертку метаданных сущности, вы также можете сделать:
Важной частью здесь является проверка типа позиции, поэтому вы не должны включать позиции отгрузки или другие типы позиций в свой список идентификаторов продуктов. Кроме того, заметив, что я использовал «сырое» значение поля commerce_product в позиции. Это связано с тем, что «value» будет полностью загруженным ссылочным продуктом, а «raw» - просто идентификатором продукта.
источник
Если вам не нужно загружать целые объекты (позиции, заказы и коммерческие продукты), вы можете выполнить запрос следующим образом:
источник
JOIN {field_data_commerce_product} p ON (p.entity_id = li.line_item_id AND p.entity_type = 'commerce_line_item')