Вы здесь

Drupal Commerce: ограничение атрибутов line item в продукте

Столкнулся с такой задачей: есть товары нескольких типов, у каждого товара несколько атрибутов ("размер", "длина", "ширина" и т.п.), выводимых в line item, и которые нужно ограничить в товаре. Решается она через hook_form_alter. Рассмотрим универсальный вариант на случай, если будут добавляться новые атрибуты, но есть одно условие - имя поля товара должно совпадать с именем поля line item + в конце добавляются символы "_p" для уникальности поля:

function MODULE_NAME_form_alter(&$form, &$form_state, $form_id) {
  if (strpos($form['#form_id'], 'commerce_cart_add_to_cart_form_') !== false) {
    $pid = isset($form['product_id']['#value'])?$form['product_id']['#value']:$form['product_id']['#default_value']; // id продукта
    $cur_prod = commerce_product_load($pid); // получаем текущий продукт
    $prod = array();

    // смотрим все поля продукта
    foreach ($cur_prod as $key => $field) {
      // смотрим поля, начинающиеся с 'field_'
      if (strpos($key, 'field_') !== false) {
        // проверяем, есть ли удовлетворяющие нас поля
        if (substr($key, -2) == '_p') {
          $key = substr($key, 0, -2);
          if (isset($field['und'])) {
            $prod[$key]['key'] = $key;
            foreach($field['und'] as $value) {
              $prod[$key]['tids'][$value['tid']] = $value['tid'];
            }
          }
        }
      }
    }

    // просматриваем все поля line items'а
    foreach ($form['line_item_fields'] as $key => $field) {
      // получаем все поля из line items, добавленные вручную
      if (strpos($key, 'field_') !== false) {
        $real_opt = array();
        if (isset($prod[$key])) {
          foreach ($field['und']['#options'] as $opt_key => $value) {
            foreach ($prod[$key]['tids'] as $prod_tid) {
              if ($prod_tid == $opt_key) {
                $real_opt[$prod_tid] = $value; // выявляем совпадающие термины, заносим их в массив
              }
            }
          }
        }
        // если в данном поле нужно вносить изменения...
        if (!empty($real_opt)) {
          // переопределям выбор опций
          unset($form['line_item_fields'][$key]['und']['#options']);
          $form['line_item_fields'][$key]['und']['#options']['_none'] = '- Выберите значение -';
          foreach ($real_opt as $real_opt_key => $value) {
            $form['line_item_fields'][$key]['und']['#options'][$real_opt_key] = $value;
          }
        }
      }
    }
  }
}
Актуально для: 
Орфографическая ошибка в тексте:
Чтобы сообщить об ошибке автору, нажмите кнопку "Отправить сообщение об ошибке". Вы также можете отправить свой комментарий.