Переопределение PaymentInformation

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

Аватар пользователя y-vo y-vo 23 мая в 14:54

Приветствую. Кто то может подсказать как правильно переопределить форму которую незарегистрированный юзер получает при оформлении заказа в Commerce? Можно в принципе заекстендиться от PaymentInformation и там как то переопределить форму, но как это сделать я не совсем понял, это не то же самое что определять форму в кастомном пейне. Насколько я понял тут форма определяется каким то модулем, скорее всего адресом? Ну и на основе ее переопределения там еще насколько я понял формируется профиль доставки. Можно конечно скрыть все это в css, но хотелось бы скрыть их для изменения, так как данные туда будут заполняться из виджета. Например хотелось бы скрыть поля адреса, региона, индекса, но в дампе формы их нет.
В общем не знаю, наверное не очень понятно объяснил, смысл вопроса в том можем ли мы как то вообще воздействовать на поля представленные в этой форме помимо js, css?
Имею в виду вот эту форму:

Лучший ответ

Аватар пользователя y-vo y-vo 28 мая в 12:35
1

В итоге все можно настроить тут /admin/config/people/profile-types/manage/customer/fields/profile.customer.address, искал это в пользовательских профилях, а оказалось тут. Уже изменил программно, но возможно кому то будет полезным.

Комментарии

Аватар пользователя OldWarrior OldWarrior 23 мая в 16:14
1

y-vo wrote: Например хотелось бы скрыть поля адреса, региона, индекса, но в дампе формы их нет.

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

Ну и кроме того, вы не указали версию Drupal. До 10 был же ещё hook_field_widget_form_alter, через который можно воздействовать на поля специфического виджета (в вашем случае Address).

Аватар пользователя y-vo y-vo 27 мая в 17:04

Спасибо, да, извиняюсь - версия 10. Я нашел вот это https://docs.drupalcommerce.org/v2/developer-guide/customers/addresses/#... и тут вот этот пример:

<?php
use Drupal\Core\Form\FormStateInterface;

function 

mymodule_form_alter(&$formFormStateInterface $form_state$form_id) {
  if ((
$form_id == 'profile_customer_edit_form') || ($form_id == 'profile_customer_add_form')) {
    
$form['address']['widget'][0]['address']['#field_overrides'] = [
      
'organization' => 'required',
      
'locality' => 'optional',
      
'postalCode' => 'hidden',
    ];
  }
}
?>

Я реализовал свой оверрайд пейна, вывел в нем дамп формы и нашел что структура отличается, получилось так:

<?php

namespace Drupal\cdek_checkout_flow\Plugin\Commerce\CheckoutPane;
use 
Symfony\Component\VarDumper\VarDumper;
use 
Drupal\commerce_payment\Plugin\Commerce\CheckoutPane\PaymentInformation;
use 
Drupal\Core\Form\FormStateInterface;

/**
 * Provides the payment information pane.
 *
 * @CommerceCheckoutPane(
 *   id = "cdek_payment_information",
 *   label = @Translation("CDEK Payment information"),
 *   default_step = "order_information",
 *   wrapper_element = "fieldset",
 * )
 */
class CdekPaymentInformationPane extends PaymentInformation {

  

/**
   * {@inheritdoc}
   */
  
public function buildPaneForm(array $pane_formFormStateInterface $form_state, array &$complete_form) {
    
$pane_form parent::buildPaneForm($pane_form$form_state$complete_form);
    
$pane_form['billing_information']['address']['widget'][0]['field_overrides'] = [
      
'organization' => 'required',
      
'locality' => 'optional',
      
'postalCode' => 'hidden',
    ];
    
VarDumper::dump($pane_form);
    return 
$pane_form;
  }

}

?>

Однако теперь я получаю ошибку

<?phpInvalidArgumentException: "organization" is an invalid render array key. Value should be an array but got a string. in Drupal\Core\Render\Element::children() (line 97 of C:\OSPanel\domains\moon.loc\core\lib\Drupal\Core\Render\Element.php).?>

Пробовал в ключ подставить addressLine3, addressLine2, тоже выдает ошибку. Где я могу найти идентификаторы этих полей? В самом ['billing_information']['address']['widget'][0] их нет:

array:12 [
  "#title" => "Адрес"
  "#title_display" => "before"
  "#description" => ""
  "#field_parents" => array:3 [
    0 => "sidebar"
    1 => "cdek_payment_information"
    2 => "billing_information"
  ]
  "#required" => true
  "#delta" => 0
  "#weight" => 0
  "#type" => "container"
  "#open" => true
  "address" => array:5 []
  "#after_build" => array:1 []
  "field_overrides" => array:1 [
    "addressLine3" => "optional"
  ]
]
Аватар пользователя y-vo y-vo 27 мая в 17:40

Сработало вот так:


<?php

namespace Drupal\cdek_checkout_flow\Plugin\Commerce\CheckoutPane;
use 
Symfony\Component\VarDumper\VarDumper;
use 
Drupal\commerce_payment\Plugin\Commerce\CheckoutPane\PaymentInformation;
use 
Drupal\Core\Form\FormStateInterface;
use 
CommerceGuys\Addressing\AddressFormat\AddressField;
use 
CommerceGuys\Addressing\AddressFormat\FieldOverride;

/**
 * Provides the payment information pane.
 *
 * @CommerceCheckoutPane(
 *   id = "cdek_payment_information",
 *   label = @Translation("CDEK Payment information"),
 *   default_step = "order_information",
 *   wrapper_element = "fieldset",
 * )
 */
class CdekPaymentInformationPane extends PaymentInformation {

  

/**
   * {@inheritdoc}
   */
  
public function buildPaneForm(array $pane_formFormStateInterface $form_state, array &$complete_form) {
    
$pane_form parent::buildPaneForm($pane_form$form_state$complete_form);
    
    if (isset(
$pane_form['billing_information']['address']['widget'][0]['address'])) {
      
$pane_form['billing_information']['address']['widget'][0]['address']['#field_overrides'] = [
        
AddressField::ORGANIZATION => FieldOverride::REQUIRED,
        
AddressField::ADDRESS_LINE3 => FieldOverride::HIDDEN,
        
AddressField::POSTAL_CODE => FieldOverride::HIDDEN
      
];
    }
    
    return 
$pane_form;
  }

}

?>

Нашел тут https://www.drupal.org/project/address/issues/2974976#comment-14918573 ,но вопрос где брать айдишники этих полей остается открытым)

Аватар пользователя y-vo y-vo 28 мая в 12:35
1

В итоге все можно настроить тут /admin/config/people/profile-types/manage/customer/fields/profile.customer.address, искал это в пользовательских профилях, а оказалось тут. Уже изменил программно, но возможно кому то будет полезным.

Аватар пользователя qvazar qvazar 13 июня в 18:32
y-vo wrote: В итоге все можно настроить тут /admin/config/people/profile-types/manage/customer/fields/profile.customer.address, искал это в пользовательских профилях, а оказалось тут. Уже изменил программно, но возможно кому то будет полезным.


Спсиобо!)
я когда-то дааааавно тоже измотался пока нашел, а теперь пришлось снова столкнуться и никак найти не мог)))

Аватар пользователя y-vo y-vo 14 июня в 11:18

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