Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Alex

#321
Zona Webmaster / Re:[BootStrap] MiniTutorial Parte 2
Octubre 16, 2013, 02:57:15 PM
muy interesante no vi muchos tutos de twitter bootstrap, y siempre es útil para aquellos como yo que decimos "como odio diseñar" o necesitan un diseño rápido.

saludos!
#322
Dudas y pedidos generales / Re:Numero PI
Octubre 16, 2013, 01:40:57 PM
cito lo que me dijo un amigo,

CitarYo:
che despues
mirá esto
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
quizá vos sepas

amigo mio:
En el conjunto de los números naturales, todo número tiene su sucesivo, el que sigue del 2 es el 3, el que sigue de 6 es el 7, se consideran discretos, xq están limitados, en el conjunto de los números racionales esto no pasa, entre dos números hay infinitos números decimales, entre 2 y 3 puede estar 2,5 2,159 2,0000005 y así... No tiene limite, a estos números se les denomina densos, siendo que justamente no se puede determinar el siguiente de un número!!! Terrible!!!!!

yo:
en otras palabras ambos numeros son pi?
solo que uno es más detallado que otro?

amigo:
Los números racionales o fraccionarios son divisiones de dos números naturales, pero están los que tienen resto cero y los que no, que dan con coma y siempre se puede seguír dividiendo, ósea que sí hay dos pi distintos, significa que vienen de divisiones distintas... Aunque parecidas!
#323
Dudas y pedidos generales / Re:Numero PI
Octubre 16, 2013, 01:00:15 PM
puede ser antrax que dependiendo de hasta que numero se quería llegar el redondeo podría llegar a ser diferente y podría llegar a ser numeros distintos, de todos modos no me conforma ese pensamiento, de hecho no me parece que sea una correcta conclusión, no obstante puede ser que a lo largo del tiempo se haya cambiado la forma de hacer el calculo de manera que fue cada vez menos dificil de equivocarse, y el dígito que yo conozco es viejo y puede ser resultado de un error de cálculos.

no lo se, podrían ser mil cosas, pero lo que más me llama la atención es, como llegó ese número al modulo de ingreso de la facultad de ingeniería y no el más conocido.

saludos!
#324
Dudas y pedidos generales / [SOLUCIONADO] Numero PI
Octubre 16, 2013, 12:41:14 PM
hola, yo me se unos 32 dígitos del numero pi, pero el otro día buscando en internet me encontré con que estaba equivocado, según yo pi es

3.14159265301190260407226149477373 (y siguen otros numeros que no conozco)

no obstante en wikipedia dice:

3,14159265358979323846 (y siguen otros numeros que no mensionan)

si se fijan ni de casualidad son parecidos, salvo los primeros digitos, cuando vi eso pensé "bueno estube equivocado todo el tiempo" pero viendo el módulo de ingreso de la facultad de ciencias exactas para ingeniería en sistemas, me encontré con que ellos pusieron exactamente el mismo numero que yo tenía memorizado.

alguien sabe que es lo que está pasando?

saludos!
#325
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
Entiendo...

como deciamos no hace falta declararlas, aunque tampoco esta de mas, de cualquier forma hay que estar atento con private, protected y public. Me paso que muchas veces puse private y al usar la clase y a su vez funcion en otro archivo no aparecia nada, no funcionaba, obviamente porque estaba privada, y buen.. hasta que te das cuenta puede pasar 1 segundo como 10 minutos o inclusive mas... si te toca un mal dia xD.

Buena explicacion.

Saludos!

si al prin cipio se me complicaba más que nada entre private y protected luego fue bastante intuitivo si seguis la normativa te das cuenta en seguida las cosas que no deberías hacer xD
y si con un mal día te puede pasar cualquier cosa.

saludos!
#326
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
te hago una consulta aparte...

porque cuando creas una variable siempre le das valor null. En el caso de que no lo hagas y solamente lo cree, no va a tener ningun valor. Ademas de que las variables que usas son privadas, asi que no se va a poder utilizar en otro lado, de cualquier forma, las utilizas en la misma clase obviamente. Pero la pregunta es... les pones un valor nulo por algun motivo o porque te acostumbraste/te gusta asi?.

saludos

es un tema que arrastro desde estructurada, si no definis una variable y la usas para por ejemplo concatenar ($variable .= 'hola';) te tirará un warning informando que la variable no existe (ya que quieres accesar para leer un recurso inexistente), por lo que me acostumbré a definir toda variable que voy a usar, así no hay warnings y está todo aclarado para php, eso por un lado.

en segundo lugar, porque defino el tipo también, si pongo Null es porque en general puede ser un string o un objeto lo que valla a meter en dicha variable, si pongo = 0, es porque voy a poner solo numeros, y si le pongo array(); es porque voy a poner un arreglo :P

en éste caso en específico, son todas null porque estoy trabajando con una api, por lo que no especifico el tipo que la api me retorna.

en otros lenguajes es de suma importancia definir variables, por lo que se me hizo una costumbre definirlas y darles un valor inicial yo mismo.

por lo que en realidad darle un valor inicial no es necesario como mencionas.

y sobre que son todas private, eso depende de la ocación, pero yo no uso public desde hace un tiempo, me limito solo a usar private o protected, no uso public por los principios de encapsulamiento y ocultamiento de información. por lo demas generalmente pongo private salvo que esté trabajando con herencia donde, aquellas cosas que no quiero que puedan ser redeclaradas uso protected (eso en funciones) y en variable si son clases abstractas no tiene sentido pero si son clases comunes me evita incidentes de acceso (o así le llamo yo).

saludos!
#327
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
Saludos brother, gracias por tu respuesta, pero creo que uno como diseñador y programador tiene que tomar encuenta hasta el más minimo detalle, para el buen funcionamiento del producto, como dijiste, hoy en dia sigue habiendo personas que usan versiones antiguas de esos navegadores y uno tiene que incluir esos detalle en un proyecto.

es cierto que uno tiene que tomar en concideración ciertas cosas.

pero mi lema es simple, hacer algo tiene un costo y un beneficio, uno tiene que hacer solo las cosas que generan más beneficio que costo.

volviendo al tema, no puedes dar soporte para Internet Explorer 2.0 porque haya una persona que lo use, la idea es dar soporte a la normativa vigente, hoy en día para el diseño web la W3C establece las reglas, y cualquiera que quiera jugar el juego tiene que entender, que no se puede saltear las reglas, tanto Google Chrome, como Mozilla Software Fundation, y Microsoft saben muy bien que la W3C es la que pone las reglas, dice como son las cosas, microsoft en su momento no le hizo caso, y bueno las consecuencias son obvias, si no se quieren amoldar a los estándares no se puede hacer nada, ahora microsoft lo entendió y está trabajando para que sus nuevas versiones cumplan los estándares.

El punto es, que si una comunidad entera aceptó que un consorcio (la W3C) se pusiera de acuerdo entre los mayores referentes de la industria para hacer las cosas de una manera, no puede venir alguien y hacer las cosas a su manera dejando 3 mil incompatibilidades, y los desarrolladores no pueden estar trabajando para cumplir todo lo que se le ocurre a cualquiera, porque en ese caso si yo programara un motor de renderizado y decidiera que las etiquetas div no me gustan y las voy a llamar roberto, los desarrolladores no pueden estar creando etiquetas div y roberto, yo tengo que amoldarme a los estándares, y lo mismo va para microsoft.

El problema de incompatibilidad de Internet explorer, es bastante jodido porque hacen lo que quieren prácticamente, pensaron que ya tenían ganado el mercado de los navegadores web xD y que podían hacer lo que se les ocurriera.

a todo esto lo que quiero decir es que tienes que fijarte si vale la pena hacer las páginas compatibles para aquellos que usan internet explorer 6.-

en fin es desición tuya y no voy a insistir, sobre tu problema ya sabes que es, y no tengo idea si se puede solucionar xD

saludos!
#328
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
Saludos amigos, después de mucho tiempo regresando por un pequeño problemita, ando modificando un sitio web y me muestra el siguiente mensaje de error:

CitarEs posible que esta pagina web no funcione correctamente debido a errores.

Llamada inesperada a un método o a un acceso de propiedad
httpErrorPagesScripts.js                                          Línea: 264      Carácter: 5
Código: 0
URI: You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

quisiera saber si es problema del mal uso de JavaScript o de las Clases y funciones usadas con PHP?
esto solo sucede en Internet Explore 8 o inferior
gracias de ante mano.

uhm, usas internet explorer, ese es el problema.

internet explorer 8 no soporta lo que quieres hacer con javascript, no no puede ser por php (se ejecuta del lado del servidor, ni si quiera si el servidor estubiera "borracho" o se ubiese tomado una botella de wisky podría ser la causa php).

Como dije probablemente Internet Explorer 8 tenga un problema o no soporte lo que el javascript de esa página está tratando de hacer.

esas son una de las múltiples razones por las cuales internet explorer es una porquería.

Además fijate, los que usan chrome solo usan la última versión, no ves a nadie usando versiones mas viejas, y los que usan firefox usan versiones relativamente nuevas, es muy raro ver a una persona usar firefox 2.4 o firefox 4, sin embargo en internet explorer hay personas usando internet explorer 6 ._. es una desgracia, por eso yo no le doy soporte a IE.

saludos!
#329
Dudas y pedidos generales / Re:Disminuir el ping.
Octubre 10, 2013, 10:48:38 PM
-plaff, el ping como dijo TrollMine, es lo que tarda un paquete de datos en llegar a su destino, en otras palabras el tiempo que transcurre desde que se envía un dato hasta que llega donde debería, por ejemplo si tu envías un paquete dentro de tu propia red (haces ping a uno de tus dispositivos en la red) verás que el ping es mucho menor, de la misma forma que será mucho menor si haces ping a un servidor de tu país.

si tu estás en argentina y le haces ping a un servidor de estados unidos, dependiendo de tu proveedor podría llegar a variar, pero lo normal es 190 - 200 por ejemplo, igual también depende del tiempo que tarda el servidor en tomar la solicitud, si está saturado puede tardar más y al tardar más en hacer pong, tu ping aumentará.

en estados unidos la media es de 50 de ping.

pero tienes un error de concepto

ya tengas 14 megas, 3 megas, o 512kb si tu proveedor es el mismo y haces ping al mismo servidor desde mas o menos la misma distancia el ping con cualquiera de las tres velocidades de descarga será exactamente el mismo.

por ejemplo si le haces ping a google que te responderá desde los servidores en tu país tu ping puede ser de 50.

como dijo trollmine todo depende del estado del servidor, de los caminos por donde fueron los paquetes, y de la distancia que tubieron que recorrer.

Es MUY poco probable que sea por tener windows en mal estado.
Es MUY poco probable que sea por un virus.

Puede ser que tu proveedor de internet tenga una mala configuración, si, pero de todos modos un ping de 150 es normal, y no te debería dar casi ningún problema.

si estás jugando un juego y se te traba con un ping de 150 es muy raro que sea por el ping específicamente, puede ser por otros dos motivos.

Perdida de paquetes de datos:

Los caminos por los que pasan los datos suelen estar cortados momentaneamente o dar problemas, y pueden pasar los paquetes por algún dispositivo en el mundo que esté defectuoso, en ese caso es probable que tengas pérdida de paquetes de datos, (algunos paquetes nunca lleguen a destino) eso podría ocacionar problemas a la hora de estar jugando un juego online que tiene un consumo excesivo.

La segunda razón Mala respuesta del servidor:

el servidor o pc a la que le haces ping puede estar teniendo algún problema de saturamiento o cualquier otro y eso ocaciona que no responda ciertos paquetes, y haga un efecto muy parecido al de perdida de paquetes de datos.

Los dispositivos en la red podrían llegar a afectar en algún punto tu conexión, pero es muy poco probable, lo que podrían es saturar el enrutador o puerta de enlace de tu red, pero si tienes un buen dispositivo como los de la marca TPlink, es raro que suceda (salvo que tengas 78 equipos conectados al mismo wifi jajaja)

para finalizar respondiendo a tu duda, no hay forma de que tu puedas hacer mas de lo que haz hecho, salvo cambiar tu puerta de enlace si te aseguras de que está defectuoso el dispositivo, pero lo dudo, el resto de las opciones son causadas por dispositivos o cosas ajenas a tu alcance.

saludos!
#330
Back-end / Controlar pagos de PayPal con php, ClassIPN
Octubre 10, 2013, 11:49:33 AM
Hola, siguiendo con mi rutina de armar clases para manejar ciertas cosas y así no tener que escribirlas una y otra vez en cada sistema, hoy realizé una que controle pagos instantaneos de paypal, los IPN o instant payment notification de paypal, son notificaciones para cuando uno recibe un pago, imaginense que vendo productos chinos en mi página china, cuando alguien realiza un pago, paypal me envía la notificación de pago satisfactorio, y mi php automáticamente le dice al cliente que su pago fue realizado y todas esas boludeces, lo mismo pasa con hosting y etc.

Lo único que tienen que hacer para recibir esas notificaciones es ir a paypal, activar IPN y poner el link del php que controla las notificaciones.

Ese php se puede llamar por ejemplo IPN.php, las siguientes clases te pueden ayudar a controlar los IPN.

creamos un archivo php, que incluya mi property You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login, y la clase ClassIPNInterface.

ipn.php
Código: php

<?php
include('Property.php');
include('ClassIPNInterface.php');

// creamos el objeto, automáticamente la clase enviará una notificación a paypal de que recibimos la notificación y eso
$ipn = new ClassIPN();
// vemos si ubo un error al realizar el aviso a paypal
if($ipn->error == true)
{
    // mostramos el error
    echo $ipn->error_msg;
} else { // si no ocurrió ningún error

// aquí guardamos en la base de datos, y actualizamos la tabla que tenga los pagos y le damos la plata al cliente o le ponemos una notificación de que se realizó el pago.

// podemos usar las siguientes variables:

$ipn->item_name(); // nombre del producto
$ipn->payment_status(); // el estado del pago cuando se realizó esta notificacion
$ipn->payment_amount(); // el dinero que pagó por el producto
$ipn->transaction_id(); // el numero de transacción único, recomiendo que revisen en la db antes de hacer nada si ya había un pago con este numero de transacción para no tener duplicados.
$ipn->client_email(); // el email de la persona que pagó

}


para que esto funcione crean un archivo Property.php con el código del link que dejé más arriba, y dos archivos más:

ClassIPNInterface.php
Código: php
<?php 

interface IIPN
{

public function __construct();

public function get_item_name();
public function set_item_name($value);

public function get_payment_status();
public function set_payment_status($value);

public function get_payment_amount();
public function set_payment_amount($value);

public function get_payment_currency();
public function set_payment_currency($value);

public function get_transaction_id();
public function set_transaction_id($value);

public function get_receiver_email();
public function set_receiver_email($value);

public function get_client_email();
public function set_client_email($value);

}

include('ClassIPN.php');


y ClassIPN.php:

Código: php
<?php 

class IPN implements IIPN
{
// usamos mi trait Property
use Property;

// atributos privados
private $notify_validate_request_content = null;
private $notify_validate_request_header = null;

// variables.
private $item_name = null; // nombre del producto
private $payment_status = null; // estado del pago
private $payment_amount = null; // precio pagado
private $payment_currency = null; // ?
private $transaction_id = null; // id de transacción de paypal
private $receiver_email = null; // nuestro mail
private $client_email = null; // mail del que compró

private $error = false;
private $error_msg = null;


public function __construct()
{
$this->vars_extract();
$this->notify_validate_request_content = $this->request_content_generate();
$this->notify_validate_request_header = $this->request_header_generate();
$this->notify_validate_request();
}

private function request_content_generate()
{
$req = 'cmd=_notify-validate';
foreach ($_POST as $key => $value) {
$value = urlencode(stripslashes($value));
$req .= "&$key=$value";
}
return $req;
}

private function request_header_generate()
{
$header = null;
$header .= "POST /cgi-bin/webscr HTTP/1.0\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($this->notify_validate_request_content) . "\r\n\r\n";
return $header;
}

private function notify_validate_request()
{
try
{
$fp = fsockopen ('www.paypal.com', 80, $errno, $errstr, 30);
if(!$fp) throw new exception('No es posible conectar con www.paypal.com');
fputs ($fp, $this->notify_validate_request_header . $this->notify_validate_request_content);
while (!feof($fp))
{
$res = fgets ($fp, 1024);
if (strcmp ($res, "VERIFIED") == 0)
{
return true;
}
else
{
throw new exception('Ocurrió un error con la transaccion');
}
}
} catch(Exception $e)
{
$this->error = true;
$this->error_msg = $e->getMessage();
return false;
}
}

private function vars_extract()
{
$this->item_name = $_REQUEST['item_name'];
$this->payment_status = $_REQUEST['payment_status'];
$this->payment_amount = $_REQUEST['mc_gross'];
$this->payment_currency = $_REQUEST['mc_currency'];
$this->transaction_id = $_REQUEST['txn_id'];
$this->receiver_email =  $_REQUEST['receiver_email'];
$this->client_email = $_REQUEST['payer_email'];
}

public function get_item_name() { return $this->item_name; }
public function set_item_name($value) { ; }

public function get_payment_status() { return $this->payment_status; }
public function set_payment_status($value) { ; }

public function get_payment_amount() { return $this->payment_amount; }
public function set_payment_amount($value) { ; }

public function get_payment_currency() { return $this->payment_currency; }
public function set_payment_currency($value) { ; }

public function get_transaction_id() { return $this->transaction_id; }
public function set_transaction_id($value) { ; }

public function get_receiver_email() { return $this->receiver_email; }
public function set_receiver_email($value) { ; }

public function get_client_email() { return $this->client_email; }
public function set_client_email($value) { ; }
}


bueno eso es todo! saludos!
#331
Back-end / Re:FileClass (subir y descargar archivos)
Octubre 10, 2013, 01:00:53 AM
FileClassInterface.php

Código: php
<?php 

// se requiere Trait Property

Interface IFileClass
{

/*
* @ $location = carpeta donde se guarda el archivo
* @ $name = nombre del archivo con extensión incluida
*/
public function __construct($location = null, $name = null);

/*
* @ $name = nombre que verá el usuario cuando se le descargue el archivo
*/
public function download_file($name);

/*
* @ $nombre_campo = nombre del campo file del formulario para cargar archivo
* @ $carpeta = carpeta donde se subirá el archivo
* @ $uniqid = agregar o no un id único para que no se repitan los archivos
* @ $namecrypt = encriptar nombre del archivo para imposibilitar descarga (se encrypta en md5)
* @ $extension_valida = arreglo con extensiones válidas
* @ $file_type = MIME/TYPE del archivo
* @ $kbmax = Máximos kb que se permiten en la subida (dejar en 0 si no se quiere poner limite)
* @ $dir = cuando se devuelva la ruta del archivo devolverla con la carpeta o sin la carpeta de su ubicación (osea solo el nombre o toda la ruta completa)
* ésta función devuelve falso si ubo algún error, o la dirección o nombre del archivo (según lo especificado) de lo que se subió.
*/
public function upload_file($nombre_campo, $carpeta, $uniqid = false, $namecrypt = false, $extension_valida = array('rar'), $file_type = null, $kbmax = 0, $dir = true);

// devuelve si un nombre de archivo tiene o no una extensión X.
public function validate_extension($filename, $extension);

public function get_name();
public function set_name($value);

public function get_peso();
public function set_peso($value);

public function get_type();
public function set_type($value);

public function get_location();
public function set_location($value);

public function get_error();
public function set_error($value);

public function get_error_msg();
public function set_error_msg($value);

}

include('FileClass.php');


FileClass.php

Código: php
<?php

Class FileClass implements IFileClass
{
use Property;

protected $kb = 1024;
protected $mb = 1024;
protected $gb = 1024;
private $name = null;
private $peso = null;
private $type = null;
private $location = null;

private $error = false;
private $error_msg = null;

public function __construct($location = null, $name = null)
{
try
{
if(!empty($location))
{
if(empty($name)) throw new exception('El nombre del fichero es requerido');
if(!file_exists($location.$name)) throw new exception('El fichero no existe');
$this->name = $name;
$this->location = $location;
$this->peso = filesize($location.$name);
}
} catch(Exception $e)
{
$this->error = true;
$this->error_msg = $e->getMessage();
}
}

public function download_file($name)
{
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"{$name}\"\n");
$fp=fopen($this->location.$this->name, "r");
fpassthru($fp);
die();
}

public function upload_file($nombre_campo, $carpeta, $uniqid = false, $namecrypt = false, $extension_valida = array('rar'), $file_type = null, $kbmax = 0, $dir = true)
{
try
{
$this->name = $_FILES[$nombre_campo]['name'];
$this->size = $_FILES[$nombre_campo]['size'];
$this->type = $_FILES[$nombre_campo]['type'];
$this->location = $carpeta;
if(empty($_FILES[$nombre_campo])) throw new exception('Archivo no seleccionado');
$id = null;
if($uniqid) $id = uniqid(microtime());
$this->name = $id.$this->name;
// verificamos si la extensión es válida
$valido = false;
for($i = 0; $i<count($extension_valida); $i++)
if($this->validate_extension($this->name, $extension_valida[$i]))
$valido = true;
if(!$valido) throw new exception('El archivo es de una extensión inválida');
// verificamos si el tipo de archivo es valido
if(!empty($file_type) && $this->type!=$file_type) throw new exception('El tipo de archivo es inválido');
// verificamos si tiene el tamaño correcto
if($kbmax>0 && $this->size > $kbmax*$this->kb) throw new exception('El archivo pesa demaciado');
// lo encryptamos si es preciso
if($namecrypt)
$this->name = 'file_'.md5($this->name).'.cab';
// verificamos que el directorio tenga los permisos
//------------ TODO
// ahora lo vamos a mover
if (!move_uploaded_file($_FILES[$nombre_campo]['tmp_name'], $this->location.$this->name)) throw new exception('No se puede mover fichero subido a carpeta especificada');
// retornamos el directorio donde se guardó
if($dir)
return $this->location.$this->name;
else
return $this->name;
} catch (Exception $e)
{
$this->error = true;
$this->error_msg = $e->getMessage();
return false;
}
}

public Function validate_extension($filename, $extension)
{
$ext_init = strlen($filename) - strlen($extension);
$last_ext = null;
for($i=$ext_init; $i<strlen($filename); $i++)
$last_ext.=$filename[$i];
if($last_ext == $extension)
return true;
else
return false;
}

public function get_name() { return $this->name; }
public function set_name($value) { $this->name = $value; }

public function get_peso() { return $this->peso; }
public function set_peso($value) { ; }

public function get_type() { return $this->type; }
public function set_type($value) { ; }

public function get_location() { return $this->location; }
public function set_location($value) { $this->location = $value; }

public function get_error() { return $this->error; }
public function set_error($value) { ; }

public function get_error_msg() { return $this->error_msg; }
public function set_error_msg($value) { ; }

}
#332
Back-end / FileClass (subir y descargar archivos)
Octubre 10, 2013, 01:00:09 AM
Como no es ninguna novedad, y los que siguen mis aportes en esta comunidad tan querida de underc0de saben, estoy centrando todo mi esfuerzo, mientras programo You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login en lograr una serie de "componentes" reusables, y que cumplan con dicho criterio, para lo cual estoy programando de manera que cada componente y parte de mi sistema pueda ser separado, y lo pueda usar en otro código fácilmente, de ésta forma me ahorro todo lo que más pueda escribir código, y así no tengo que escribir una y otra vez el mismo código, ya tengo la lista de clases a mi medida para poder usarlas. (supongo que también sabrán que soy muy reticente a la hora de usar código ageno y que para usar algún código si no es de la documentación oficial de php y que de todos modos reviso varias veces antes de incorporarlo, en códigos de otros autores lo paso por varios criterios de calidad antes de tomarlo como ejemplo para crear mi propio código, pasa que como siempre digo, prefiero hacer las cosas yo y conocer los defectos que tienen perfectamente a usar cosas de otros sin conocer dichos defectos, por eso hasta creé mi propio framework xD)
en fin, traigo una clase para manejar archivos, tiene dos modalidades de uso, para subir un archivo al server, y para obligar a descargar un archivo del server (lo que nos permite descargar archivos como .jpg o lo que fuese)...

para descargar archivos tienen que instanciar la clase pasando como parametros al constructor, la ubicacion del archivo que manejará el objeto, y el nombre del mismo, luego llamar a la función download_file pasando como parametro el nombre que verá la persona que esté descargando el archivo (obviamente con extension incluido)

y la segunda manera para subir archivos es crear el objeto sin pasar parámetros al constructor y llamara a la función upload_file (en la interface explica los parámetros).

como siempre solo incluyen la interfaz y ésta incluirá la clase por si sola, además requiere de mi Trait Property que lo pueden descargar de You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

bueno como me extendí demaciado el código php no entrará en la publicación sin que SMF me lo corte, asique dejo en una respuesta el código del archivo interface y el archivo de la clase principal.

Un Saludo! :)
#333
Ejemplo de uso:

Código: php


// INCLUIMOS LOS ARCHIVOS NECESARIOS
include('Property.php');
include('ClassMailerInterface.php');

$emisor = '[email protected]'; // mi mail
$emisor_alias = 'Roberto Gomez';

$receptor = '[email protected]'; // el mail de la persona que recibirá el mail xD
$receptor_alias = 'José perez';

$asunto = 'Hola josé';
$mensaje = 'Hola josé, como andas? todo bien? saludos!';

// creamos un nuevo mail
$mail = new ClassMailer($emisor, $receptor, $asunto, $mensaje, $emisor_alias, $receptor_alias);
// si no hay error
if(!$mail->error)
{
    $mail->send(); // enviamos el mail
}
else // si hay error
{
    echo $mail->error_message; // mostramos el error
}


La clase tiene control de mails, control de asuntos, convierte a UTF8 los mensajes y crea las cabeceras, en otras palabras solo hay que poner eso, y admite HTML.

hacen eso y ya está envia el mail a You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login, los Alias no son necesarios se pueden quitar y no va a haber problema.

saludos!
#334
Hola, siguiendo mi proyecto de tener una serie de modulos que incluya y pueda usar en cualquier proyecto para no tener que estar escribiendo código una y otra vez, y en base a que hace poco un usuario del foro se le complicaba enviar emails, realizé esta siemple pero efectiva clase que envía emails creando las cabeceras y todas esas cosas que no deberíamos tener por que escribirlas.

consta de dos archivos y requiere mi Property Trait (pueden verlo You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login)

El primer archivo es el archivo "ClassMailerInterface.php" (que debe estar junto al otro)

Código: php
<?php

interface IClassMailer
{

// devuelve verdadero si $email es válido, o falso si $email no es válido
public function validar_email($email);

// enviar email preconfigurado
public function send();
// retorna verdadero o falso dependiendo de si se envió el email

// setters and getters
public function get_receptor();
public function set_receptor($value);

public function get_receptor_alias();
public function set_receptor_alias($value);

public function get_emisor();
public function set_emisor($value);

public function get_emisor_alias();
public function set_emisor_alias($value);

public function get_asunto();
public function set_asunto($value);

public function get_charset();
public function set_charset($value);

public function get_content_type();
public function set_content_type($value);

public function get_mime_version();
public function set_mime_version($value);

public function get_mensaje();
public function set_mensaje($value);

public function get_error();
public function set_error($value);

public function get_error_message();
public function set_error_message($value);

}

include('ClassMailer.php');


ese archivo de ahí arriba deben incluir para poder usar el sistema de emails, pero recuerden que primero hay que incluir el archivo que tenga el property que puse más arriba.

El segundo archivo es el ClassMailer.php
Código: php

<?php

Class ClassMailer implements IClassMailer
{
// uses
use Property;

// atributes
private $receptor = null;
private $receptor_alias = null;
private $emisor = null;
private $emisor_alias = null;
private $asunto = null;
private $charset = 'UTF-8';
private $content_type = 'text/html';
protected $mime_version = '1.0';
private $mensaje = null;

protected $error = false;
protected $error_message = null;

public function __construct($emisor, $receptor, $asunto, $mensaje, $emisor_alias = null, $receptor_alias = null)
{
try
{
if(!$this->validar_email($emisor)) Throw new exception('Invalid mail $emisor');
if(!$this->validar_email($receptor)) Throw new exception('Invalid mail $receptor');
$asunto = trim($asunto);
if(empty($asunto) && strlen($asunto)<3) throw new exception('Invalid subject $asunto');
$mensaje = trim(utf8_encode($mensaje));
if(empty($mensaje) && strlen($mensaje)<10) throw new exception('Invalid menssage $mensaje');
$this->receptor = $receptor;
$this->emisor = $emisor;
$this->asunto = $asunto;
$this->mensaje = $mensaje;
if(!empty($emisor_alias))
{
$emisor_alias = trim($emisor_alias);
if(strlen($emisor_alias)>3)
$this->emisor_alias = $emisor_alias;
else
throw new exception('Emisor Alias is invalid');
}
if(!empty($receptor_alias))
{
$emisor_alias = trim($receptor_alias);
if(strlen($receptor_alias)>3)
$this->receptor_alias = $receptor_alias;
else
throw new exception('Receptor Alias is invalid');
}
} catch (Exception $e) { $this->error = true; $this->error_message = $e->getMessage(); }
}

public function validar_email($email)
{
return preg_match('/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i',$email);
}

public function send()
{
if(!$this->error)
{
mail($this->receptor, $this->asunto, $this->mensaje, $this->fabricar_cabeceras());
} else { return false; }
}

private function fabricar_cabeceras()
{
$cabeceras = null;
$cabeceras  = 'MIME-Version: ' . $this->mime_version . "\r\n";
$cabeceras .= 'Content-type: ' . $this->content_type . '; charset=' . $this->charset . "\r\n";
if(!empty($this->receptor_alias))
{
$cabeceras .= 'To: ' . $this->receptor_alias . ' <' . $this->receptor . '>' . "\r\n";
} else {
$cabeceras .= 'To: ' . $this->receptor . "\r\n";
}
if(!empty($this->emisor_alias))
{
$cabeceras .= 'From: ' . $this->emisor_alias . ' <' . $this->emisor . '>' . "\r\n";
} else {
$cabeceras .= 'From: ' . $this->emisor . "\r\n";
}
return $cabeceras;
}

public function get_receptor() { return $this->receptor; }
public function set_receptor($value)
{
try
{
$receptor = $value;
if(!$this->validar_email($receptor)) Throw new exception('Invalid mail $receptor');
$this->receptor = $receptor;
} catch (Exception $e) { $this->error = true; $this->error_message = $e->getMessage(); }
}

public function get_receptor_alias() { return $this->receptor_alias;}
public function set_receptor_alias($value)
{
try
{
$receptor_alias = $value;
$receptor_alias = trim($receptor_alias);
if(!strlen($receptor_alias)>3) throw new exception('Receptor Alias is invalid');
$this->receptor_alias = $receptor_alias;
} catch (Exception $e) { $this->error = true; $this->error_message = $e->getMessage(); }
}

public function get_emisor() { return $this->emisor; }
public function set_emisor($value)
{
try
{
$emisor = $value;
if(!$this->validar_email($emisor)) Throw new exception('Invalid mail $emisor');
$this->emisor = $emisor;
} catch (Exception $e) { $this->error = true; $this->error_message = $e->getMessage(); }
}

public function get_emisor_alias() { return $this->emisor_alias; }
public function set_emisor_alias($value)
{
try
{
$emisor_alias = $value;
$emisor_alias = trim($emisor_alias);
if(!strlen($emisor_alias)>3) throw new exception('Emisor Alias is invalid');
$this->emisor_alias = $emisor_alias;
} catch (Exception $e) { $this->error = true; $this->error_message = $e->getMessage(); }
}

public function get_asunto() { return $this->asunto; }
public function set_asunto($value)
{
try
{
$asunto = value;
$asunto = trim($asunto);
if(empty($asunto) && strlen($asunto)<3) throw new exception('Invalid subject $asunto');
} catch (Exception $e) { $this->error = true; $this->error_message = $e->getMessage(); }
}

public function get_charset() { return $this->charset; }
public function set_charset($value)
{
$this->charset = $value;
}

public function get_content_type() { return $this->content_type; }
public function set_content_type($value)
{
$this->content_type = $value;
}

public function get_mime_version() { return $this->mime_version; }
public function set_mime_version($value) { ; } // no podemos cambiar el mime_version

public function get_mensaje() { return $this->mensaje; }
public function set_mensaje($value)
{
try
{
$mensaje = $value;
$mensaje = trim(utf8_encode($mensaje));
if(empty($mensaje) && strlen($mensaje)<10) throw new exception('Invalid menssage $mensaje');
$this->mensaje = $mensaje;
} catch (Exception $e) { $this->error = true; $this->error_message = $e->getMessage(); }
}

public function get_error() { return $this->error; }
public function set_error($value) { ; } // no permitimos setear un error

public function get_error_message() { return $this->error_message; }
public function set_error_message($value) { ; } // no permitimos setear un mensaje de error

}


bueno, en una respuesta en este mismo post mostraré un ejemplo de su uso :) porque tanto código en mi post no entra y queda cortado.

saludos para todos!
#335
Hola, vi la función trigger y me interesé, por lo que hice una sencilla clase que permite disparar errores.

requiere de mi trait Property. (You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login), abajo de todo el código hay un ejemplo sencillo de su funcionamiento

Código: php
<?php

include('Property.php');

// esta clase requiere Property!

// Interface

interface IErrorClass
{

    // arrojar error
    public function error_dispatch();
   
    // setters y getters
    public function get_message();
    public function set_message($value);
    public function get_error_level();
    public function set_error_level($value);
   

}

class ErrorClass implements IErrorClass
{
    use Property;

    private $message = null;
    private $errors = array( NULL, 1024, 512, 256 );
    private $error_level = 1;
   
    public function __construct($message = null, $error_level = 1)
    {
        $this->error_level_control($error_level);
        $this->message_control($message);
        $this->message = $message;
        $this->error_level = $error_level;
    }
   
    private function error_level_control($lvl)
    {
        if(!isset($this->errors[$lvl]))
        {
          $this->error_level = 3;
          $this->message = 'Invalid error type specified';
          $this->error_dispatch();
        }
        return true;
    }
   
    private function message_control(&$message)
    {
        $message = htmlentities($message);
        $message = utf8_encode($message);
        return true;
    }
   
    public function error_dispatch()
    {
        trigger_error($this->message, $this->errors[$this->error_level]);
    }
   
    public function get_message()
    {
        return $this->message;
    }
   
    public function set_message($value)
    {
        $this->message_control($value);
        $this->message = $value;
    }
   
    public function get_error_level()
    {
        return $this->error_level;
    }
   
    public function set_error_level($value)
    {
        $this->error_level_control($value);
        $this->error_level = $value;
    }

}

// ejemplo de uso

$error = new ErrorClass();

$error->error_level = 1; // solo se pueden asignar valores de 1 a 3, cuanto mayor es el numero el error va a ser de mayor tipo (E_NOTICE = 1, E_WARNING = 2, E_FATAL = 3)
// si se asigna un valor no permitido tirará FATAL ERROR

$error->message = 'Probando errores';

$error->error_dispatch();


saludos!
#336
Back-end / Trait Singleton en php
Octubre 09, 2013, 02:57:38 PM
Siguiendo con mi idea de armarme pequeños modulos que realizen el trabajo importante y así yo solo los incluyo a la hora de crear un proyecto y no me tengo que gastar en escribir el mismo codigo miles de veces, les traigo singleton para que lo puedan implementar en sus clases.

La idea la saqué de una publicación de Xtempp en respuesta a mi post de Property, pero la mejoré un poquito.

¿qué es singleton?
Normalmente nosotros al usar objetos y clases, creamos varios objetos de la misma clase, de hecho yo he tenido arreglos llenos de objetos de x clase representando registros de una tabla, por ejemplo.
Si bien esto es normal usarlo de esta manera en cualquier lenguaje, (en c++ con listados por ejemplo), y es el uso original de las clases, permitirle definir estructuras y luego completar sus atributos con valores creando diferentes objetos (previamente instanciando dicha clase a la que le llamamos estructura)
No obstante se puede dar el caso de que nosotros únicamente queramos crear un objeto y manejar siempre el mismo objeto, creamos una clase para que solo tenga un objeto porque por algún motivo no nos interesa tener más de un objeto de dicha clase (lo que sucede en raros casos), no obstante, aquí es donde entra Singleton, que permite obtener la instancia de una clase que se guarda en la misma clase, de ese modo, cada vez que querramos usar la instancia de la clase (la única instancia) podemos obtener su instancia desde una función estática.

Dejando todas las explicaciones de lado, les dejo mi trait, que de la forma que está programado puede usarse en cualquier clase solo poniendo use Singleton;

Código: php
<?php

trait Singleton
{

    static private $instancia = null;
   
    static public function GetInstancia()
    {
        if(!(self::$instancia instanceof __CLASS__))
        {
            self::$instancia = new __CLASS__;
        }
        return self::$instancia;
    }
   
    public function __clone()
    {
        trigger_error('No es posible realizar la clonación', E_USER_ERROR);
    }

}


lo único que tienen que hacer en su clase para que acepte Singleton es poner

Código: php
class miclase
{
use Singleton;

    ... resto del código

}


y si además quicieran usar mi property por ejemplo podrían poner así:

Código: php
class miclase
{
use Singleton, Property;

    ... resto del código

}


saludos!
#337
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
Mira te explico bien, el tema es que deberias aprender MySQL y un poco mas de PHP

pero mira es asi...

Tomas el ID mediante GET desde la URL asi:
Código: text
$idnoticia = (int) $_GET['id'];


la url de noticias seria algo asi: elarchivo.php?id=1



para mostrar la noticia correspondiente tenes que hacer una consulta a mysql de la siguiente forma...
Código: text
	$query = 'SELECT id, mes, dia, categoria, titulo from noticias WHERE id=$id';


Bien hasta ahi?.

Bien ahora te digo tu error... lo tienes en el archivo noticias.php

en este codigo:
Código: text
while($row = mysql_fetch_array($result))
{
echo $contenido;
}   


esta totalmente erroneo la variable de $contenido, primero que no existe y segundo que no se muestra asi los datos.

Lo que tenes q poner es:
Código: text
while($row = mysql_fetch_array($result))
{
echo $row['titulo_noticia'];
                       echo $row['contenido_noticia'];
}


Y es que mas que eso no se puede explicar, porque ya con lo que te explique tiene que funcionar.

sobre la primera parte, es lo que puse hace dos comentarios, y sobre tu noticias.php arreglado creo que también está mal, o explicamente entonces, para que recorres el arreglo que tira el fetch_array si se trata de un solo registro que corresponde a ese id? (suponiendo que al menos el campo id de la tabla noticias está como clave primaria).

en todo caso hasta puedes quitar el while y dejarlo así:

Código: php

$row = mysql_fetch_array($result)
echo $row['titulo_noticia'];
echo $row['contenido_noticia'];


no reparé en el archivo noticias.php porque su pregunta no era esa, supuse que lo tendría bien asique ni lo miré.

saludos!
#338
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
Lo que quiero hacer es que cuando de click en el titulo me muestre la noticia completa bro en una pagina nueva

Cuando doy clic en el titulo de la noticia se haber noticias.php y en ella se imprime la noticia el titulo y el id

y bueno ahí puse como hacerlo, que es lo que no entiendes?

saludos!
#339
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
Lo quise mandar a noticias.php pero me arrojo otro error , asi es como estan los codigos bro

index.php

Código: text
<?php 
    include ('start_connection.php');
    $query = 'SELECT id, mes, dia, categoria, titulo from noticias';
    $result = mysql_query($query);
    while($row = mysql_fetch_array($result))
    {
  echo '<article class="slide">
        <time datetime="2013-02-04">'.$row['mes'].'<span>'.$row['dia'].'</span></time>
  <div class="holder">
  <h2 class="text-green">'.$row['categoria'].'</h2>
  <p><a class="ejemplo_4" href="noticias.php?id='.$row['id'].'">'.$row['titulo'].'</a></p>
</div>
  </article>';
    }   
    include ('close_connection.php');
?>


noticias.php

Código: text
<?php 
 
include ('start_connection.php');
$id = (int)$_GET['id'];
$query = 'SELECT id, mes, dia, categoria, titulo from noticias WHERE id=$id';
$result = mysql_query($query);
while($row = mysql_fetch_array($result))
{
echo $contenido;
}   
include ('close_connection.php');
 
?>


como que a noticias? el código que yo puse es el mismo que tienes en el index.php, por que lo pusiste en noticias.php? si el de noticias.php está razonable?

ahora viendo ambos codigos me replanteo que es lo que quieres hacer?

por lo que dice  tu primer mensaje aparentemente quieres hacer que al apretar en el titulo de la noticia te muestre la noticia entera, es eso?

por favor expresate mejor.

saludos!
#340
Hola, la idea era armar una superclase, para no encontrarme con la necesidad de tener que volver a escribir en cada script que haga, el manejo y control de usuarios, para lo cual realizé una abstracción de usuarios, quitando toda dependencia hacia el manejador de base de datos (por eso no lo incluyo), así se puede modificar sin afectar al código de la clase.

Creé dos clases abstractas y las doté de interfaces.

dejo el link de descarga a continuación:

You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

La idea es que me sugieran mejoras...

Éste trabajo surje con la necesidad de realizar componentes y reutilizar el código de manera efectiva (sin tener que estar haciendole modificaciones para que funcione en los diferentes sistemas).

Cuenta con un archivo que explica la idea para implementar ambas clases.

saludos!