guia atualizado para remover o campo obrigatório de telefone do checkout

9

Alguém pode postar um guia sobre a remoção do campo telefônico 'obrigatório' no checkout com base no layout magento Versão 1.8.0.0, a maioria dos recursos pesquisados ​​no Google atualmente está desatualizada e não funciona mais. Esse parece o local perfeito para manter um guia / instruções atualizados.

Seria útil se alguém pudesse confirmar a solução de trabalho baixando o Magento 1.8.0.0 e fornecendo a prova de sua remoção, esses trechos de código às vezes são úteis, mas ainda precisamos encontrar uma solução de trabalho de maneira fácil de ler / documentar.

Alistair
fonte

Respostas:

8

Antes que 1.8.1eu não tenha conhecimento de nenhuma maneira de fazer isso funcionar, você deve substituir a classe principal abstrata no pool de códigos local ou reescrever todas as classes filho (feias, eu sei).

A partir 1.8.1de então, eles apresentaram o evento customer_address_validation_after. Eu me livrei da validação usando a reflexão, mesmo que não tenha muito orgulho disso. Pode não resolver o seu problema, mas pensei em publicá-lo de qualquer maneira.

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

Também escrevi um script de atualização para definir o arquivado como não obrigatório e editei todos os formulários para remover a validação de front-end. Como eu disse, pode não ser a melhor solução, mas é melhor do que reescrever o IMHO de 3-4 classes.

ATUALIZAÇÃO A equipe principal envolveu o evento customer_address_validation_afterem uma partida condicional 1.9.0através de 1.9.1.1(eu realmente pergunto por que, não faz sentido para mim ...) para que a minha solução não vai funcionar para essas versões, infelizmente. Felizmente, o condicional foi removido 1.9.2.

fmrng
fonte
Obrigado! Basta colocar isso em um módulo: github.com/sreichel/magento-StackExchange_RequiredTelephone
sv3n
6

Você precisará modificar a Mage_Customer_Model_Address_Abstractclasse * na linha 375-377 comentando a validação Zend do número de telefone.

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

bem como o próprio atributo de telefone no banco de dados, removendo a classe necessária. Isso pode ser feito com a seguinte consulta

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

Isso cuidará da validação de front-end (Javascript) dos campos telefônicos.

** Certifique-se de copiar o arquivo de classe para o seu localdiretório de código *

Sander Mangel
fonte
Observe que você não pode estender (reescrever) uma classe abstrata de uma extensão personalizada. Você só pode copiar o arquivo inteiro para app / code / local e personalizá-lo lá. Observe também que esta resposta também funciona para versões Magento inferiores a 1,8.
Mark van der Sanden
Você está absolutamente correto. Vou editar imediatamente
Sander Mangel
Como as respostas sugeridas mostram, eu copiei o arquivo Abstract.php de / public_html / app / code / core / Mage / Customer / Model / Address para public_html / app / code / local / Mage / Customer / Model / Address comentando as linhas sobre número de telefone e execute UPDATE eav_attribute SET is_required = 0 WHERE attribute_code = 'telephone' LIMIT 1; 1 linha afetada. (A consulta levou 0,0506 s) Limpou todos os caches (minha compilação magento está sempre desativada). Entretanto, os clientes ainda precisam fornecer um número antes que possam fazer o checkout. Alguém pode confirmar que esta solução funciona na 1.8.0.0, porque não funciona na minha.
Alistair
2
Há um pequeno erro na consulta de Sander: omita o LIMIT 1 na consulta. Em uma instalação padrão do CE 1.8, existem 4 entradas eav_attributecom o código 'phone'; portanto, você não pode dizer qual foi atualizado. Então o código deve funcionar (apenas o testou). Para a parte visual, você ainda precisará remover <em>*</em>o rótulo do campo em todos os formulários (edição de checkout / endereço). Obviamente, se você tiver algum tipo de checkout de uma etapa instalado, ele poderá substituir algumas das funcionalidades padrão do Magento e essa resposta poderá não funcionar.
Mark van der Sanden
11
Oi Mark: Obrigado pelo seu comentário, verifiquei se esse era o caso na minha loja, mas só tenho um eav_atribute com code'telephone '"SELECT * FROM eav_attribute WHERE attribute_code =' telephone '" Mostrando linhas 0 - 0 (1 total, a consulta levou 0,0005 s), portanto, minha loja possui apenas uma dessas opções, diferente da sua .. e atualmente está configurada como "is_required = 0"
Alistair
5

Sugiro alterar o modelo de endereço para o tema do site e tornar o telefone um campo oculto com o valor padrão de espaço ou traço. Isso não exigirá reescrições / substituições.

Vladimir Kerkhoff
fonte
2

Você não poderia simplesmente reescrever as classes que usam o resumo usando uma extensão personalizada e reescritas de configuração.

  • Mage_Sales_Model_Quote_Address,
  • Mage_Customer_Model_Address,
  • Mage_Sales_Model_Order_Address,

Em seguida, você pode criar sua própria validatefunção que excluirá a verificação por telefone ou, melhor ainda, verificará todos os atributos necessários e valida se eles estão definidos.

David Manners
fonte
11
É verdade, mas infelizmente cada segundo módulo de pagamento ou envio está tentando reescrever essas classes (eu poderia citar algumas). Muitas vezes, não é uma opção ou acaba sendo muito confuso.
fmrng
mas você resolveu essas várias reescritas? causa, então você pode usar essa solução e injetar sua validação lá.
David Manners
Claro que você pode fazer isso, mas precisa fazê-lo para cada projeto, pois não sabe quem mais vai reescrever essas classes. Infelizmente, os clientes sempre pedem para remover a validação do telefone. A única solução padrão e "limpa" que encontrei é a que descrevi na minha resposta, e nem funciona em todas as versões do Magento. Se isso não puder ser aplicado, o mais fácil é copiar a classe abstrata para o conjunto de códigos local e comentar a validação ... não é a melhor, mas tudo bem se você não abusar dela.
fmrng
2

Acabei de encontrar uma pequena extensão "Webguys_Telefonkeinpflicht" de Tobi, que basicamente segue a abordagem de David. Ele reescreve as subclasses respectivas. O que eu mais gosto é o fato de que ele despacha apenas um evento nas classes reescritas e toda a personalização adicional é feita em um observador de eventos. Ele também observa o core_block_abstract_to_html_afterevento para remover a estrela e a classe necessária do campo de entrada com alguma magia negra regex. E, é claro, vem com um script de configuração, que torna o atributo de telefone não obrigatório na eav_attributetabela. Você pode verificar a extensão no GitHub .

Simon
fonte