Drupal Commerce - добавим связь commerceproduct и displayproduct


34

Из коробки drupal commerce поддерживает связь между commerce_product и display_product только с одной стороны: cо стороны ноды (display_product). Многим этого достаточно, но бывают варианты, когда требуется при работе с продуктом получить доступ к данным из ноды. Есть один очень хороший способ наладить такую связь без больших затрат. Основан он на возможности объявлять у сущностей свои свойства.

Кстати, он реализован в модуле commerce_search_api, поэтому если у Вас установлен и включен данный модуль, то дальше можно не читать. А вот если Вы не планируете использовать в своем проекте search_api+commerce_search_api, то я просто рекомендую добавить в свой модуль две функции, приведенные ниже (код не мой, а взят из модуля commerce_search_api). 

/**
 * Implements hook_entity_property_info_alter().
 */
function ИМЯМОДУЛЯ_entity_property_info_alter(&$info) {
  // Retrieve the product display from the product.
  $properties = & $info['commerce_product']['properties'];
  foreach (field_info_fields() as $field) {
    if ($field['module'] != 'commerce_product_reference') {
      continue;
    }
    $field_name = $field['field_name'];
    foreach ($field['bundles'] as $entity_type => $bundles) {
      $properties[$field_name . '_' . $entity_type] = array(
        'description' => t('A bridge to @entity_type referenced by @field_name', array(
          '@entity_type' => $entity_type,
          '@field_name' => $field_name,
        )),
        'getter callback' => 'frz_tweaks_backreference_getter',
        'field' => $field,
        'label' => t('A bridge to @entity_type referenced by @field_name', array(
          '@entity_type' => $entity_type,
          '@field_name' => $field_name,
        )),
        'target type' => $entity_type,
        'type' => 'list<' . $entity_type . '>',
      );
    }
  }
}

/**
 * Getter callback for retrieving related entities.
 */
function frz_tweaks_backreference_getter($entity, array $options, $name, $type, $info) {
  $entities_ids = array();
  // Retrieve the field.
  $field = $info['field'];
  $entity_target_type = $info['target type'];
  $entity_wrapper = entity_metadata_wrapper($type, $entity);
  $query = new EntityFieldQuery();
  $query->entityCondition('entity_type', $entity_target_type, '=')
    ->fieldCondition($field['field_name'], 'product_id', $entity_wrapper->getIdentifier(), '=');
  $result = $query->execute();
  if (isset($result[$entity_target_type])) {
    $entities_ids = array_keys($result[$entity_target_type]);
  }
  return $entities_ids;
}

Применение

Теперь для каждого созданного вами поля с типом commerce_product_reference, будет создана обратная связь товара и ноды. Для чего это все? 

  1. Токены. Теперь у сущности commerce_product появляется возможность достучаться до всего набора токенов ноды display_product. Выглядит это примерно так [commerce-product:field-product-node:nid]. Может быть полезно, если для автоматической генерации заголовков товаров применяется модуль auto_entitylabel
  2. Views. Теперь работая в views с commerce_product вы всегда можете добавить в разделе Relationship связь с материалом, а дальше работать с его данными
  3. Entity metadata wrappers. Работаете с товаром в корзине и хотите получить доступ к данным ноды? Не проблема:

      $line_item_wrapper = entity_metadata_wrapper('commerce_line_item', $line_item);
      $product_img = $line_item_wrapper->commerce_product->field_product_node[0]->field_image->value();
    
  4. думаю, еще много интересного можно придумать
Добавить комментарий
Может быть интересно

Порядок действий для установки Solr на сервере с Centos 7

4
Модуль Migrate это фреймворк для миграции (импорта) данных в Drupal из любых источников.
1
Снова возвращаемся к migrate. Довольно удобный фреймворк для импорта данных в Друпал. Один из распространенных форматов источника для импорта - CSV. Поддерживается migrate из коробки. Описание и примеры работы с классом MigrateSourceCSV можно найти на drupal.org.
2
Иногда при разработке сайта появляется необходимость создавать отдельный шаблон для определенной ноды. По умолчанию такой возможности нет, зато можно это прикрутить самостоятельно. Как это сделать? Это можно узнать в данной статье.

В общем, проблема старая и известная. Правда не на всех рейсурсах заметная. При использовании модуля Metatag, на форму редактирования сущностей добавляется вкладка для индивидуального изменения метатегов. И на ней используется браузер токенов.

1