Podeis ver la aplicación online AQUI
Podeis descargar el código AQUI
Bueno podeis ver que tengo el código mas organizado y separado por ficheros para hacer la aplicación mas mantenible. También podeis ver como he solucionado el tema del autoajuste de las grid que varias personas preguntaban por este foro.
Como buen programador me interesa tener un código límpio para hacer buenos desarrollos y futuras ampliaciones.
Bueno ahora os planteo el problema que tengo. A ver si me ayudais a solucionarlo y puedo avanzar.
Podeis ver en el archivo app.client_window.js está la definición del código de la ventana que me da de alta los clientes.
- Código: Seleccionar todo
Ext.ns('app');
app.clientWindow = Ext.extend(Ext.Window, {
// Constructor Defaults, can be overridden by user's config object
layout:'fit',
width:700,
height:500,
modal: true,
closeAction:'hide',
plain: true,
buttons: [
{
id: 'button_save',
text: 'Guardar',
scope: this,
handler: function () {
this.saveClient() ;
}
}
,{
text: 'Cerrar',
scope: this,
handler: function () {
this.closeWindow();
}
}
]
,
newForm: new Ext.FormPanel({
id:'window_client_form',
labelWidth: 75, // label settings here cascade unless overridden
url:'clientes/save_new_client.php',
frame:true,
border:false,
bodyStyle:'padding:5px 5px 0',
width: 700,
defaults: {width: 230},
defaultType: 'textfield',
items: [
{
fieldLabel: 'Razón Social',
name: 'cli_razon_social',
allowBlank:false
},{
fieldLabel: 'CIF/NIF',
name: 'cli_cif_nif',
allowBlank:false
},{
fieldLabel: 'Dirección',
name: 'cli_direccion'
},
{
fieldLabel: 'Localidad',
name: 'cli_localidad',
allowBlank:false
},
{
fieldLabel: 'CP',
name: 'cli_cp',
allowBlank:false
},
{
fieldLabel: 'Provincia',
name: 'cli_provincia',
allowBlank:false
},
{
fieldLabel: 'Pais',
name: 'cli_pais',
allowBlank:false
},
{
fieldLabel: 'Teléfono',
name: 'cli_telefono'
},
{
fieldLabel: 'Email',
name: 'cli_email',
vtype:'email'
},
{
fieldLabel: 'Web',
name: 'cli_web'
},
{
fieldLabel: 'Cuenta Bancaria',
name: 'cli_cuenta_banco'
}
]
})
,
closeWindow: function () {
alert("entro");
this.newForm.getForm().reset();
this.hide();
},
saveClient : function () {
this.newForm.getForm().submit({
waitTitle:'Creando registro ...',
//waitMsg:'Sending data...',
success: function(f, a){
if (a.success)
{
f.reset();
//Creamos la ventana
this.hide();
//Recargamos la grid
Ext.example.msg('Mensaje del sistema', 'Nuevo cliente creado');
app.client_store.reload();
}
},
failure: function(){
// código para error
}
});
}
,
initComponent : function () {
//Comprovamos si se le pasa para que no de error
if (this.record) var record=this.record.data;
var args = {
items : [this.newForm]
}
//Dependiento de tipo de ventara realizacremos una acciones o otras
switch (this.windowType)
{
case 'new':
this.title='Nuevo Cliente'
break;
case 'modify':
this.title='Editar registro: ' + record.cli_razon_social;
break;
}
Ext.apply(this, args);
app.clientWindow.superclass.initComponent.apply(this, arguments);
}
});
// register xtype to allow for lazy initialization
Ext.reg('client_window', app.clientWindow );
La idea es la siguiente. Dejar toda la programación referente al alta y modificación de los clientes encapsulada aqui.
Lo plantee así para poder usar la ventana desde diferentes sitios y funcionaria de la siguiente forma:
como veis le pasamos diferentes parámetros que me marcarán el modo de trabajar de la ventana.
win = new app.clientWindow({windowType:'new'});
win.show(this);
El parámetro windowType indicará si se tiene que crear un nuevo cliente (new), si se tiene que modificar
uno existente ( modify ), en este caso en el parámetro record, se parasé el record que contine los datos del cliente.
El parámetro "modal" lo tengo pensado para un modo de funcionamiento diferente. Ya os contaré mas adelante.
Bueno, ahora necesito vuestra ayuda ...

El problema está en que al clickar los botos de la ventana no hace nada. Si clicko en cerrar, el firebug dice "this.closeWindow is not a function"
Si vemos la definición de los botones:
- Código: Seleccionar todo
buttons: [
{
id: 'button_save',
text: 'Guardar',
scope: this,
handler: function () {
this.saveClient() ;
}
}
,{
text: 'Cerrar',
scope: this,
handler: function () {
this.closeWindow();
}
}
]
Creo que el problema esta en el uso del "this" ,que dentro de la función ese this no se refiere a app.clientWindow. He mirado el tema de los scope pero no lo entiendo completamente. Entendi que el el scope es mas o menos el valor de la variable this.
Si estas trabajando dentro objeto el this es ese objeto , pero en una función interior no es asi. Las funciones no tienen this ( o scope ) y este hace referencia al objeto window del navegador y claro aqui no hay definida ninguna funcion saveClient.
No se si me explicado correctamente.
Bueno, el tema es que no se como solucionar esto. Si podeis arrojar un poco de luz estaria muy agradecido y seria bueno para toda la comunidad ya parece una programación que se use con frequencia.
Toda ayuda será bien recibida.
Un saludo.



