guide à jour pour supprimer le champ de téléphone requis de la caisse

9

S'il vous plaît, quelqu'un pourrait-il publier un guide sur la suppression du champ téléphonique `` requis '' lors du paiement basé sur la mise en page magento version 1.8.0.0, la majorité des ressources googlées actuelles sont obsolètes et ne fonctionnent plus. Cela semblerait l'endroit idéal pour garder un guide / guide mis à jour.

Il serait utile que quelqu'un puisse confirmer la solution de travail en téléchargeant Magento 1.8.0.0 et en fournissant la preuve de sa suppression, ces extraits de code sont parfois utiles, mais nous n'avons pas encore trouvé de solution de travail d'une manière facile à lire / documentée.

Alistair
la source

Réponses:

8

Avant 1.8.1que je ne sache aucun moyen de faire fonctionner cela, vous devez soit remplacer la classe principale abstraite dans le pool de code local, soit réécrire chaque classe enfant (moche, je sais).

Dès 1.8.1lors, ils ont présenté l'événement customer_address_validation_after. Je me suis débarrassé de la validation en utilisant la réflexion, même si je n'en suis pas trop fier. Pourrait ne pas résoudre votre problème, mais je pensais que je le publierais de toute façon.

/**
 * Validate address ignoring phone-related errors
 *
 * Internally uses reflexion. Maybe not the most
 * efficient or clean implementation, but allows
 * this functionality to be implemented without
 * the need to rewrite 3 core classes.
 *
 * Listens to:
 * - customer_address_validation_after
 *
 * @param Varien_Event_Observer $observer Event observer
 */
public function validateAddress(Varien_Event_Observer $observer)
{
    /* @var $address Mage_Customer_Model_Address_Abstract */
    $address = $observer->getAddress();
    if (!$address) {
        return;
    }

    $prop = new ReflectionProperty('Mage_Customer_Model_Address_Abstract', '_errors');
    if (!$prop) {
        return;
    }
    $prop->setAccessible(true);
    $errors = $prop->getValue($address);
    $prop->setValue($address, array());

    $errorMessage = $this->getErrorMessage();
    foreach ($errors as $error) {
        if ($error !== $errorMessage) {
            $address->addError($error);
        }
    }
}

/**
 * Get standard error message
 *
 * @return string
 */
protected function getErrorMessage()
{
    return Mage::helper('customer')->__('Please enter the telephone number.');
}

J'ai également écrit un script de mise à jour pour définir le fichier comme non requis et édité tous les formulaires pour supprimer la validation frontale. Comme je l'ai dit, ce n'est peut-être pas la meilleure solution, mais c'est mieux que de réécrire 3-4 classes à mon humble avis.

MISE À JOUR L'équipe de base enveloppé l'événement customer_address_validation_afterdans un départ conditionnelle 1.9.0par 1.9.1.1(je me demande vraiment pourquoi, fait aucun sens pour moi ...) donc ma solution ne fonctionnera pas pour ces versions, malheureusement. Le conditionnel a heureusement été supprimé 1.9.2.

fmrng
la source
Merci! Mettez-le simplement dans un module: github.com/sreichel/magento-StackExchange_RequiredTelephone
sv3n
6

Vous devrez modifier la Mage_Customer_Model_Address_Abstractclasse * à la ligne 375-377 en commentant la validation Zend du numéro de téléphone.

//if (!Zend_Validate::is($this->getTelephone(), 'NotEmpty')) {
//   $errors[] = Mage::helper('customer')->__('Please enter the telephone number.');
//}

ainsi que l'attribut telephone lui-même dans la base de données supprimant la classe requise. Cela peut être fait avec la requête suivante

UPDATE `eav_attribute` SET `is_required` = 0 WHERE `attribute_code` = 'telephone';

Cela prendra en charge la validation frontend (Javascript) des champs téléphoniques.

** Assurez-vous de copier le fichier de classe dans votre localrépertoire de code *

Sander Mangel
la source
Notez que vous ne pouvez pas étendre (réécrire) une classe abstraite à partir d'une extension personnalisée. Vous pouvez uniquement copier le fichier entier dans app / code / local et le personnaliser là-bas. Notez également que cette réponse fonctionne également pour les versions de Magento inférieures à 1,8.
Mark van der Sanden
Vous avez absolument raison. Je vais éditer tout de suite
Sander Mangel
Comme les réponses suggérées montrent que j'ai copié le Abstract.php de / public_html / app / code / core / Mage / Customer / Model / Address vers public_html / app / code / local / Mage / Customer / Model / Address commenté les lignes concernant le numéro de téléphone et exécutez UPDATE eav_attribute SET is_required = 0 WHERE attribute_code = 'telephone' LIMIT 1; 1 ligne affectée. (La requête a pris 0,0506 s). Effacé tous les caches (ma compilation magento est toujours désactivée). Cependant, les clients doivent toujours fournir un numéro avant de pouvoir passer à la caisse. Quelqu'un peut-il confirmer que cette solution fonctionne sur 1.8.0.0, car elle ne fonctionne pas sur la mienne.
Alistair
2
Il y a une petite erreur dans la requête de Sander: omettez la LIMIT 1 dans la requête. Dans une installation CE 1.8 par défaut, il y a 4 entrées eav_attributeavec le code 'téléphone', donc vous ne pouvez pas dire laquelle a été mise à jour. Ensuite, le code devrait fonctionner (je viens de le tester). Pour la partie visuelle, il vous reste alors à supprimer <em>*</em>dans l'étiquette du champ dans tous les formulaires (checkout / modification d'adresse). Bien sûr, si vous avez installé une sorte de paiement en une étape, cela pourrait remplacer certaines des fonctionnalités par défaut de Magento et cette réponse peut ne pas fonctionner.
Mark van der Sanden
1
Salut Mark: Merci pour votre commentaire, j'ai vérifié si c'était le cas sur mon magasin, mais je n'ai qu'un seul eav_atribute avec le code 'téléphone' "SELECT * FROM eav_attribute WHERE attribute_code = 'telephone'" Affichage des lignes 0 - 0 (1 au total, la requête a pris 0,0005 s), donc mon magasin n'en a qu'un, contrairement au vôtre .. et il est actuellement défini sur "is_required = 0"
Alistair
5

Je suggérerais de changer le modèle d'adresse pour le thème du site et de faire du téléphone un champ caché avec comme valeur par défaut un espace ou un tiret. Cela ne nécessitera aucune réécriture / écrasement.

Vladimir Kerkhoff
la source
2

Ne pourriez-vous pas simplement réécrire les classes qui utilisent l'abrégé en utilisant une extension personnalisée et des réécritures de configuration.

  • Mage_Sales_Model_Quote_Address,
  • Mage_Customer_Model_Address,
  • Mage_Sales_Model_Order_Address,

Ensuite, vous pouvez créer votre propre validatefonction qui exclura la vérification téléphonique, ou mieux encore vérifie tous les attributs requis et valide qu'ils sont définis.

David Manners
la source
1
Certes, mais malheureusement, chaque deuxième module de paiement ou d'expédition essaie de réécrire ces classes (je pourrais en nommer quelques-unes). Souvent, ce n'est pas une option, ou cela finit par être très compliqué.
fmrng
mais vous avez résolu ces réécritures multiples? car alors vous pourriez utiliser cette solution et y injecter votre validation.
David Manners
Bien sûr, vous pouvez le faire, mais vous devez le faire pour chaque projet, car vous ne savez pas qui d'autre va réécrire ces classes. Malheureusement, les clients demandent toujours de supprimer la validation du téléphone. La seule solution standard et "propre" que j'ai trouvée est celle que j'ai décrite dans ma réponse, et elle ne fonctionne même pas pour toutes les versions de Magento. Si cela ne peut pas être appliqué, le plus simple est de copier la classe abstraite dans le pool de code local et de commenter la validation ... pas la meilleure, mais c'est bien si vous n'en abusez pas.
fmrng
2

Je viens de rencontrer une jolie petite extension "Webguys_Telefonkeinpflicht" de Tobi, qui suit fondamentalement l'approche de David. Il réécrit les sous-classes respectives. Ce que j'aime à peu près, c'est le fait qu'il ne distribue qu'un événement dans les classes réécrites et que toute personnalisation supplémentaire est ensuite effectuée dans un observateur d'événement. Il observe également l' core_block_abstract_to_html_afterévénement afin de retirer l'étoile et la classe requise du champ de saisie avec de la magie noire regex. Et bien sûr, il est livré avec un script de configuration, ce qui rend l'attribut telephone non requis dans le eav_attributetableau. Vous pouvez vérifier l'extension sur GitHub .

Simon
la source