guida aggiornata per rimuovere il campo obbligatorio del telefono dalla cassa


9

Per favore qualcuno potrebbe pubblicare una guida sulla rimozione del campo telefonico "obbligatorio" al momento del pagamento in base al layout magento versione 1.8.0.0, la maggior parte delle attuali risorse su Google sono obsolete e non funzionano più. Questo sembrerebbe il posto perfetto per tenere una guida / guida aggiornata.

Sarebbe utile se qualcuno potesse confermare la soluzione funzionante scaricando Magento 1.8.0.0 e fornendo la prova della sua rimozione, questi frammenti di codice a volte sono utili, ma dobbiamo ancora trovare una soluzione funzionante in modo facile da leggere / documentare.


Risposte:


8

Prima di 1.8.1non essere a conoscenza di alcun modo per farlo funzionare, è necessario sovrascrivere la classe core astratta nel pool di codici locale o riscrivere ogni singola classe figlio (brutto, lo so).

Da quel momento 1.8.1hanno presentato l'evento customer_address_validation_after. Mi sono sbarazzato della convalida usando la riflessione, anche se non ne sono troppo orgoglioso. Potrebbe non risolvere il tuo problema, ma ho pensato di pubblicarlo comunque.

/**
 * 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.');
}

Ho anche scritto uno script di aggiornamento per definire il file come non necessario e modificato tutti i moduli per rimuovere la convalida del frontend. Come ho detto, potrebbe non essere la soluzione migliore, ma è meglio che riscrivere IMHO di 3-4 classi.

UPDATE Il core team avvolto l'evento customer_address_validation_afterin un punto di partenza condizionale da 1.9.0tramite 1.9.1.1(mi chiedo perché, non ha senso per me ...) quindi la mia soluzione non funziona per queste versioni, purtroppo. Il condizionale è stato fortunatamente rimosso 1.9.2.



6

Dovrai modificare la Mage_Customer_Model_Address_Abstractclasse * sulla riga 375-377 commentando la convalida Zend del numero di telefono.

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

nonché l'attributo telefonico stesso nel database rimuovendo la classe richiesta. Questo può essere fatto con la seguente query

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

Questo si occuperà della validazione frontend (Javascript) dei campi telefonici.

** Assicurati di copiare il file di classe nella tua localdirectory di codice *


Nota che non puoi estendere (riscrivere) una classe astratta da un'estensione personalizzata. Puoi solo copiare l'intero file in app / code / local e personalizzarlo lì. Si noti inoltre che questa risposta funziona anche per le versioni Magento precedenti alla 1.8.
Mark van der Sanden,

Hai assolutamente ragione. Modificherò subito
Sander Mangel

Come mostrano le risposte suggerite, ho copiato Abstract.php da / public_html / app / code / core / Mage / Customer / Model / Address in public_html / app / code / local / Mage / Customer / Model / Address commentando le righe riguardanti numero di telefono ed esecuzione AGGIORNA eav_attribute SET is_required = 0 WHERE attributo_codice = 'telefono' LIMIT 1; 1 riga interessata. (La query ha impiegato 0,0506 secondi) Svuota tutte le cache (la mia compilazione magento è sempre disattivata) I clienti Howevert devono comunque fornire un numero prima di poter effettuare il checkout. Qualcuno può confermare che questa soluzione funziona su 1.8.0.0, perché non funziona sulla mia.
Alistair,

2
C'è un piccolo errore nella query di Sander: omettere il LIMIT 1 nella query. In un'installazione CE 1.8 predefinita, ci sono 4 voci eav_attributecon il codice "telefono", quindi non si può dire quale è stato aggiornato. Quindi il codice dovrebbe funzionare (l'ho appena testato). Per la parte visiva, è comunque necessario rimuovere <em>*</em>l'etichetta del campo in tutte le forme (checkout / modifica dell'indirizzo). Ovviamente, se hai installato una sorta di checkout in un solo passaggio, potrebbe ignorare alcune delle funzionalità predefinite di Magento e questa risposta potrebbe non funzionare.
Mark van der Sanden,

1
Ciao Mark: Grazie per il tuo commento, ho controllato per vedere se era il caso nel mio negozio, ma ho solo un eav_atribute con code'telephone '"SELEZIONA * DA eav_attribute DOVE attributo_codice =' telefono '" Visualizzazione delle righe 0 - 0 (1 totale, la query ha impiegato 0,0005 sec), quindi il mio negozio ne ha solo uno, a differenza del tuo .. ed è attualmente impostato su "is_required = 0"
Alistair

5

Vorrei suggerire di cambiare il modello di indirizzo per il tema del sito e rendere il telefono un campo nascosto con come valore predefinito uno spazio o un trattino. Ciò non richiederà riscritture / sovrascritture.


2

Non potresti semplicemente riscrivere le classi che usano l'abstract usando un'estensione personalizzata e configurare le riscritture.

  • Mage_Sales_Model_Quote_Address,
  • Mage_Customer_Model_Address,
  • Mage_Sales_Model_Order_Address,

Quindi è possibile creare la propria validatefunzione che escluderà il controllo del telefono o, ancora meglio, controlla tutti gli attributi richiesti e convalida che siano impostati.


1
È vero, ma sfortunatamente ogni secondo modulo di pagamento o spedizione sta cercando di riscrivere quelle classi (potrei nominarne alcune). Spesso non è un'opzione, o finisce per essere molto disordinato.
fmrng,

ma hai risolto quelle riscritture multiple? perché allora potresti usare quella soluzione e iniettare lì la tua validazione.
David Manners,

Ovviamente puoi farlo, ma devi farlo per ogni singolo progetto, dal momento che non sai chi altro riscriverà quelle classi. Sfortunatamente, i clienti chiedono sempre di rimuovere la convalida del telefono. L'unica soluzione standard e "pulita" che ho trovato è quella che ho descritto nella mia risposta, e non funziona nemmeno con tutte le versioni di Magento. Se ciò non può essere applicato, il più semplice è copiare la classe astratta nel pool di codici locale e commentare la convalida ... non il migliore, ma va bene se non la si abusa.
fmrng

2

Ho appena incontrato una piccola estensione "Webguys_Telefonkeinpflicht" di Tobi, che sostanzialmente segue l'approccio di David. Riscrive le rispettive sottoclassi. Quello che mi piace di più è il fatto che invia un evento solo nelle classi riscritte e tutta l'ulteriore personalizzazione viene quindi eseguita in un osservatore di eventi. Osserva anche l' core_block_abstract_to_html_afterevento per rimuovere la stella e la classe richiesta dal campo di input con un po 'di magia nera regex. E ovviamente viene fornito con uno script di installazione, che rende l'attributo telefonico non richiesto nella eav_attributetabella. Puoi controllare l'estensione su GitHub .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.