Jump to content

Nuevo campo en la administración de clientes


himar

Recommended Posts

Hola a todos,

Llevo solo unos días trabajando con Prestashop, con la versión 1.5.4.0, el cual estoy intentando integrar con la aplicación de gestión de la empresa. Para ello se me hace necesario incluir un nuevo campo de cliente que almacene el código interno de la aplicación de gestión con la que se debe integrar.

 

La tienda solo será accesible a ciertos clientes, a los cuales les habremos abierto ficha de cliente previamente, es decir, desde la administración de Prestashop (crear cliente), y es allí donde quiero añadir el nuevo campo y donde será visible.

  • He creado el campo 'codigo_cliente' en la tabla xx_customer y he metido algunos códigos a mano desde phpMyAdmin.
  • He modificado /adminShop/themes/default/template/controller/customer/helpers/view/view.tpl para ver ese nuevo campo en el detalle del cliente.
  • He sobrescrito la clase Customer.php en la ruta /var/lumelco.es/clientes/tienda/override/classes/Customer.php (sólo he puesto el array de definicion: public static $definition y el método: public static function getCustomers()) donde he añadido en la definición el nuevo campo, y en el método getCustomers() le he añadido a la SELECT el campo `codigo_cliente`
  • He modificado /controllers/admin/AdminCustomersController.php para que el nuevo campo aparezca en el listado de clientes y en el método renderForm() he añadido al fields_form el nuevo campo para que aparezca en el formulario de edición del cliente.
  • He modificado /adminShop/themes/default/template/controllers/orders/helpers/view/view.tpl para que aparezca el código de cliente en el detalle de pedidos (desde la administración)
  • He modificado /controllers/admin/AdminOrdersController.php para que aparezca el código de cliente en el listado de pedidos de la administración.

Ahora viene la duda debido a mi total desconocimiento:

Al editar, desde la administración en la información de un cliente con código de cliente (metido desde phpMyAdmin) me aparece el campo para introducir el código de cliente, pero no me carga el valor almacenado en la base de datos, y al grabar me da el siguiente error:

 

[PrestaShopException]

 

Property Customer->codigo_cliente is not valid

at line 837 in file classes/ObjectModel.php

 

831.

832. $message = $this->validateField($field, $this->$field);

833. if ($message !== true)

834. {

835. if ($die)

836. throw new PrestaShopException($message);

837. return $error_return ? $message : false;

838. }

839. }

840.

841. return true;

 

Sin embargo si grabo un cliente de los que no tienen dicho campo nuevo, no da error y los cambios se almacenan en la base de datos.

 

¿Qué paso me falta para poder crear usuarios con ese campo nuevo?

Os agradezco vuestro tiempo.

Edited by himar (see edit history)
Link to comment
Share on other sites

K tal himar, puedes poner el código de Customer.php? en la definición del nuevo campo existe un campo para la validación, quizás sea ese el problema

 

p.ej yo tengo sobrescrito el Product y le añado un nuevo campo $select_fields, con una validación isUnsignedInt. Como es multishop hay que incluiro en la tabla XXX_shop, si fuese multilenguaje en la XXX_lang

 

class Product extends ProductCore
{

/** @var int Number of select fields */
public $select_fields;

const CUSTOMIZE_SELECTFIELD = 2;

public function __construct($id_product = null, $full = false, $id_lang = null, $id_shop = null, Context $context = null)
{
 //'select_fields' => array('type' => self::TYPE_INT, 'shop' => true, 'validate' => 'isUnsignedInt'),
 self::$definition['fields']['select_fields'] = array('type' => self::TYPE_INT,'shop' => true, 'validate' => 'isUnsignedInt');
 parent::__construct($id_product,$full,$id_lang,$id_shop,$context);
}

Link to comment
Share on other sites

Hola, lo primero de todo muchísimas gracias egomezpe!!! :)

 

Efectivamente tenía un 'validate' => 'isName' y mi código de cliente está compuesto por números y puntos y no pasaba la validación. Ahora ya no da error, de momento le he quitado la validación. Primer problema solucionado!! :)

 

 

El siguiente paso que no consigo ver, es que me muestre el valor de base de datos en el campo de formulario en la edición del cliente, no sé cómo lo recupera o dónde tengo que decirle que lo haga... Adjunto una imagen para más aclaración

 

Gracias nuevamente

post-548545-0-55025100-1366886985_thumb.png

  • Like 1
Link to comment
Share on other sites

No estoy muy seguro pero una vez metido el campo en la estructura del renderForm en la línea 1595 en AdminController setea los valores que se muestran en el formulario

$this->setHelperDisplay($helper);
  $helper->fields_value = $this->getFieldsValue($this->object);

 

a partir del objeto Modelo (el cliente). Seguro que si tiene el mismo nombre en el formulario (name) que en el objeto lo copia automáticamente

  • Like 1
Link to comment
Share on other sites

Das en el clavo a la primera egomezpe, en el renderForm de /controllers/admin/AdminCustomerController.php había puesto codigo_cliemte. Efectivamente si el nombre coincide en el formulario y en el objeto, se establece el valor automáticamente.

 

Mil gracias por las explicaciones y la concreción, todo funcionando de primera. :D

Link to comment
Share on other sites

De nada himar. Se lo complicado que resulta meterse a trastear con Controladores y demás. El código de prestashop es de calidad, pero no esta muy comentado y la documentación es mas bien escasa, menos mal que debugando y con un buen IDE (yo uso Eclipse con pdt) se van sacando las modificaciones. Y sobretodo con una buena comunidad de usuarios claro :) .

Link to comment
Share on other sites

  • 5 months later...

Hola que tal, soy nuevo en prestashop y tengo una duda similar.

Quiero poner un campo extra en la seccion de clientes , ya logre mostrarlo en la vista de administracion modificando el archivo "AdminCustomersController.php" añadiendo estas lineas:

 

Linea 305 :   array(

'type' => 'text',
'label' => $this->l('Codigo:'),
'name' => 'codigo',
'size' => 100,
'required' => false
),
 
 
Linea 106: ),
'codigo' => array(
'title' => $this->l('Codigo'),
'width' => 'auto'
),
 
El problema es que cuando quiero guardar un nuevo codigo editando a este cliente , no me guarda nada ( ya cree la columna en la tabla customer de la bd) . Que tengo que hacer para que me guarde este nuevo campo. 
 
Nota: este campo es para control personal solo sera mostrado en el admin asi que no requiero que el cliente lo vea.
 
Envio unas pastallas para que sea mas claropost-714181-0-79520700-1380954361_thumb.pngpost-714181-0-55550600-1380954367_thumb.png
 
Link to comment
Share on other sites

Es mejor que habrás nuevos temas para nuevas cuestiones. (Éste no se dio por solucionado en su momento y a quedado colgado..)

 

Sólo te falta definir en la clase Customer ese nuevo campo (con el mismo nombre que tiene en base de datos y en tú código osea "código"). Haz un override (o prueba directamente en la clase Customer padre) en la carpeta /override (luego borra el fichero cache/class_index.php, que se regenera).

 

P.ej este es un booleano

class Customer extends CustomerCore
{
	/** {*rf edit task 3 first fee charge*}*/
	public $pele_first_fee_paid;
	
	
		
	public function __construct($id_product = null, $full = false, $id_lang = null, $id_shop = null, Context $context = null)
	{
		self::$definition['fields']['pele_first_fee_paid'] = array('type' => self::TYPE_BOOL,  'validate' => 'isBool');
	
		parent::__construct($id_product,$full,$id_lang,$id_shop,$context);
	}
}

para un string tienes

'firstname' => 	array('type' => self::TYPE_STRING, 'validate' => 'isName', 'required' => true, 'size' => 32)

En cualquier clase modelo (Customer, Product,..etc) tienes ejemplos de definiciones, si son multiidioma, multitienda, validaciones..(acaban llamando a la Clase Validate)

 

Saludos

Link to comment
Share on other sites


De lujo , si funciono a la perfeccion.
Gracias .
 
Perfecto !
 
Cierro el tema.
 
Para cualquier otra duda, no olvides crear un tema nuevo y la comunidad de Prestashop estará encantada de atenderte.
 
Saludos !
Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
×
×
  • Create New...