Рейтинг:0

Поток оформления заказа Флажок отправки формы панели в логическое поле

флаг br

Я создаю Checkbox в Checkout Flow, CheckoutPane. Как я могу отправить значение флажка объекту в профиле пользователя или заказе.

Описание: мне нужен флажок в CheckoutPane, когда клиент выбирает флажок и нажимает кнопку «Отправить», я должен сохранить значение в поле в заказе или профиле конкретного пользователя с датой. Когда клиент устанавливает флажок в первый раз, он скрыт для будущих заказов.

Флажок печатается правильно, но не может отправить значение флажка объекту по порядку или, лучше, объекту в профиле пользователя. Я создаю поле field_customer_check в заказе и пробую его так же, как в примере потока проверки Drupal Commerce с комментариями. https://docs.drupalcommerce.org/commerce2/developer-guide/checkout/create-custom-checkout-pane

публичная функция submitPaneForm (массив и $pane_form, FormStateInterface $form_state, массив и $complete_form) {
  $values ​​= $form_state->getValue($pane_form['#parents']);
  $this->order->setData('order_comment', $values['comment']);
}

введите описание изображения здесь

введите описание изображения здесь Вот мой предыдущий код для CheckoutPane:

<?php

пространство имен Drupal\mymodule_checkout\Plugin\Commerce\CheckoutPane;

используйте Drupal\commerce_checkout\Plugin\Commerce\CheckoutPane\CheckoutPaneBase;
используйте Drupal\commerce_checkout\Plugin\Commerce\CheckoutPane\CheckoutPaneInterface;
используйте Drupal\Core\Form\FormStateInterface;
используйте Drupal\commerce\InlineFormManager;
используйте Drupal\Core\Entity\EntityTypeManagerInterface;
используйте Symfony\Component\DependencyInjection\ContainerInterface;
используйте Drupal\commerce_checkout\Plugin\Commerce\CheckoutFlow\CheckoutFlowInterface;


/**
 * Предоставляет панель сообщений о завершении.
 *
 * @CommerceCheckoutPane(
 * id = "согласен_условиям",
 * label = @Translation("Постоянное согласие"),
 * )
 */
класс AgreeTerms расширяет CheckoutPaneBase, реализует CheckoutPaneInterface {
общедоступная функция buildPaneForm (массив $pane_form, FormStateInterface $form_state, массив и $complete_form) {
    $order_id = $this->order->id();

        $pane_form['user_check_accept'] = [
          '#type' => 'флажок', 
          '#default_value' => ЛОЖЬ,
          '#title' =>$this->t('Название моего флажка'),
          '#required' => ЛОЖЬ,
          '#weight' => $this->getWeight(),
        ];

        вернуть $pane_form;
        
  }
публичная функция submitPaneForm (массив и $pane_form, FormStateInterface $form_state, массив и $complete_form) {
  $values ​​= $form_state->getValue($pane_form['#parents']);

  // Как отправить значение из флажка в логическое поле в заказе
  // Проблема, field_customer_check не получает никаких данных 
  $this->order->setData('field_customer_check', $values['user_check_accept']);

}

 }
Рейтинг:1
флаг eg

Если я правильно понял вопрос, у вас есть 2 разных варианта использования; во-первых, вы хотите обновить пользовательское поле значениями из панели, а во-вторых, скрыть его, если пользователь уже заполнил информацию при предыдущей покупке.

Чтобы решить первую проблему, вы можете обновить пользовательские поля, вызвав текущего пользователя и установив желаемое значение следующим образом:

публичная функция submitPaneForm (массив и $pane_form, FormStateInterface $form_state, массив и $complete_form) {
  $values ​​= $form_state->getValue($pane_form['#parents']);

  // Получить текущий пользовательский объект.
  $user = User::load(\Drupal::currentUser());

  // Установить значение поля.
  $user->FIELD_NAME->value = $form_state->getValue('ЗНАЧЕНИЕ');

  // Сохраняем сущность пользователя.
  $пользователь->сохранить;

}

Для второй части вопроса вам нужно проверить значения при создании формы, и вы можете получить текущего пользователя таким же образом, используя

$user = User::load(\Drupal::currentUser()->id());

и проверить существующее значение таким же образом:

if (!empty($user->FIELD_NAME->value)) { СДЕЛАЙТЕ ЧТО-НИБУДЬ}
Eurasia-Lab avatar
флаг br
Я пробовал это много раз, у меня есть невидимая функция, она работает. Я получаю значение из field_revoked_consent. Но я не могу сохранить значение флажка в логическое поле. Может быть, у вас есть решение?
apaderno avatar
флаг us
Параметр `User::load()` — это идентификатор пользователя. `User::load(\Drupal::currentUser())` не будет работать.
Рейтинг:0
флаг br

Пробую сейчас много раз сохранить в юзер field_revoke_consent, но не заношу в это поле значение из чекбокса.

  публичная функция submitPaneForm (массив и $pane_form, FormStateInterface $form_state, массив и $complete_form) {
    $values ​​= $form_state->getValue($pane_form['#parents']);

    // Получить текущий пользовательский объект.
    $user = User::load(\Drupal::currentUser()->id());
    $fieldconsent = ('field_revoke_consent');
     // Установить значение поля.
     $user->$fieldconsent->value = $form_state->getValue($pane_form['user_consent_accept']);
  
  
      // Сохраняем сущность пользователя.
    $пользователь->сохранить;


    /*
    $pane = $form_state->getValue('agree_terms');

    $values ​​= $form_state->getValue($pane_form['#parents']);
    
    $checked = $form_state->getValue($pane_form['user_consent_accept']['#default_value']);
 
    $user = User::load(\Drupal::currentUser()->id());

   if($checked ==['#default_value' => 1] ) {$user->field_revoke_consent->value = 1; }

   $user->field_revoke_consent->value = $form_state->getValue($pane_form['user_consent_accept']);  
  $пользователь->сохранить;
   */  
  } 
}
Hodba Khalaf avatar
флаг eg
вам нужно удалить ->id(), поскольку он вызывает идентификатор пользователя. просто используйте. "$user = User::load(\Drupal::currentUser());"

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.