Элемент заказа с постоянным значением настраиваемого поля


Цель

В Drupal Commerce моя цель - создать настраиваемый продукт с постоянным вводимым пользователем текстом.

Я добавил текстовое поле к типу элемента заказа, и я вижу настраиваемое поле в форме "добавить в корзину". Когда клиент вводит значение в это поле и добавляет товар в корзину, я вижу значение этого поля в представлении формы корзины.

Я хочу, чтобы в представлении формы корзины была ссылка на приобретенный объект, поэтому я проверил "Ярлык ссылки к объекту, на который ссылается" в конфигурации поля просмотра.

Когда я нажимаю на эту ссылку, я возвращаюсь на страницу своего продукта с выбранным правильным вариантом, но пользовательское текстовое поле будет пустым.

Вопрос

Как я могу сделать это пользовательское текстовое поле постоянным, то есть "сохранить" его значение, чтобы при нажатии на ссылку товара в представлении корзины я возвращался к варианту продукта с уже заполненным пользовательским текстовым полем?

Примечание: У меня может быть несколько товары/варианты в корзине, каждый с другим пользовательским текстом, поэтому мне нужно сохранить значение на уровне элемента заказа.

Что я пробовал

Я подумал о том, чтобы использовать это пользовательское значение текстового поля в качестве параметра в форме корзины, чтобы просмотреть URL-адрес ссылки на объект, поэтому я попытался переписать вывод этого поля/ссылки, но у меня нет доступа к сущности продукта из этого представления, и мне понадобится это для вычисления нового URL-адреса... так что это не сработает.

Есть идеи?

Author: MrUpsidown, 2020-09-26

1 answers

Я не мог найти более элегантного способа, но это работает для меня.

Сначала я перестраиваю ссылку на приобретенный объект в представлении формы "Коммерческая корзина", чтобы включить значение пользовательского текстового поля в качестве параметра в URL-адрес ссылки, когда я возвращаюсь из корзины к варианту продукта:

/**
 * Implements hook_preprocess_views_view_field().
 */
function MYMODULE_preprocess_views_view_field(&$variables) {

  $view = $variables['view'];
  $field = $variables['field'];

  // Commerce cart form
  if (isset($view) && ($view->id() === 'commerce_cart_form')) {

    switch($field->field) {
      case 'purchased_entity':

        // Get purchased entity
        $purchased_entity = $variables['row']->_relationship_entities['order_items']->purchased_entity->getValue();
        $purchased_entity_id = $purchased_entity[0]['target_id'];

        // Load product variation
        $product_variation = $variation = ProductVariation::load($purchased_entity_id);

        // Get product variation URL
        $url = Url::fromUserInput($product_variation->toLink()->getUrl()->toString());

        // Get custom field value
        $custom_field = $variables['row']->_relationship_entities['order_items']->field_custom->getValue();

        // Rebuild url with variation & custom field value
        $url->setOption('query', [
          'v' => $purchased_entity_id,
          'custom' => $custom_field[0]['value'],
        ]);

        // Output
        $variables['output'] = Link::fromTextAndUrl(t($product_variation->label()), $url);

        break;
    }
  }
}

Это выведет ссылку, такую как /product/1?v=2&custom=MYVALUE

А затем в форме добавить товар в корзину, если параметр указан в URL-адресе, я устанавливаю значение по умолчанию для настраиваемого поля:

/**
 * Implements hook_form_alter().
 */
function MYMODULE_form_alter(&$form, FormStateInterface $form_state, $form_id) {

  if (strpos($form_id, 'commerce_order_item_add_to_cart_form_commerce_product_') !== false) {

    // Set custom text form field value from URL
    $form['field_custom']['widget'][0]['value']['#default_value'] = \Drupal::request()->query->get('custom');
  }
}
 1
Author: MrUpsidown, 2020-09-28 20:23:57