Par défaut, Commerce 2 demande des informations de carte de crédit + des informations d'adresse (nom, adresse et nom de l'entreprise) pour toutes les commandes. Je souhaite que les utilisateurs saisissent les informations de leur carte de crédit, mais je ne souhaite pas collecter leur nom, leur adresse ou le nom de l'entreprise. Stripe ne nécessite pas d'informations de nom/adresse donc je ne veux pas non plus l'exiger.
En tant que passerelle de paiement, j'utilise Commerce Stripe , mais cela s'applique à toutes les passerelles de paiement, telles que Commerce Paypal et le manuel (pas de carte de crédit) passerelle de paiement.
Alors, comment puis-je supprimer en toute sécurité le formulaire d'adresse de la page de paiement?
J'ai d'abord essayé de pirater Commerce directement (mauvaise pratique, juste essayer de voir comment cela fonctionnait) mais j'ai cassé le module.
En regardant autour de moi, il est apparu que les informations de facturation sont profondément liées au code Commerce. Existe-t-il un moyen de le découpler? Tous les magasins (ceux qui vendent des produits numériques, etc.) n'ont pas besoin des adresses physiques de leurs clients.
Sur l'écran "Informations de paiement", je souhaite supprimer tous les champs de "Pays" à "Code postal":
En fait, selon ce fil sur drupal.org , le fait que vous puissiez masquer le formulaire de facturation et Commerce Stripe fonctionne toujours est une anomalie; généralement, cela devrait entraîner le blocage du commerce.
À l'heure actuelle, Commerce 2 nécessite une adresse de facturation.
Il y a patch expérimental et ne discussion sur la raison pour laquelle le commerce requiert une adresse de facturation sur drupal.org.
C'est assez difficile à faire. Pour ce faire, vous pouvez définir une adresse de facturation factice et masquer le formulaire d'adresse.
Vous devrez effectuer les opérations suivantes:
Remplacez la méthode buildPaneForm()
, là-dedans:
#after_build
rappeler. Dans ce rappel, rendez chaque champ d'adresse non obligatoire. La raison pour laquelle vous avez besoin d'un #after_build
le rappel est que les autres champs d'adresse ne seront pas disponibles.Sur l'élément commerce_profile_select, définissez un #element_validate
rappeler. Dans ce rappel, définissez les valeurs d'adresse. La raison pour laquelle vous avez besoin d'un #element_validate
est dû au fait qu'un rappel général de validation de formulaire est appelé trop tard dans le processus de validation pour définir l'adresse à temps. En effet, l'élément d'adresse a une contrainte et l'adresse est validée par rapport à cette contrainte après #element_validate
et avant valider un formulaire général. Si vous essayez de définir l'adresse dans un rappel de validation de formulaire général, vous obtiendrez les erreurs de champ d'adresse requises en raison de la contrainte.
Vous pouvez définir le #element_validate
rappel également dans le #after_build
callback, ce que j'ai fait dans l'exemple de code ci-dessous.
#access
à FALSE
pour le formulaire d'adresse. Cela doit se produire dans le #after_build
rappel également, car auparavant le formulaire d'adresse n'était pas encore disponible.{{ payment_method.billing_profile }}
à partir de cela.Exemple de code (nom de fichier: mymodule/src/Plugin/Commerce/CheckoutPane/PaymentInformation.php
):
namespace Drupal\custom_commerce\Plugin\Commerce\CheckoutPane;
use Drupal\commerce_payment\Plugin\Commerce\CheckoutPane\PaymentInformation as PaymentInformationBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Render\Element;
/**
* Provides the payment information pane.
*
* @CommerceCheckoutPane(
* id = "custom_commerce_payment_information",
* label = @Translation("Custom Payment information"),
* display_label = @Translation("Payment information"),
* default_step = "order_information",
* wrapper_element = "fieldset",
* )
*/
class PaymentInformation extends PaymentInformationBase {
/**
* {@inheritdoc}
*/
public function buildPaneForm(array $pane_form, FormStateInterface $form_state, array &$complete_form) {
$pane_form = parent::buildPaneForm($pane_form, $form_state, $complete_form);
// Add an after build callback in order to make modifications on the address form.
$pane_form['#after_build'][] = [$this, 'paneFormAfterBuild'];
return $pane_form;
}
/**
* After build callback for the pane form.
*/
public function paneFormAfterBuild(array $pane_form, FormStateInterface $form_state) {
// Get billing form element. Where it is located depends on the payment method that is chosen.
if (isset($pane_form['add_payment_method']['billing_information'])) {
$billing_form = &$pane_form['add_payment_method']['billing_information'];
}
elseif (isset($pane_form['billing_information'])) {
$billing_form = &$pane_form['billing_information'];
}
else {
// No billing information found.
return $pane_form;
}
// Get the address form element.
$address_form = &$billing_form['address']['widget']['0']['address'];
// Add element validation callback to autofill the address.
$billing_form['#element_validate'] = array_merge(
[[$this, 'profileSelectValidate']],
\Drupal::service('element_info')->getInfoProperty('commerce_profile_select', '#element_validate', [])
);
// Set all address fields to non-required.
foreach (Element::children($address_form) as $key) {
$address_form[$key]['#required'] = FALSE;
}
// Hide the address form.
$address_form['#access'] = FALSE;
return $pane_form;
}
/**
* Element validation callback for the profile select element.
*/
public function profileSelectValidate(array &$element, FormStateInterface $form_state) {
// Set dummy address.
$address = [
'given_name' => 'A',
'family_name' => 'A',
'address_line1' => 'Dummy street',
'postal_code' => '1234 AB',
'locality' => 'Dummy city',
'country_code' => 'NL',
];
$form_state->setValue($element['address']['widget'][0]['address']['#parents'], $address);
}
}
Accédez à admin/config/people/profiles/types/manage/customer/form-display
Et désactivez les éléments de formulaire que vous souhaitez masquer (la configuration s'applique à l'ensemble du site)
Cela devrait être assez facile à faire, mais permettez-moi de dire tout de suite que je ne l'ai pas testé moi-même.
Ce que vous voyez comme l'adresse, c'est le "profil de facturation" (la commande et le mode de paiement ont un profil de facturation IIRC. DC n'a pas créé le profil de facturation eux-mêmes (contrairement à Drupal 7) mais utilisent plutôt le module de profil.
Lorsque DC affiche le "profil de facturation" ou les "informations de facturation", il respecte les paramètres globaux définis pour le type de profil utilisé (client). Cela signifie que vous pouvez configurer l'apparence du formulaire, notamment en désactivant tous les éléments. Cela peut être fait à admin/config/people/profiles/types/manage/customer/form-display
. Cela signifie également que vous pouvez ajouter des champs supplémentaires au profil, si vous souhaitez collecter plus d'informations sans toucher à DC lui-même.
Avis de non-responsabilité - Je n'ai pas testé cela moi-même, mais après avoir beaucoup gâché le commerce, je suis assez confiant que cela fonctionnera.