Элемент заказа с постоянным значением настраиваемого поля
Цель
В Drupal Commerce моя цель - создать настраиваемый продукт с постоянным вводимым пользователем текстом.
Я добавил текстовое поле к типу элемента заказа, и я вижу настраиваемое поле в форме "добавить в корзину". Когда клиент вводит значение в это поле и добавляет товар в корзину, я вижу значение этого поля в представлении формы корзины.
Я хочу, чтобы в представлении формы корзины была ссылка на приобретенный объект, поэтому я проверил "Ярлык ссылки к объекту, на который ссылается" в конфигурации поля просмотра.
Когда я нажимаю на эту ссылку, я возвращаюсь на страницу своего продукта с выбранным правильным вариантом, но пользовательское текстовое поле будет пустым.
Вопрос
Как я могу сделать это пользовательское текстовое поле постоянным, то есть "сохранить" его значение, чтобы при нажатии на ссылку товара в представлении корзины я возвращался к варианту продукта с уже заполненным пользовательским текстовым полем?
Примечание: У меня может быть несколько товары/варианты в корзине, каждый с другим пользовательским текстом, поэтому мне нужно сохранить значение на уровне элемента заказа.
Что я пробовал
Я подумал о том, чтобы использовать это пользовательское значение текстового поля в качестве параметра в форме корзины, чтобы просмотреть URL-адрес ссылки на объект, поэтому я попытался переписать вывод этого поля/ссылки, но у меня нет доступа к сущности продукта из этого представления, и мне понадобится это для вычисления нового URL-адреса... так что это не сработает.
Есть идеи?
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');
}
}