Magento – Añadir campo al registro del cliente
Os detallo cómo añadir un nuevo campo en el formulario al registro del cliente en Magento 1.X. Vaya por delante que no es tarea sencilla. Intentaré ir paso a paso, y ya os digo que personalmente he tenido problemas que he ido solucionando.
Lo haremos creando un módulo y subiéndolo al servidor donde esté alojada nuestra tienda. Se trata de subir ciertos ficheros que os detallo, y automáticamente se instala todo.
El ejemplo siguiente añade un campo en el formulario registro dónde el usuario puede escoger a que fundación va destinado parte del coste de la compra.
Las carpetas que no existan, las creáis. Las pruebas se han realizado sobre Magento 1.7.0.2 (otras versiones no se si funcionan)
Creamos los ficheros necesarios
app/etc/modules/Obrasocial_Customer.xml
<config>
<modules>
<Obrasocial_Customer>
<codePool>local</codePool>
<active>true</active>
</Obrasocial_Customer>
</modules>
</config>
app/code/local/Obrasocial/Customer/Model/Entity/Setup.php
<?php
class Obrasocial_Customer_Model_Entity_Setup extends Mage_Customer_Model_Entity_Setup
{
public function getDefaultEntities(){
return array(
'fundacio'=>array(
'type'=> 'select',
'label'=> 'Obra social',
'visiable' => true,
'required' => true,
'sort_order' => 0,
)
);
}
}
?>
app/code/local/Obrasocial/Customer/etc/config.xml
<?xml version="1.0"?>
<config>
<modules>
<Obrasocial_Customer>
<version>1.0.0.0</version>
</Obrasocial_Customer>
</modules>
<global>
<fieldsets>
<customer_account>
<fundacio><create>1</create><update>1</update></fundacio>
</customer_account>
</fieldsets>
<models>
<Obrasocial_Customer>
<class>Obrasocial_Customer_Model</class>
</Obrasocial_Customer>
</models>
<helpers>
<Obrasocial_Customer>
<class>Obrasocial_Customer_Helper</class>
</Obrasocial_Customer>
</helpers>
<resources>
<customerattribute_setup>
<setup>
<module>Obrasocial_Customer</module>
<class>Obrasocial_Customer_Model_Entity_Setup</class>
</setup>
</customerattribute_setup>
</resources>
</global>
</config>
app/code/local/Obrasocial/Customer/sql/customerattribute_setup/mysql4-install-0.1.0.php
<?php
$installer = $this;
$installer->startSetup();
$installer->addAttribute('customer', 'fundacio', array(
'label' => 'Obra social',
'visible' => 1,
'required' => 1,
'position' => 1,
'sort_order' => 0
));
$installer->endSetup();
$customer = Mage::getModel('customer/attribute')->loadByCode('customer', 'fundacio');
$forms= array('customer_account_edit', 'customer_account_create', 'adminhtml_customer', 'checkout_register');
$customer->setData('used_in_forms', $forms);
$customer->save();
?>
app/design/frontend/default/mitema/template/customer/form/edit.phtml
Este fichero lo he copiado de la carpeta app/design/frontend/base/default/template/customer/form/edit.phtml. Una vez copiado a nuestra plantilla, lo modifico añadiendo al formulario el campo que necesito:
<li>
<label for="fundacio" class="required"><em>*</em>Obra social on vol que destinem l'ajuda</label>
<div class="input-box">
<select name="fundacio" id="fundacio" class="input-text required-entry">
<option value="Fundació Carreras">Fundació Carreras</option>
</select>
</div>
</li>
app/design/frontend/default/mitema/template/customer/form/register.phtml
Este fichero lo he copiado de la carpeta app/design/frontend/base/default/template/customer/form/register.phtml. Una vez copiado a nuestra plantilla, lo modifico añadiendo al formulario el campo que necesito:
<li>
<label for="fundacio" class="required"><em>*</em>Obra social on vol que destinem l'ajuda</label>
<div class="input-box">
<select name="fundacio" id="fundacio" class="input-text required-entry">
<option value="Fundació Carreras">Fundació Carreras</option>
</select>
</div>
</li>
app/design/frontend/default/mitema/template/persistent/customer/form/register.phtml
Este fichero lo he copiado de la carpeta app/design/frontend/base/default/template/persistent/customer/form/register.phtml. Una vez copiado a nuestra plantilla, lo modifico añadiendo al formulario el campo que necesito:
<li>
<label for="fundacio" class="required"><em>*</em>Obra social on vol que destinem l'ajuda</label>
<div class="input-box">
<select name="fundacio" id="fundacio" class="input-text required-entry">
<option value="Fundació Carreras">Fundació Carreras</option>
</select>
</div>
</li>
Los subimos al servidor
Aquí cuidado. Normalmente según que carpetas tienen permisos que no nos permiten subirlo mediante FTP, por lo que deberemos entrar al servidor y asignar a las carpetas privilegios de escritura, los subimos y volvemos a dejar los mismos permisos que teníamos.
Antes de probar
Antes de nada, limpiar caché (Sistema > Cache > Limpiar caché).
Las pruebas
Al registrarse un usuario le sale el correspondiente campo, al editar su información también puede editar el campo, y en la parte administrativa también podemos ver y modificar el campo.
Problemas
- Pues las diferentes versiones de Magento funcionan de forma diferente. Las carpetas no son estas.
- Si cambias permisos de carpetas, la tienda puede dejar de funcionar. Recordad antes los permisos que tienen.
Os recomiendo
- Primero hacedlo en local. Si os funciona, realizar el proceso en el servidor.
- Haced copias de seguridad.
Espero que os sea de utilidad el artículo: Magento – Añadir campo al registro del cliente. Y tened en cuenta que es para la versión Magento 1.X.
Más información
Hola! Muy interesante, gracias por compartir la información. La verdad es que todo el tema del e-commerce con Magento es muy interesante, yo no lo conozco demasiado porque lo llevaban la gente de Premium eCommerce, pero me interesa mucho!
Silvia
En primer lugar muchas gracias por el post, me ha resultado tremendamente util. Pero tengo una duda, hice un prueba creando un campo y todo funcionó correctamente, pero ahora quiero agregar más campos, ¿como se haría?, ¿como puedo forzar para que se ejecute nuevamente el install?.
Hola David, te recomiendo que hagas todos los campos a la vez. Así evitarás problemas y tener que crear diferentes modelos. Así, te recomiendo que crees un modelo nuevo que se llame por ejemplo registro completo, y ahí añadas todos los campos que necesites.
He realizado todo igual, se muestra en todos los formularios pero no guarda en la Base de datos y tampoco recupera a pesar de colocar, el metodo getRazonsocial:
Razon Social
<input type="text" name="Razonsocial" id="Razonsocial" class="input-text" value="escapeHtml($this->getFormData()->getRazonsocial()) ?>»>