Приветствую. Кто то может подсказать как правильно переопределить форму которую незарегистрированный юзер получает при оформлении заказа в Commerce? Можно в принципе заекстендиться от PaymentInformation и там как то переопределить форму, но как это сделать я не совсем понял, это не то же самое что определять форму в кастомном пейне. Насколько я понял тут форма определяется каким то модулем, скорее всего адресом? Ну и на основе ее переопределения там еще насколько я понял формируется профиль доставки. Можно конечно скрыть все это в css, но хотелось бы скрыть их для изменения, так как данные туда будут заполняться из виджета. Например хотелось бы скрыть поля адреса, региона, индекса, но в дампе формы их нет.
В общем не знаю, наверное не очень понятно объяснил, смысл вопроса в том можем ли мы как то вообще воздействовать на поля представленные в этой форме помимо js, css?
Имею в виду вот эту форму:
Переопределение PaymentInformation
Главные вкладки
Лучший ответ
1
В итоге все можно настроить тут /admin/config/people/profile-types/manage/customer/fields/profile.customer.address
, искал это в пользовательских профилях, а оказалось тут. Уже изменил программно, но возможно кому то будет полезным.
Комментарии
На основании чего такой вывод? Если есть поля - должен быть и механизм/структура формы, содержащая метод buildForm, где определяются эти поля.
Ну и кроме того, вы не указали версию Drupal. До 10 был же ещё hook_field_widget_form_alter, через который можно воздействовать на поля специфического виджета (в вашем случае Address).
Спасибо, да, извиняюсь - версия 10. Я нашел вот это https://docs.drupalcommerce.org/v2/developer-guide/customers/addresses/#... и тут вот этот пример:
<?php
use Drupal\Core\Form\FormStateInterface;
function
mymodule_form_alter(&$form, FormStateInterface $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_form, FormStateInterface $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] их нет:
"#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"
]
]
Сработало вот так:
<?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_form, FormStateInterface $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 ,но вопрос где брать айдишники этих полей остается открытым)
В итоге все можно настроить тут
/admin/config/people/profile-types/manage/customer/fields/profile.customer.address
, искал это в пользовательских профилях, а оказалось тут. Уже изменил программно, но возможно кому то будет полезным.Спсиобо!)

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