Que sabes de GNU/Linux?

martes, 8 de diciembre de 2009

Postgresql - Actualizar tablas de forma dinámica la estructura es de tablas de relleno

-- Function: sdd_execute_idu_relleno(character varying, integer, character varying, character varying, integer, smallint)

-- DROP FUNCTION sdd_execute_idu_relleno(character varying, integer, character varying, character varying, integer, smallint);

CREATE OR REPLACE FUNCTION sdd_execute_idu_relleno(s_tabla_nom character varying, i_id integer, s_descripcion character varying, s_sintetico character varying, i_estado integer, i_oper smallint)
RETURNS integer AS
$BODY$
DECLARE s_error VARCHAR(255);
DECLARE s_dinamic_sql TEXT;
DECLARE i_error INTEGER;
DECLARE i_return SMALLINT;
DECLARE s_descp_exec VARCHAR(255);
DECLARE s_log VARCHAR(255);
DECLARE s_opera VARCHAR(20);
BEGIN
/*
Funcion:
Permite realizar la ejecucion dinamicas de las funciones
Parametros:
Los valores fijos de las tablas de rellenos son:
i_id--> El valor identificador de la tabla es un valor SERIAL
s_descripcion --> Contiene la descripcion de la tabla de relleno es un valor del tipo char
i_estado--> es el estado que contiene en la tabla 1/habilitado-0/inhabilitado
i_oper --> Contien el tipo de operacion a realizar 1/Delte-2/Insert-3/delete
*/


i_return := 0;
/*
Las tipos de operaciones de IDU se encuentran marcadas por i_oper
validamos que se ingrese un valor valido 0 o NULL son no validos
*/
IF (i_oper = NULL) OR (i_oper <= 0) THEN
s_error := 'No se ingreso ningún valor para realizar operacion i_oper';
RAISE WARNING '%',s_error;
i_error = 25000;
RETURN i_error;
END IF;

/*
1 - Operacion del tipo DELETE(1)
*/
IF (i_oper = 1) THEN
/*
Validamos el estado de la clave principal :-)
*/
IF (i_id = NULL) OR (i_id = 0) THEN
s_error := 'No se ingreso un identificador valido para borrar i_id';
RAISE WARNING '%',s_error;
i_error := 30000;
RETURN i_error; /*Id para delete*/
END IF;

/*
Ejecucion dinamica del select esto puede se aplicado al final
*/
s_dinamic_sql := 'DELETE FROM '||s_tabla_nom||' WHERE id = '||to_char(i_id,'999');
s_descp_exec := 'borro';
/*
Marcamos la etiqueta para que el log marque q estamos haciendo
*/
s_opera := 'DELETE =>';
END IF;


/*
Controlde Nulidad tanto para Insert Como Update es el mismo :-)
*/

If(i_oper = 1) OR (i_oper = 2) Then
/*
Validamos la existencia de los valores para la clave principal
*/

i_error := 0;
/*=========================================================================================*/
/*CONTROL DE NULIDAD DE VARIABLES NO NULAS APRA REALIZAR EL INSERT DE LOS DATOS */
/*=========================================================================================*/
IF (s_descripcion IS NULL) OR(s_sintetico IS NULL) OR (i_estado = NULL) THEN

IF (descripcion IS NULL) THEN
s_error := s_error||'descripcion';
END IF;
IF (sintetico IS NULL) THEN
s_error := s_error||'sintetico';
END IF;

IF (i_estado IS NULL) THEN
s_error := s_error||'estado';
END IF;

RAISE WARNING 'Parametros nulos (%)',s_error;
i_error := 24000;
RETURN i_error;
END IF;

End If;

/*
2 - Operacion del Tipo Insert(2)
*/

IF (i_oper = 2) THEN
s_dinamic_sql :='INSERT INTO '||s_tabla_nom||'
(descripcion,sintetico,estado)
VALUES('||quote_literal(s_descripcion)||','||
quote_literal(s_sintetico)||','||
to_char(i_estado,'999')||')';

s_opera := 'INSERT =>';
END IF;

/*
3 - Operacion de Update (3)
*/
IF (i_oper = 3) THEN
/*
SP dinamico de UPDATE
*/
s_dinamic_sql := 'UPDATE '||s_tabla_nom||' SET '||
'descripcion= '||quote_literal(s_descripcion)||','||
' sintetico= '||quote_literal(s_sintetico)||','||
' estado= '||to_char(i_estado,'999')||
' WHERE id= '||to_char(i_id,'999');
s_opera := 'UPDATE =>';
END IF;

/*
Ejecutamos el valor de forma dinamica esto es posible ya
que las operaciones de IDU siempre devuelve la cantidad
de filas afectadas
*/

EXECUTE s_dinamic_sql;

/*
Controlamos que se ejecute el proceso
*/
GET DIAGNOSTICS i_return = ROW_COUNT;
IF i_return >0 THEN
i_error :=0;
/*
Guardamo en el log el evento para control a posteridad
*/
s_log := s_opera||' Tabla de relleno '||s_tabla_nom||' i_id:'||to_char(i_id,'999');
SELECT * INTO i_error FROM ssg_iutsg_log_admin('4',s_log);
ELSE
i_error := 26000;
RAISE WARNING 'No se % ningun valor para la clave: (%)',s_descp_exec,s_dinamic_sql;
RETURN i_error; /*los errores de 600 son de UDI*/
END IF;


RETURN i_error;

END
$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100;
ALTER FUNCTION sdd_execute_idu_relleno(character varying, integer, character varying, character varying, integer, smallint) OWNER TO <>;

Postgresql - Validar que la entrada sea solo números

-- Function: sgl_solo_numeros(character varying)

-- DROP FUNCTION sgl_solo_numeros(character varying);

CREATE OR REPLACE FUNCTION sgl_solo_numeros(s_value character varying)
RETURNS integer AS
$BODY$
DECLARE i_pasada INTEGER;
DECLARE i_length_char INTEGER;
DECLARE i_error INTEGER;
DECLARE s_error VARCHAR(255);
DECLARE s_subcadena VARCHAR(2);
BEGIN

i_error := 0;
IF (s_value IS NULL) OR (s_value = '') THEN
s_error := 'No se ingreso ningún valor para validar';
RAISE WARNING '%',s_error;
i_error := 22500;
RETURN i_error;
END IF;

/*
Determinamos si la cadena tiene un tamaño relativo
*/

i_length_char := char_length(s_value);

IF (i_length_char <= 0) Then
s_error := 'La cadena ingresada no posee valores';
RAISE WARNING '%',s_error;
i_error := 22600;
RETURN i_error;
End If;

i_pasada := 1;
WHILE i_pasada <= i_length_char LOOP
s_subcadena := substr(s_value,i_pasada,1);
IF (ascii(s_subcadena) < 48) OR (ascii(s_subcadena) > 57) THEN
RAISE WARNING '%',s_subcadena;
i_error = i_pasada; /*no posee solo numeros*/
RETURN i_error;
END IF;
i_pasada := i_pasada +1;
END LOOP;

RETURN i_error;
END
$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100;
ALTER FUNCTION sgl_solo_numeros(character varying) OWNER TO <>;

Postgresl - Validar cadenas validas

-- Function: sgl_solo_caracteres(character varying)

-- DROP FUNCTION sgl_solo_caracteres(character varying);
/*Esta funcion controla que se ingresen solo caracteres*/
CREATE OR REPLACE FUNCTION sgl_solo_caracteres(s_value character varying)
RETURNS integer AS
$BODY$
DECLARE i_pasada INTEGER;
DECLARE i_length_char INTEGER;
DECLARE i_error INTEGER;
DECLARE s_error VARCHAR(255);
DECLARE s_subcadena VARCHAR(2);
BEGIN

i_error := 0;
IF (s_value IS NULL) OR (s_value = '') THEN
s_error := 'No se ingreso ningún valor para validar';
RAISE WARNING '%',s_error;
i_error := 22500;
RETURN i_error;
END IF;

/*
Determinamos si la cadena tiene un tamaño relativo
*/

i_length_char := char_length(s_value);

IF (i_length_char <= 0) Then
s_error := 'La cadena ingresada no posee valores';
RAISE WARNING '%',s_error;
i_error := 22600;
RETURN i_error;
End If;

i_pasada := 1;



WHILE i_pasada <= i_length_char LOOP
s_subcadena := substr(s_value,i_pasada,1);
IF (ascii(UPPER(s_subcadena)) < 65) OR (ascii(UPPER(s_subcadena)) > 90) THEN
RAISE WARNING '%',s_subcadena;
i_error = i_pasada; /*no posee solo numeros*/
RETURN i_error;
END IF;
i_pasada := i_pasada +1;
END LOOP;

RETURN i_error;
END
$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100;
ALTER FUNCTION sgl_solo_caracteres(character varying) OWNER TO ;

Postgresql - Recalcular edad y actualizar edad con cursor

-- Function: sgl_recacl_edad()

-- DROP FUNCTION sgl_recacl_edad();

CREATE OR REPLACE FUNCTION sgl_recacl_edad()
RETURNS integer AS
$BODY$
DECLARE s_error VARCHAR(255);
DECLARE s_log VARCHAR(255);
DECLARE i_error INTEGER;
DECLARE s_id VARCHAR(20);
DECLARE cafiliados refcursor;
DECLARE c_edad smallint;
DECLARE c_fechanac timestamp without time zone;
DECLARE fechaactual timestamp without time zone;
DECLARE c_id integer;
DECLARE edad_act smallint;
DECLARE dia_nac SMALLINT;
DECLARE dia_actual SMALLINT;
DECLARE mes_actual SMALLINT;
DECLARE mes_nac SMALLINT;
BEGIN
/*
*Funcion: Permite modificar y recalcular la edad de un cliente
*/
fechaactual := current_timestamp;

/*Transaccion para los datos de los clientes*/
--START TRANSACTION;

OPEN cafiliados
FOR SELECT fechanac,edad,id FROM t_afiliados;

FETCH cafiliados INTO c_fechanac,c_edad,c_id;
/*si se encontraron filas*/
while found loop
/*calculamos la edad del cliente de nuevo*/
SELECT s_calcula_edad(c_fechanac) INTO edad_act;
dia_nac := EXTRACT(DAY FROM c_fechanac);
dia_actual := EXTRACT(DAY FROM fechaactual);
mes_nac := EXTRACT(MONTH FROM c_fechanac);
mes_actual := EXTRACT(MONTH FROM fechaactual);

IF (dia_nac = dia_actual ) AND (mes_nac = mes_actual) THEN
UPDATE t_afiliados
SET edad=edad_act
WHERE id = c_id;
/*Determinamos si se recuperaron datos desde la busqueda de info*/

IF FOUND THEN
i_error := 0;
ELSE
i_error := -1;/*no se actualizaron filas*/
END IF;
END IF;

/*sacamos los datos de la proxima fila*/
FETCH cafiliados INTO c_fechanac,c_edad,c_id;
end loop;

CLOSE cafiliados;


RETURN i_error;
END
$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100;
ALTER FUNCTION sgl_recacl_edad() OWNER TO <>;
/*tambien se puede utilizar de la seguiente forma l actualizacion*/
UPDATE t_afiliados
SET edad=s_calcula_edad(current_timestamp,fechanac)

Postgrsql - Calcula edad con rango de fechas

Ejemplo de calculo de la edad con un rango de fechas desde hasta


-- Function: s_calcula_edad(timestamp without time zone)

-- DROP FUNCTION s_calcula_edad(timestamp without time zone);

CREATE OR REPLACE FUNCTION s_calcula_edad(fechanac timestamp without time zone)
RETURNS integer AS
$BODY$
DECLARE s_fecha VARCHAR(60);
DECLARE i_fecha INTEGER;
BEGIN

/*
Este procedimiento permite calcular la edad de una persona a partir de la fecha ingresada
*/

s_fecha := age(now(),fechanac);

If (s_fecha IS NULL) OR (s_fecha = '') Then
return -1; /*Error la fecha no es valida*/
End If;

/*
Recupero solamente la edad de la persona
*/
s_fecha := substring(s_fecha,1,strpos(s_fecha,' '));

i_fecha := rtrim(s_fecha);

RETURN i_fecha;
END
$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100;
ALTER FUNCTION s_calcula_edad(timestamp without time zone) OWNER TO postgres;

miércoles, 1 de abril de 2009

Lector de estatus de interfaces en Linux.c

#include
#include
#include
#include
typedef unsigned long long ull

int parseDevFile(const char * iface, ull *bRx, ull *pRx,
ull *bTx, ull *pTx)
{
FILE * fp = NULL;
char * line = NULL;
unsigned int len = 0;
fp = fopen("/proc/net/dev", "r");
if(fp==NULL)
{
return -1;
}
while(getline(&line,&len,fp)!= -1)
{
if(strstr(line,iface)!=NULL){
sscanf(strstr(line,":")+1,"%llu%llu%*u%*u%*u%*u%*u%*u%llu%llu",bRx, pRx, bTx, pTx);
}
}
fclose(fp);
free(line);
return 0;
}

void dumpInterfaceUsage(const char * iface)
{
ull ifaceBRxOld=0,ifaceBTxOld=0,ifacePRxOld=0,ifacePTxOld=0;
ull ifaceBRxNew=0,ifaceBTxNew=0,ifacePRxNew=0,ifacePTxNew=0;
const int SLEEP_TIME = 2;

if(parseDevFile(iface,&ifaceBRxOld,&ifacePRxOld,&ifaceBTxOld,&ifacePTxOld)==-1) return;
sleep(SLEEP_TIME);
while(1)
{
if(parseDevFile(iface,&ifaceBRxNew,&ifacePRxNew,&ifaceBTxNew,&ifacePTxNew)==-1) return;
printf("%s In: %8.2f kbyte/s %5llu P/s Out: %8.2f kbyte/s%5llu P/s\n", iface,
(ifaceBRxNew-ifaceBRxOld)/(SLEEP_TIME * 1024.0),
(ifacePRxNew-ifacePRxOld)/SLEEP_TIME,
(ifaceBTxNew-ifaceBTxOld)/(SLEEP_TIME * 1024.0),
(ifacePTxNew-ifacePTxOld)/SLEEP_TIME);
ifaceBRxOld=ifaceBRxNew;
ifaceBTxOld=ifaceBTxNew;
ifacePRxOld=ifacePRxNew;
ifacePTxOld=ifacePTxNew;
sleep(SLEEP_TIME);
}
}

int main(int argc, char **argv)
{
if(argc != 2)
{
printf("Usage: %s interfacename\n", argv[0]);
exit(1);
}
dumpInterfaceUsage(argv[1]);
return 0;
}

miércoles, 21 de enero de 2009

Ejemplo de Guardado de Imagenes u archivos con cakephp

mysql> DESCRIBE bdbanners;
+-------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| nombre | varchar(50) | NO | | | |
| descripcion | varchar(80) | NO | | | |
| image | blob | YES | | NULL | |
| type | varchar(30) | NO | | | |
| size | int(11) | NO | | | |
+-------------+-------------+------+-----+---------+----------------+
/*
*VISTA VER FOTOS
*/






echo "

".$bdbanners_info['Bdbanner']['id']."

";
echo "Nombre:";
echo "

".$bdbanners_info['Bdbanner']['nombre']."

";
echo "Descripcion:";
echo "

".$bdbanners_info['Bdbanner']['descripcion']."

";
echo $html->link('Volver Atras','/bdbanners/');
?>


/*
*VISTA INDEX
*/

Listado de Fotos Cargadas





















Id Nombre Foto Descripcion Borrar Descargar
link($dbbanner['Bdbanner']['nombre'],'/bdbanners/verfotos/'.$dbbanner['Bdbanner']['id']); ?> link("Borrar",'/bdbanners/borrar/'.$dbbanner['Bdbanner']['id']); ?> link("Descargar",'/bdbanners/dowload/'.$dbbanner['Bdbanner']['id']); ?>



link("Nueva Foto",'/bdbanners/ingresar');?>


/*
*VISTA INGRESAR
*/

Ingresar nueva Foto a la Base de datos



echo $form->create('Bdbanner',array('action'=>'ingresar','type'=>'file'));
echo $form->input('nombre',array('lable'=>'Nombre'));
echo $form->input('descripcion',array('lable'=>'Decripcion'));
echo $form->input('image',array('type'=>'file','label'=>'Imagen'));
echo $form->end('Guardar Imagen');

echo $html->link('Volver Atras','/bdbanners/');

?>


/*
*MODELO
*/
class Bdbanner extends AppModel{
var $name = 'Bdbanner';
var $validate = array('nombre'=>array('rule'=>'alphaNumeric','message'=>'Solo se aceptan Letras y Números'));
}
?>

/*
*CONTROLADOR
*/

class BdbannersController extends AppController{
var $name = 'Bdbanners';

/*
*Funcion: permite visualizar la informacion principal
*/
function index(){
$this->set('dbbanners',$this->Bdbanner->findAll());
}

/*
*Funcion: permite ingresar un nuevo archivo del tipo banner
*/
function ingresar(){
if(!empty($this->data)){
/*Permite cargar la imagen y determinar si no fue pasado un archivo no permitido*/
if(!is_uploaded_file($this->data['Bdbanner']['image']['tmp_name'])){
$this->flash('El archivo se encuentra con error','/bdbanners/');
return;
}
$fileData = fread(fopen($this->data['Bdbanner']['image']['tmp_name'], "r"),
$this->data['Bdbanner']['image']['size']);

$this->data['Bdbanner']['type']=$this->data['Bdbanner']['image']['type'];
$this->data['Bdbanner']['size']=$this->data['Bdbanner']['image']['size'];
$this->data['Bdbanner']['image'] =$fileData;

if($this->Bdbanner->save($this->data)){
$this->flash('Los datos Fueron Guardados Satisfactoriamente','/bdbanners/');
}else{
$this->flash('No se Pudieron Guardar los datos Intente Nuevamente','/bdbanners/');
}

}
}

/*
*Funcion: permite ver la foto
*/
function verfotos($id = null){
$this->Bdbanners->id = $id;
$this->set('bdbanners_info',$this->Bdbanner->read());

}
/*
*Funcion: Permite borrar una entrada
*/
function borrar($id = null){
$this->Bdbanner->del($id);
$this->flash('La imagen fue borrada satisfactoriamente','/bdbanners');

}

/*
*Funcion: permite recuperar o descargar los datos
*/
function dowload($id){
$file = $this->Bdbanner->findById($id);
header('Content-type: ' . $file['Bdbanner']['type']);
echo $file['Bdbanner']['image'];
/*header('Content-length: ' . $file['Bdbanner']['size']);
header('Content-Disposition: attachment; filename="'.$file['Bdbanner']['nombre'].'"');*/

exit();
}
}
?>

miércoles, 7 de enero de 2009

Ejemplo - Stored Procedure en Sybase

/*
Ejemplo Cursores en Sybase
Funcion: Este script permite realizar la cancelacion de las deudas de un cliente
recorriendo las deudas y cancelando las mismas hasta que el monto abonado total
de cliente llegue a tener 0.
*/
/*Tabla de deudas de cliente - relacion deuda cliente*/
SELECT
DROP TABLE #cli_deuda
go
CREATE TABLE #cli_deuda(id_deuda INTEGER,deuda NUMERIC(17,2) )
go
INSERT INTO #cli_deuda(id_deuda,deuda)
SELECT 1,25.99
UNION
SELECT 2,120.99
UNION
SELECT 3,130.99
UNION
SELECT 4,150.99
go

if object_id('sgl_cancela_deuda') >0 DROP PROC sgl_cancela_deuda
go
CREATE PROC sgl_cancela_deuda
@importe_total NUMERIC(17,2) = NULL
AS
DECLARE @status INTEGER
DECLARE @id_deuda_c INTEGER
DECLARE @deuda_c NUMERIC(17,2)
DECLARE @error INTEGER
DECLARE @adeuda NUMERIC(17,2)

SELECT @status = 0

/*El select que recuperara los datos*/
declare deudas cursor for
SELECT id_deuda,deuda
FROM #cli_deuda


open deudas
select @error = @@error

if @error !=0 begin
return @status
end

/*recuperar una fila a la ves del cursor*/
fetch deudas into @id_deuda_c,@deuda_c

if @@sqlstatus = 2
begin
close deudas
deallocate cursor deudas
return @status
END

/*recorrer todas las filas*/
while @@sqlstatus<>2
begin

if @@sqlstatus = 1
begin
close deudas
deallocate cursor deudas
return @status
end

/*Proceso general del cursor aqui va el script
que sea necesatio ejecutar para c/u de las filas*/
/*Sin importe total para cancelar deudas*/
if @importe_total = 0 Goto Salir

if @importe_total >= @deuda_c
Begin
/*se paga el importe total*/
SELECT @adeuda = 0
SELECT @importe_total = @importe_total - @deuda_c
end
Else
Begin
SELECT @adeuda = @deuda_c - @importe_total
SELECT @importe_total = 0
End

print "Adeuda:%1!, para el id: %2!,total %3! ",@adeuda,@id_deuda_c,@importe_total

/*Recuperams la proxima fila*/
fetch deudas into @id_deuda_c,@deuda_c
select @error= @@error
end

Salir:
close deudas
deallocate cursor deudas

RETURN @status

go
--EXEC sgl_cancela_deuda @importe_total= 428.96 --> cancelacion justa
--EXEC sgl_cancela_deuda @importe_total= 50.96 --> cancela 1 y otra descuenta

lunes, 5 de enero de 2009

LISTA CON PHP - users -tipousers

Controlador es el siguiente

class UsersController extends AppController{
var $name = 'Users';
var $helpers=array('Html','Form','Ajax');
var $uses = array('Tipouser','User');
var $displayField = "tipousers";

function index($order = null){

SWITCH($order){
CASE 1:
$this->set("users",$this->User->findAll(null,null,'username',null,null,null));
break;
CASE 2:
$this->set("users",$this->User->findAll(null,null,'created',null,null,null));
break;
default:
$this->set("users",$this->User->findAll());
}
}

function insertdddw(){
//$this->set('tipouser',Set::combine($listtipuser, "{n}.Tipouser.id","{n}.Tipouser.descripcion"));
$this->set('tipouser',$this->Tipouser->findAll());
}

/*
*Funcion: siempre que el usuario se encuentre correctamente logueado en el sistema
*/
function beforeFilter(){
$this->__validateLoginStatus();
}

/*
*Funcion: permite validar que los datos del usuario son correctos
*/
function login(){
if(empty($this->data)==false){
if(($user = $this->User->validateLogin($this->data['User'])) == true){
$this->Session->write('User',$user);
$this->Session->setFlash('Ingreso al Sistema Satisfactoriamente');
$this->redirect('index');
exit();
}else{

$this->Session->setFlash('Disculpe, su login o password son incorrectos');
//$this->redirect('login');
//exit();
}
}
}

/*
* Funcion: Permite realizar al borrado de la sesion en el sistema
*/
function logout(){
$this->Session->destroy('user');
$this->Session->setFlash('El usuario se desconecto Satisfactoriamente');
$this->redirect('login');
}

function __validateLoginStatus(){
if($this->action != 'login' && $this->action != 'logout'){
if($this->Session->check('User')==false){
$this->redirect('login');
$this->Session->SetFlash('La direccion que quiere ingresar requiere de logueo en el sistema');
}
}
}


/*
* Funcion: agregar nuevo usuario retorna al indice principal
*/
function add(){
if(!empty($this->data)){
/*Validamos que el usuario no exista ya en el sistema*/
if($this->User->findByUsername($this->data['User']['username'])){
$this->User->invalidate('username');
$this->Session->SetFlash('El Nombre de usuario ingresado ya existe');
}else{
/*validamos el correo electronico*/
if($this->User->findByEmail($this->data['User']['email'])){
$this->User->invalidate('email');
$this->Session->SetFlash('El E-Mail ya fue registrado para otro usuario');
}else{

/*encryptamos el password con md5*/
$this->data['User']['password']=md5($this->data['User']['password']);
if($this->User->save($this->data)){
$this->flash('Los datos Fueron Guardados Ok','/users/');
}
}
}
}
}

/*
*Funcion: permite ver los datos de los usuarios del sistema
*/
function verdatos($id = null){
if($id <> null){
$this->User->id=$id;
$this->set('users',$this->User->read());
}else{
exit();
}
}

/*
*Funtion: permite realizar la modificacion de un archivo determinado
*/
function editar($id=null){
$this->User->id = $id;
if(empty($this->data)){
$this->insertdddw();
$this->data = $this->User->read();
$tipo_user = $this->Tipouser->find("list", array("fields"=>array("Tipouser.id","Tipouser.descripcion")));
$this->set("tipousers",$tipo_user);
}else{
if($this->User->save($this->data)){
$this->flash('Los Datos Fueron Modificados Satisfactoriamente','/users/');
}
}
}
}

?>

La vista es la siguiente
Editar Datos del Usuario

echo $form->create('User',array('action'=>'editar'));
echo $form->input('username',array('label'=>'Usuario'));
echo $form->input('email',array('label'=>'E-Mail'));
echo $form->input('tipousers_id');

echo $form->end('Guardar Cambios');
echo $html->link('Volver Atras','/users/');

$options = array('url' => 'insertdddw','update' => 'username');
echo $ajax->observeField('tipouser',$options);

?>


Es importante agregar esto en el controlador
var $displayField = "tipousers";
Las tablas son estas

mysql> DESCRIBE users;
+--------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| username | varchar(30) | NO | | | |
| password | varchar(40) | NO | | | |
| email | varchar(40) | NO | | | |
| created | datetime | YES | | NULL | |
| tipousers_id | smallint(6) | YES | | NULL | |
+--------------+------------------+------+-----+---------+----------------+

+-------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| descripcion | varchar(50) | YES | | NULL | |
+-------------+-------------+------+-----+---------+----------------+

Esto es todo muy simple eh???

miércoles, 31 de diciembre de 2008

CAKE-COMPONENT-CONTROLLER

Controller

class FtpsController extends AppController{
var $name = 'Ftps';
var $component=array('Ftp');
/*
*Funcion utilizada para realizar la aplicacion principal de php...
*/
function index(){
}

function conectarFTP(){
if($this->data['Ftp']['usuario'] == null || strlen($this->data['Ftp']['usuario'])<=0 ){
$this->Session->SetFlash('Debe ingresar el usuario');
$this->redirect('/ftps/');
return;
}

if($this->data['Ftp']['host']==null || strlen($this->data['Ftp']['password'])<=0){
$this->Session->SetFlash('Debe ingresar el servidor');
$this->redirect('/ftps/');
return;
}
//$this->redirect('/users/');
}
}

?>
La vista

Conectar a Servidor FTP


echo $form->Create('Ftp',array('action'=>'conectarFTP'));
echo $form->input('usuario',array('type'=>'input','label'=>'Usuario'));
echo $form->input('password',array('type'=>'password','label'=>'Contraseña'));
echo $form->input('host',array('type'=>'input','label'=>'Servidor'));
echo $form->input('puerto',array('type'=>'input','label'=>'Puerto'));
echo $form->end('Conectar');
?>

Modelo

class Ftp extends AppModel{
var $name = 'Ftp';
var $useTable = false;
var $table=false;
var $validate = array('usuario'=>array(
'alphaNumeric'=>array('rule'=>'alphaNumeric','required'=>true,
'message'=>'Solo Letras y Numeros')));


}

?>

Component

define("ERROR_CONECT",-1);

class FtpComponent extends Object{
private $server = '';
private $puerto = '';
private $usuario ='';
private $password = '';
private $pasv = true;
private $idftp=null;
var $controller = true;
var $someVar = null;


/*
* Function: contruimos el objeto con los datos necesario para inicializar la conexion
*/
function __construct($get_server = null,
$get_puerto = null,
$get_usuario = null,
$get_password= null){
if($get_server == null) $get_server = 'localhost';
if($get_puerto == null) $get_puerto = 21;
if($get_usuario == null) $get_usuario = 'anonymous';
if($get_password == null) $get_password = 'anonymous';

$this->server = $get_server;
$this->puerto = $get_puerto;
$this->usuario= $get_usuario;
$this->password= $get_password;
}


/*
* Funcion: permite realizar la conexion al servidor de base de datos
*/
function ConectFtp(){
/*si el id se encuentra no debemo intentar conectar de nuevo*/
if( $this->idftp != null) return 0;
try{
$this->idftp = ftp_connect($this->server,$this->puerto);
}catch(Exception $ex){
echo "No se conecto al server";
}

if($this->idftp == null ) return ERROR_CONECT; /*No connect to host*/
$result = ftp_login($this->id_ftp,$this->usuario,$this->password);

if($result < 0 ) return -2; /*User or login is no valid*/
ftp_pasv($this->id_ftp,$this->pasv);
/*retornamos el identificador para el FTP*/
return $this->id_ftp;
}

/*
* Funcion: Permite traer una ruta desde el servidor FTP
*/
function putFile($archivo_local,$archivo_remoto){
$this->idftp = $this->ConectFtp();
if($this->idftp < 0 ) return $this->idftp; /*No existe conexion al servidor*/
ftp_put($this->idftp,$archivo_remoto,$archivo_local,FTP_BINARY);
}


/*
* Funcion: permite desconectarse del servidor FTP
*/
function destroyConect(){
if($this->idftp != null && $this->idftp > 0 ) ftp_quit($this->idftp);
$this->idftp = null;
}

/*
*Funcion: permite recuperar el directorio de trabajo del servidor FTP
*/
function getPathServer(){
if($this->idftp == null || $this->idftp < 0 ) return ERROR_CONECT; /*No conect*/
$pathserver=ftp_pwd($this->idftp);
return $pathserver;
}

/*
* Funcion: permite retornar un arreglo con los ficheros en el path server
*/
function getFilePath(){
$pathserver = getPathServer();
$files_path=ftp_nlist($this->idftp,$pathserver);
return $files_path;
}
}
?>

Esto es un componente para conectar al FTP