:::: MENU ::::

Registro de Magento para empresas (nombre/empresa, apellido opcional y cif)

4.22 avg. rating (82% score) - 9 votes

Magento es una plataforma tremendamente versátil y personalizable, pero los que desarrollamos a menudo sobre Magento, sabemos que a veces las cosas más sencillas se complican, y en otras ocasiones, lo que parece imposible, está a sólo unas líneas de código de distancia.

En este caso, el problema que se nos ha presentado es adaptar el registro de una cuenta de usuario en Magento, al comercio B2B.

En Magento, durante el registro de usuarios se solicitan los siguientes campos: Nombre, Apellidos, Email, Contraseña. Útil cuando se trata de usuarios particulares, pero poco adecuado para el comercio B2B.

Registro de usuario en Magento

Cuando trabajamos entre empresas, lo habitual es que las facturas vayan a nombre de la empresa, no de una persona, así que por qué solicitar nombre y apellidos, cuando lo adecuado sería solicitar nombre de la empresa y CIF.

Registro empresas en Magento

Para conseguir este formulario, debemos hacer lo siguiente:

Apellido opcional durante el registro en Magento

Para dejar el campo apellido como un campo opcional durante el registro de una cuenta de usuario en Magento, debemos realizar varios pasos:

En primer lugar, debemos modificar el formulario, para evitar que se muestre el campo como requerido. Para ello, debemos acudir a la plantilla:

app/design/mi-package/mi-tema/customer/widget/name.phtml

Buscar las líneas:

<label for="<?php echo $this->getFieldId('lastname')?>" class="required"><em>*</em><?php echo $this->getStoreLabel('lastname') ?></label>
<div class="input-box">
  <input type="text" id="<?php echo $this->getFieldId('lastname')?>" name="<?php echo $this->getFieldName('lastname')?>" value="<?php echo $this->htmlEscape($this->getObject()->getLastname()) ?>" title="<?php echo $this->getStoreLabel('lastname') ?>" class="input-text required-entry" <?php echo $this->getFieldParams() ?> />
</div>

Y modificarla a:

<label for="<?php echo $this->getFieldId('lastname')?>"><?php echo $this->getStoreLabel('lastname') ?></label>
<div class="input-box">
  <input type="text" id="<?php echo $this->getFieldId('lastname')?>" name="<?php echo $this->getFieldName('lastname')?>" value="<?php echo $this->htmlEscape($this->getObject()->getLastname()) ?>" title="<?php echo $this->getStoreLabel('lastname') ?>" class="input-text" <?php echo $this->getFieldParams() ?> />
</div>

Lo único que hacemos es eliminar las clases «required» y «required-entry» que indican a Magento que es un campo obligatorio y el asterisco rojo, para indicarselo al usuario.

En segundo lugar debemos evitar la validación durante del formulario, ya que es un campo que siempre es requerido, y se valida siempre, independientemente de cómo se haya incluido en el formulario. Para ello, debemos ir al siguiente modelo:

app/code/core/Mage/Customer/Model/Customer.php

Copiarlo a nuestra rama local y buscar las líneas:

  if (!Zend_Validate::is( trim($this->getLastname()) , 'NotEmpty')) {
    $errors[] = Mage::helper('customer')->__('The last name cannot be empty.');
  }

Y modificarlas a lo siguiente:

  if (!Zend_Validate::is( trim($this->getLastname()) , 'NotEmpty')) {
    $this->setLastname(" ");
  }

Con esto conseguimos que si el usuario deja el campo apellido vacío, en la base de datos se sustituya por un espacio en blanco y no se devuelva el correspondiente error de validación.

Podríamos eliminar incluso el espacio en blanco, pero no encontraríamos con el problema de que en la base de datos, dentro del model EAV del cliente, el campo está marcado como requerido y al insertar el registro correspondiente, se produciría un error de validación.

Una forma de evitar el espacio en blanco es modificar el atributo «lastname» de la tabla «eav_attribute», en la base de datos de Magento, y marcarlo como no requerido:

  update eav_attribute set is_required='0' where attribute_code='lastname';

En ese caso necesitaríamos insertar un valor vacío, pero el atributo lastname del cliente quedaría almacenado como NULL y podría darnos problemas en otras partes del código, por ejemplo cuando al concatenar nombre + apellido para mostrar el nombre del cliente.

Recomendado no tocar la base de datos!

Añadir el CIF al formulario de registro de Magento

Esta es la parte sencilla del tutorial, ya que Magento tiene una opción para ello en el administrador de la tienda.

Simplemente hay que ir a Configuración => Clientes => Configuración del cliente y habilitar la opción correspondiente (ver imagen):

CIF en formulario de registro en Magento




11 Comments

  • Responder David |

    Buenas Daniel, soy nuevo en el entorno de Magento y tu blog me está sirviendo mucho. He realizado los pasos de este tutorial pero el campo apellido sigue apareciéndome como obligatorio, espero que puedas echarme una mano.

    Además aprovecho para preguntarte como puedo poner el campo «Número NIF/CIF» al lado del de «Dirección de email», he estado un rato luchando con ello pero no lo consigo.

    Gracias de antemano.

    • Responder Daniel Navarro Murillo |

      Hola David,

      Disculpa, pero creo que el plugin que permite insertar código en los post se me había comido un trozo. Ya está solucionado.

      La clave para que el campo apellido no sea obligatorio es eliminar las clases «required» y «required-entry» en la plantilla name.phtml. Si te has basado en lo que había antes, seguramente el asterisco del campo no se muestra, pero al enviar el formulario te dice que es un campo obligatorio.

      Para el tema del NIF/CIF al lado del apellido el problema es que tienes que trabajar con dos plantillas, customer/widget/name.phtml y customer/widget/taxvat.phtml. Tienes que hacer que la segunda esté dentro de un div (la primera ya lo está), y luego posicionar ambos grupos mediante css.

      Siento no poder pegar un trozo de código como ejemplo, pero es que el que utilice para el post, ya no está de esa forma tampoco.

      Un saludo,
      Daniel

  • Responder David |

    Hola Daniel, ya he conseguido que envíe el formulario, sin embargo ahora muestra el siguiente error:

    «Apellido» is a required value.
    «Apellido» length must be equal or greater than 1 characters.

    Gracias por tu ayuda.

    Un saludo.

    • Responder Daniel Navarro Murillo |

      Hay dos formas de solucionarlo, una es la modificación del archivo app/code/core/Mage/Customer/Model/Customer.php (fíjate que hay un espacio en blanco entre las comillas de $this->setLastname(» «);) y la segunda modificar el tipo de campo en la base de datos.

      Si no conoces bien las implicaciones que puede tener la segunda de las opciones, te recomendaría la primera. Es algo tipo parche, pero funciona bien y en la mayoría de los casos suele servir (y si te arrepientes puedes volver atrás cuando quieras). La modificación de la base de datos es más permanente y si un día quieres deshacer el cambio y volver a pedir el apellido te plantearía algunos problemas.

  • Responder Jose A. |

    Pues yo he hecho todo y sigue apareciendo:
    «Apellido» is a required value
    «Apellido» length must be equal or greater then 1 characters
    He realizado los cambios correctamente en
    app/design/mi-package/mi-tema/customer/widget/name.phtml
    app/code/local/Mage/Customer/Model/Customer.php

  • Responder Diego Arroyo |

    Buenas, quisiera que alguien me ayude, en mi pagina quiero agregar el campo cumpleaños, ya habilite la opcion por sistemas/clientes/configuracion del cliente / crear nuevas opciones para los clientes, pero no me aparece cuando se esta realizando el registro.

    Gracias

  • Responder Manel |

    Hola Daniel, te agradezco el aporte. Me ha servido de mucho aunque he tenido que saltarme la parte del customer.php y forzarlo desde la db porque no había forma de que funcionara, quizás se deba a la versión 1.9, no lo se.
    Ahora me pregunto cómo puedo conseguir lo mismo en el billing y el shipping. ¿Puedes orientarme por favor?

    Gracias y un saludo.

  • Responder Alma Ochoa |

    Hola Daniel, espero me puedas ayudar. Necesito identificar el origen del registro en magento, es decir habrá un banner en la página principal que invitará a registrar al usuario y quiero saber quiénes se registran a partir de haber dado clic al enlace en dicho banner. En un principio pense en agregar un campo al registro «invisible» que este pre-llenado con un dato, pero no sé cómo hacerlo.

    Saludos y gracias!

  • Responder Carlos M |

    Buen dia Daniel, me sale en mi formulario de registro de los clientes una y otra vez q falta de llenar el campo de «Colonia» a pesar de q ya hayan dado de alta su direccion previamente con todos sus datos… que podrá ser?
    Te lo agradezco!

Hey! Qué opinas sobre el artículo?