Передача токенов товара в его дисплей

Главные вкладки

Аватар пользователя kuzmich111 kuzmich111 1 октября 2019 в 13:24

Имеются установленные Drupal 7 + commerce. У товара несколько атрибутов. Пути вариаций товара формируются через Commerce Product URLs. Имеют вид:
/node/10?id=16
/node/10?id=17
/node/10?id=18 и .т.д.

Установлен модуль Metatag. Нужно: в title дисплея товара потянуть артикул вариации товара, которая отображается по текущему url. Думал через токен [commerce-product:sku], но в дисплее товара такой токен прописать не даёт. Удалось только через [node:field-product:0:sku], но он всегда передает первую вариацию.

Подскажите, в какую сторону лучше двигаться? Рассматриваю варианты:

  1. Накодить свой токен
  2. Чего-нибудь похукать
  3. Как-то определять правильный номер вариации для [node:field-product:?:sku]
  4. Или я где-то чего-то упустил и всё решается штатными токенами
  5. Другой вариант

Должно работать так:
Переходим /node/10?id=16 в title видим "Качественный товар 000016 купить недорого..."
Переходим /node/10?id=17 в title видим "Качественный товар 123017 купить недорого..."

Лучший ответ

Аватар пользователя kuzmich111 kuzmich111 2 октября 2019 в 9:23

Изваял такой токен:

/**
 * Implements hook_token_info().
 */

function mymodule_token_info() {
  return array(
    'tokens' => array(
      'node' => array(
        'product' => array(
          'name' => t('Product reference'),
          'description' => t('Product referenced via field_product'),
          'type' => 'commerce-product',
        ),
      ),
    ),
  );
}

/**
 * Implements hook_tokens().
 */

function mymodule_tokens($type, $tokens, array $data = array(), array $options = array()) {
  $replacements = array();

  if ($type == 'node' && !empty($data['node'])) {
    $node = $data['node'];

    if (isset($node->field_product) && $p_tokens = token_find_with_prefix($tokens, 'product')) {
      $parsed_url = drupal_parse_url(request_uri());
      if (isset($parsed_url['query']['id'])) {
        foreach ($node->field_product[LANGUAGE_NONE] as $delta => $f_p) {
          if ($parsed_url['query']['id'] == $f_p['product_id']) {
            $product = entity_metadata_wrapper('commerce_product', $f_p['product_id'])->value();
            $replacements += token_generate('commerce-product', $p_tokens, array('commerce-product' => $product), $options);
            break;
          }
        }
      }
    }
  }

  return $replacements;
}

Можно использовать любые поля товара: [node:product:sku], [node:product:title], и т.д.

Комментарии

Аватар пользователя kuzmich111 kuzmich111 2 октября 2019 в 9:23

Изваял такой токен:

/**
 * Implements hook_token_info().
 */

function mymodule_token_info() {
  return array(
    'tokens' => array(
      'node' => array(
        'product' => array(
          'name' => t('Product reference'),
          'description' => t('Product referenced via field_product'),
          'type' => 'commerce-product',
        ),
      ),
    ),
  );
}

/**
 * Implements hook_tokens().
 */

function mymodule_tokens($type, $tokens, array $data = array(), array $options = array()) {
  $replacements = array();

  if ($type == 'node' && !empty($data['node'])) {
    $node = $data['node'];

    if (isset($node->field_product) && $p_tokens = token_find_with_prefix($tokens, 'product')) {
      $parsed_url = drupal_parse_url(request_uri());
      if (isset($parsed_url['query']['id'])) {
        foreach ($node->field_product[LANGUAGE_NONE] as $delta => $f_p) {
          if ($parsed_url['query']['id'] == $f_p['product_id']) {
            $product = entity_metadata_wrapper('commerce_product', $f_p['product_id'])->value();
            $replacements += token_generate('commerce-product', $p_tokens, array('commerce-product' => $product), $options);
            break;
          }
        }
      }
    }
  }

  return $replacements;
}

Можно использовать любые поля товара: [node:product:sku], [node:product:title], и т.д.