guía actualizada para eliminar el campo requerido del teléfono de la caja


9

Alguien podría publicar una guía sobre la eliminación del campo de teléfono 'requerido' en el proceso de pago basado en el diseño de magento Versión 1.8.0.0, la mayoría de los recursos buscados en Google están desactualizados y ya no funcionan. Este parece ser el lugar perfecto para mantener una guía práctica actualizada.

Sería útil si alguien pudiera confirmar la solución de trabajo descargando Magento 1.8.0.0 y proporcionando una prueba de su eliminación, estos fragmentos de código a veces son útiles, pero todavía tenemos que encontrar una solución de trabajo de una manera fácil de leer / documentada.


Respuestas:


8

Antes de 1.8.1que no conozca ninguna forma de hacer que esto funcione, debe anular la clase principal abstracta en el grupo de códigos local o reescribir cada clase secundaria (fea, lo sé).

A partir 1.8.1de entonces, presentaron el evento customer_address_validation_after. Me deshice de la validación usando reflexion, incluso si no estoy demasiado orgulloso de ello. Podría no resolver su problema, pero pensé en publicarlo de todos modos.

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

También escribí un script de actualización para definir el archivo como no requerido, y edité todos los formularios para eliminar la validación de la interfaz. Como dije, puede que no sea la mejor solución, pero es mejor que reescribir 3-4 clases en mi humilde opinión.

ACTUALIZACIÓN El equipo central envuelto el evento customer_address_validation_afteren una partida condicional 1.9.0a través de 1.9.1.1(me pregunto por qué, no tiene sentido para mí ...) así que mi solución no funcionará para estas versiones, por desgracia. El condicional fue eliminado por suerte 1.9.2.


¡Gracias! Simplemente ponga esto en un módulo: github.com/sreichel/magento-StackExchange_RequiredTelephone
sv3n

6

Deberá modificar la Mage_Customer_Model_Address_Abstractclase * en la línea 375-377 comentando la validación Zend del número de teléfono.

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

así como el atributo telefónico en sí mismo en la base de datos eliminando la clase requerida. Esto se puede hacer con la siguiente consulta

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

Esto se encargará de la validación frontend (Javascript) de los campos telefónicos.

** Asegúrese de copiar el archivo de clase en su localdirectorio de código *


Tenga en cuenta que no puede extender (reescribir) una clase abstracta desde una extensión personalizada. Solo puede copiar el archivo completo en la aplicación / código / local y personalizarlo allí. También tenga en cuenta que esta respuesta también funciona para versiones de Magento inferiores a la 1.8.
Mark van der Sanden

Estás absolutamente en lo correcto. Lo editaré de inmediato
Sander Mangel

Como muestran las respuestas sugeridas, he copiado el Abstract.php de / public_html / app / code / core / Mage / Customer / Model / Address a public_html / app / code / local / Mage / Customer / Model / Address comentado las líneas relacionadas con el número de teléfono y ejecutar ACTUALIZACIÓN eav_attribute SET is_required = 0 WHERE attribute_code = 'phone' LIMIT 1; 1 fila afectada. (La consulta tomó 0.0506 segundos) Borró todos los cachés (mi compilación de magento siempre está desactivada) Sin embargo, los clientes aún deben dar un número antes de que puedan pagar. ¿Alguien puede confirmar que esta solución funciona en 1.8.0.0, porque no funciona en la mía?
Alistair

2
Hay un pequeño error en la consulta de Sander: omita el LÍMITE 1 en la consulta. En una instalación predeterminada de CE 1.8, hay 4 entradas eav_attributecon el código 'teléfono', por lo que no puede saber cuál se ha actualizado. Entonces el código debería funcionar (lo acabo de probar). Para la parte visual, aún debe eliminar <em>*</em>en la etiqueta del campo en todos los formularios (pago / edición de dirección). Por supuesto, si tiene algún tipo de pago de un paso instalado, podría anular algunas de las funciones predeterminadas de Magento y esta respuesta puede no funcionar.
Mark van der Sanden

1
Hola, Mark: Gracias por tu comentario, verifiqué si ese era el caso en mi tienda, pero solo tengo un eav_atribute con code'telephone '"SELECT * FROM eav_attribute WHERE attribute_code =' phone '" Mostrando filas 0 - 0 (1 total, la consulta tomó 0.0005 segundos), por lo que mi tienda solo tiene uno de estos, a diferencia del suyo ... y actualmente está configurado como "is_required = 0"
Alistair

5

Sugeriría cambiar la plantilla de dirección para el tema del sitio y hacer que el teléfono sea un campo oculto con un valor predeterminado como un espacio o guión. Esto no requerirá reescrituras / sobrescrituras.


2

¿No podría simplemente reescribir las clases que usan el resumen utilizando una extensión personalizada y reescrituras de configuración?

  • Mage_Sales_Model_Quote_Address,
  • Mage_Customer_Model_Address,
  • Mage_Sales_Model_Order_Address,

Luego puede hacer su propia validatefunción que excluirá la verificación telefónica, o mejor aún, verifica todos los atributos requeridos y valida que estén configurados.


1
Es cierto, pero desafortunadamente cada segundo módulo de pago o envío está tratando de reescribir esas clases (podría nombrar algunas). A menudo no es una opción, o termina siendo muy desordenado.
fmrng

pero has resuelto esas múltiples reescrituras? porque entonces podrías usar esa solución e inyectar tu validación allí.
David Manners

Por supuesto, puede hacerlo, pero debe hacerlo para cada proyecto, ya que no sabe quién más va a reescribir esas clases. Desafortunadamente, los clientes siempre solicitan eliminar la validación del teléfono. La única solución estándar y "limpia" que se me ocurrió es la que describí en mi respuesta, y ni siquiera funciona para todas las versiones de Magento. Si eso no se puede aplicar, lo más fácil es copiar la clase abstracta al grupo de códigos local y comentar la validación ... no es la mejor, pero está bien si no abusas de ella.
fmrng

2

Acabo de encontrar una pequeña extensión "Webguys_Telefonkeinpflicht" de Tobi, que básicamente sigue el enfoque de David. Reescribe las subclases respectivas. Lo que más me gusta es el hecho de que solo distribuye un evento en las clases reescritas y toda la personalización posterior se realiza en un observador de eventos. También observa el core_block_abstract_to_html_afterevento para eliminar la estrella y la clase requerida del campo de entrada con algo de magia negra regex. Y, por supuesto, viene con un script de configuración, lo que hace que el atributo del teléfono no sea requerido en la eav_attributetabla. Puede verificar la extensión en GitHub .

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.