Supongamos que se debe tener 'datos conocidos' de una tabla, algo así como en una tabla llamada 'sexo' y los campos son 'Masculino' y 'Femenino', pero todavía no tenemos la tabla. Se puede implementar 'mientras tanto' un campo de tipo enum[1] con esos datos.
Ahora, supongamos que tenemos dos o mas tablas y queremos traer datos de ellas para luego mostrarlos en una lista desplegable, entonces podemos hacer lo siguiente:
En el controlador se define una función llamada addEnums que toma como parámetros el nombre del campo de la tabla y el modelo que se va a usar:
public function addEnums($name, $modelo){
$this->loadModel($modelo);
$type = $this->$modelo->getColumnType($name);
preg_match_all("/'(.*?)'/", $type, $enums);
foreach ($enums[1] as $n){
$data[$n]=$n;
}
$this->set($name, $data);
}
Luego, en el mismo controlador, se llama de la siguiente forma (tengo dos tablas, Users y Players. Users tiene un campo que se llama 'sex' y Player un campo que se llama 'position'):
$this->addEnums('sex','User');
$this->addEnums('position', 'Player');
Y luego, en la vista, se muestran de la siguiente forma:
echo $this->Form->input('sex', array('options'=>$sex));
echo $this->Form->input('position', array('options'=>$position));
Y listo!
[1] http://dev.mysql.com/doc/refman/5.0/en/enum.html
Sitio para difundir y compartir nuestras experiencias en linux, tecnología, ciencia y en general.
Buscar aquí
Mostrando entradas con la etiqueta PHP. Mostrar todas las entradas
Mostrando entradas con la etiqueta PHP. Mostrar todas las entradas
martes, 11 de noviembre de 2014
Imprimir datos de tipo enum en una lista desplegable en cakephp
viernes, 31 de octubre de 2014
Agregar tipos de archivo a Bluefish
Uno de los editores por defecto que tiene ubuntu es bluefish. Cuenta con resaltado de sintaxis y reconoce muchos lenguajes, pero no los tiene todos, por ejemplo la extensión ctp, que es la que usa CakePHP[1] para mostrar las vistas. Entonces, éste tipo de archivo se ve en blanco y negro. Horrible.
Otra de las cosas que tiene bluefish es que no se puede añadir otro tipo de archivo desde la interfaz gráfica, por lo que aquí está una solución a ese problema.
Lo hacemos con ctp, que es igual a php, pero para cake.
Se copia el archivo donde se especifica cómo se comportará el editor para un lenguaje (php) con el nombre que queremos que aparezca (ctp)
sudo cp /usr/share/bluefish/bflang/php.bflang2 /usr/share/bluefish/bflang/ctp.bflang2
Luego se edita ese archivo
sudo gedit /usr/share/bluefish/bflang/ctp.bflang2
Y reemplazamos con coincidencias de capitalización las palabras PHP por CTP y php por ctp
Y listo!
Al iniciar bluefish coloreará nuestro ctp
[1]http://cakephp.org/
Otra de las cosas que tiene bluefish es que no se puede añadir otro tipo de archivo desde la interfaz gráfica, por lo que aquí está una solución a ese problema.
Lo hacemos con ctp, que es igual a php, pero para cake.
Se copia el archivo donde se especifica cómo se comportará el editor para un lenguaje (php) con el nombre que queremos que aparezca (ctp)
sudo cp /usr/share/bluefish/bflang/php.bflang2 /usr/share/bluefish/bflang/ctp.bflang2
Luego se edita ese archivo
sudo gedit /usr/share/bluefish/bflang/ctp.bflang2
Y reemplazamos con coincidencias de capitalización las palabras PHP por CTP y php por ctp
Y listo!
Al iniciar bluefish coloreará nuestro ctp
[1]http://cakephp.org/
miércoles, 19 de septiembre de 2012
Encriptar y desencriptar entre java y php con AES
Para pode recuperar una contraseña haciendo cifrado simétrico entre java y php, encontré esta solución, pero se me perdió la fuente, tan pronto la sepa la pongo....
Java encriptación:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package cifrado;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
/**
*
* @author thaednevol
*/
public class Crypto {
//iv length should be 16 bytes
private String iv = "fedcba9876543210";
private String key = null;
private Cipher cipher = null;
private SecretKeySpec keySpec = null;
private IvParameterSpec ivSpec = null;
/**
* Constructor
*
* @throws Exception
*/
public Crypto(String key) throws Exception {
this.key = key;
// Make sure the key length should be 16
int len = this.key.length();
if(len < 16) {
int addSpaces = 16 - len;
for (int i = 0; i < addSpaces; i++) {
this.key = this.key + " ";
}
} else {
this.key = this.key.substring(0, 16);
}
this.keySpec = new SecretKeySpec(this.key.getBytes(), "AES");
this.ivSpec = new IvParameterSpec(iv.getBytes());
this.cipher = Cipher.getInstance("AES/CBC/NoPadding");
}
/**
* Bytes to Hexa conversion
*
* @param data
* @return
*/
public String bytesToHex(byte[] data) {
if (data == null) {
return null;
} else {
int len = data.length;
String str = "";
for (int i = 0; i < len; i++) {
if ((data[i] & 0xFF) < 16)
str = str + "0" + java.lang.Integer.toHexString(data[i] & 0xFF);
else
str = str + java.lang.Integer.toHexString(data[i] & 0xFF);
}
return str;
}
}
/** Encrpt the goven string
*
* @param plainData
* @throws Exception
*/
public String encrypt(String plainData) throws Exception {
// Make sure the plainData length should be multiple with 16
int len = plainData.length();
int q = len / 16;
int addSpaces = ((q + 1) * 16) - len;
for (int i = 0; i < addSpaces; i++) {
plainData = plainData + " ";
}
this.cipher.init(Cipher.ENCRYPT_MODE, this.keySpec, this.ivSpec);
byte[] encrypted = cipher.doFinal(plainData.getBytes());
return bytesToHex(encrypted);
}
public static void main(String[] args) throws Exception {
Crypto c = new Crypto("D4:6E:AC:3F:F0:BE");
String encrStr = c.encrypt("Hello World");
System.out.println("Encrypted Str :" + encrStr);
}
}
Java desencriptación
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package cifrado;
/**
*
* @author thaednevol
*/
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
public class Decrypto {
//iv length should be 16 bytes
private String iv = "fedcba9876543210";
private String key = null;
private Cipher cipher = null;
private SecretKeySpec keySpec = null;
private IvParameterSpec ivSpec = null;
/**
* Constructor
*
* @throws Exception
*/
public Decrypto(String key) throws Exception {
this.key = key;
// Make sure the key length should be 16
int len = this.key.length();
if(len < 16) {
int addSpaces = 16 - len;
for (int i = 0; i < addSpaces; i++) {
this.key = this.key + " ";
}
} else {
this.key = this.key.substring(0, 16);
}
this.keySpec = new SecretKeySpec(this.key.getBytes(), "AES");
this.ivSpec = new IvParameterSpec(iv.getBytes());
this.cipher = Cipher.getInstance("AES/CBC/NoPadding");
}
/**
* Hexa to Bytes conversion
*
* @param str
* @return
*/
public byte[] hexToBytes(String str) {
if (str == null) {
return null;
} else if (str.length() < 2) {
return null;
} else {
int len = str.length() / 2;
byte[] buffer = new byte[len];
for (int i = 0; i < len; i++) {
buffer[i] = (byte) Integer.parseInt(str.substring(i * 2, i * 2 + 2), 16);
}
return buffer;
}
}
/** Decrypt the given excrypted string
*
* @param encrStr
* @throws Exception
*/
public String decrypt(String encrData) throws Exception {
this.cipher.init(Cipher.DECRYPT_MODE, this.keySpec, this.ivSpec);
byte[] outText = this.cipher.doFinal(hexToBytes(encrData));
String decrData = new String(outText).trim();
return decrData;
}
public static void main(String[] args) throws Exception {
Decrypto c = new Decrypto("D4:6E:AC:3F:F0:BE");
String decrStr = c.decrypt("1f50a943601d8e29206c716f82e58b8d");
System.out.println("Decrypted Str :" + decrStr);
}
}
Encripción en PHP
$cipher = "rijndael-128";
$mode = "cbc";
$secret_key = "D4:6E:AC:3F:F0:BE";
//iv length should be 16 bytes
$iv = "fedcba9876543210";
// Make sure the key length should be 16 bytes
$key_len = strlen($secret_key);
if($key_len < 16 ){
$addS = 16 - $key_len;
for($i =0 ;$i < $addS; $i++){
$secret_key.=" ";
}
}else{
$secret_key = substr($secret_key, 0, 16);
}
$td = mcrypt_module_open($cipher, "", $mode, $iv);
mcrypt_generic_init($td, $secret_key, $iv);
$cyper_text = mcrypt_generic($td, "Hello World");
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
echo bin2hex($cyper_text);
?>
Desencriptar en PHP
$cipher = "rijndael-128";
$mode = "cbc";
$secret_key = "D4:6E:AC:3F:F0:BE";
//iv length should be 16 bytes
$iv = "fedcba9876543210";
// Make sure the key length should be 16 bytes
$key_len = strlen($secret_key);
if($key_len < 16 ){
$addS = 16 - $key_len;
for($i =0 ;$i < $addS; $i++){
$secret_key.=" ";
}
}else{
$secret_key = substr($secret_key, 0, 16);
}
$td = mcrypt_module_open($cipher, "", $mode, $iv);
mcrypt_generic_init($td, $secret_key, $iv);
$decrypted_text = mdecrypt_generic($td, hex2bin("444e6969a269829a3e59a86300614fc5"));
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
echo trim($decrypted_text);
function hex2bin($data){
$bin = "";
$i = 0;
do {
$bin .= chr(hexdec($data{$i}.$data{($i + 1)}));
$i += 2;
} while ($i < strlen($data));
return $bin;
}
?>
Java encriptación:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package cifrado;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
/**
*
* @author thaednevol
*/
public class Crypto {
//iv length should be 16 bytes
private String iv = "fedcba9876543210";
private String key = null;
private Cipher cipher = null;
private SecretKeySpec keySpec = null;
private IvParameterSpec ivSpec = null;
/**
* Constructor
*
* @throws Exception
*/
public Crypto(String key) throws Exception {
this.key = key;
// Make sure the key length should be 16
int len = this.key.length();
if(len < 16) {
int addSpaces = 16 - len;
for (int i = 0; i < addSpaces; i++) {
this.key = this.key + " ";
}
} else {
this.key = this.key.substring(0, 16);
}
this.keySpec = new SecretKeySpec(this.key.getBytes(), "AES");
this.ivSpec = new IvParameterSpec(iv.getBytes());
this.cipher = Cipher.getInstance("AES/CBC/NoPadding");
}
/**
* Bytes to Hexa conversion
*
* @param data
* @return
*/
public String bytesToHex(byte[] data) {
if (data == null) {
return null;
} else {
int len = data.length;
String str = "";
for (int i = 0; i < len; i++) {
if ((data[i] & 0xFF) < 16)
str = str + "0" + java.lang.Integer.toHexString(data[i] & 0xFF);
else
str = str + java.lang.Integer.toHexString(data[i] & 0xFF);
}
return str;
}
}
/** Encrpt the goven string
*
* @param plainData
* @throws Exception
*/
public String encrypt(String plainData) throws Exception {
// Make sure the plainData length should be multiple with 16
int len = plainData.length();
int q = len / 16;
int addSpaces = ((q + 1) * 16) - len;
for (int i = 0; i < addSpaces; i++) {
plainData = plainData + " ";
}
this.cipher.init(Cipher.ENCRYPT_MODE, this.keySpec, this.ivSpec);
byte[] encrypted = cipher.doFinal(plainData.getBytes());
return bytesToHex(encrypted);
}
public static void main(String[] args) throws Exception {
Crypto c = new Crypto("D4:6E:AC:3F:F0:BE");
String encrStr = c.encrypt("Hello World");
System.out.println("Encrypted Str :" + encrStr);
}
}
Java desencriptación
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package cifrado;
/**
*
* @author thaednevol
*/
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
public class Decrypto {
//iv length should be 16 bytes
private String iv = "fedcba9876543210";
private String key = null;
private Cipher cipher = null;
private SecretKeySpec keySpec = null;
private IvParameterSpec ivSpec = null;
/**
* Constructor
*
* @throws Exception
*/
public Decrypto(String key) throws Exception {
this.key = key;
// Make sure the key length should be 16
int len = this.key.length();
if(len < 16) {
int addSpaces = 16 - len;
for (int i = 0; i < addSpaces; i++) {
this.key = this.key + " ";
}
} else {
this.key = this.key.substring(0, 16);
}
this.keySpec = new SecretKeySpec(this.key.getBytes(), "AES");
this.ivSpec = new IvParameterSpec(iv.getBytes());
this.cipher = Cipher.getInstance("AES/CBC/NoPadding");
}
/**
* Hexa to Bytes conversion
*
* @param str
* @return
*/
public byte[] hexToBytes(String str) {
if (str == null) {
return null;
} else if (str.length() < 2) {
return null;
} else {
int len = str.length() / 2;
byte[] buffer = new byte[len];
for (int i = 0; i < len; i++) {
buffer[i] = (byte) Integer.parseInt(str.substring(i * 2, i * 2 + 2), 16);
}
return buffer;
}
}
/** Decrypt the given excrypted string
*
* @param encrStr
* @throws Exception
*/
public String decrypt(String encrData) throws Exception {
this.cipher.init(Cipher.DECRYPT_MODE, this.keySpec, this.ivSpec);
byte[] outText = this.cipher.doFinal(hexToBytes(encrData));
String decrData = new String(outText).trim();
return decrData;
}
public static void main(String[] args) throws Exception {
Decrypto c = new Decrypto("D4:6E:AC:3F:F0:BE");
String decrStr = c.decrypt("1f50a943601d8e29206c716f82e58b8d");
System.out.println("Decrypted Str :" + decrStr);
}
}
Encripción en PHP
$cipher = "rijndael-128";
$mode = "cbc";
$secret_key = "D4:6E:AC:3F:F0:BE";
//iv length should be 16 bytes
$iv = "fedcba9876543210";
// Make sure the key length should be 16 bytes
$key_len = strlen($secret_key);
if($key_len < 16 ){
$addS = 16 - $key_len;
for($i =0 ;$i < $addS; $i++){
$secret_key.=" ";
}
}else{
$secret_key = substr($secret_key, 0, 16);
}
$td = mcrypt_module_open($cipher, "", $mode, $iv);
mcrypt_generic_init($td, $secret_key, $iv);
$cyper_text = mcrypt_generic($td, "Hello World");
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
echo bin2hex($cyper_text);
?>
Desencriptar en PHP
$cipher = "rijndael-128";
$mode = "cbc";
$secret_key = "D4:6E:AC:3F:F0:BE";
//iv length should be 16 bytes
$iv = "fedcba9876543210";
// Make sure the key length should be 16 bytes
$key_len = strlen($secret_key);
if($key_len < 16 ){
$addS = 16 - $key_len;
for($i =0 ;$i < $addS; $i++){
$secret_key.=" ";
}
}else{
$secret_key = substr($secret_key, 0, 16);
}
$td = mcrypt_module_open($cipher, "", $mode, $iv);
mcrypt_generic_init($td, $secret_key, $iv);
$decrypted_text = mdecrypt_generic($td, hex2bin("444e6969a269829a3e59a86300614fc5"));
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
echo trim($decrypted_text);
function hex2bin($data){
$bin = "";
$i = 0;
do {
$bin .= chr(hexdec($data{$i}.$data{($i + 1)}));
$i += 2;
} while ($i < strlen($data));
return $bin;
}
?>
Etiquetas:
AES,
desencriptar,
Encriptar,
Java,
PHP
domingo, 4 de octubre de 2009
Pasar un arreglo en PHP a uno en JavaScript
Ahora bien, en el formulario para llenar la información de contacto hay un combo que se despliega mostrando las ciudades en las que hay almacenes, ahí se puede seleccionar la ciudad en la que labora el contacto y el siguiente campo es un combo que se despliega mostrando los almacenes de dicha ciudad, por que no seria ni estético ni funcional mostrar todos los almacenes si ya se discrimino una ciudad, y para llenar el combo de almacén debo ejecutar a una consulta en la BD que seleccione los almacenes que están en la ciudad escogida en el combo:
select almacen from almacenes where ciudad = "ciudad seleccionada en el combo"
donde almacen es el nombre del almacen y almacenes la tabla, pero esto me implicaria enviar la pagina solo para obtener eso y luego enviarla de nuevo para guardar, me pregunte entonces si no podria obtener todos los almacenes con sus ciudades:
$con="select almacen, ciudad from almacen";
$res=mysqli_query($link,$con);
y guardarlo todo en un arreglo:
$f=mysqli_fetch_array($res)
y que se envié el arreglo de php a la pagina en un arreglo javascript para que en una funcion javascript se decida como se va a llenar el combo de almacén.
Asi fue como lo hice:
$i=mysqli_num_rows($res);
Rescato cuantas filas devolvio la consulta, cuantos almacenes tenemos.
echo "<script language='javascript'> var almacencito= new Array($i); </script>";
echo "<script language='javascript'>var ciudad = new Array($i); </script>";
Defino desde el codigo php dos arreglos que tengan por tamaño tantas filas tiene la consulta.
Y cargo cada campo del arreglo de javascript con cada campo de la consulta que esta en php.
while($f=mysqli_fetch_array($res)){
$temporal=$f['ciudad'];
echo "<script language='javascript'>ciudad[$i]='$temporal';</script>";
$temporal=$f['almacen'];
echo "<script language='javascript'>almacencito[$i]='$temporal'; </script>";
$i++;
}
Asi cuando ya se ha seleccionado el campo ciudad una funcion javascript llena el combo almacen.
function almacen()
{
var i=0;
var k=0;
var j= document.f1.ciudad.selectedIndex;
while(i<ciudad.length)
alert(document.f1.ciudad.selectedIndex+" "+i.toString()+" "+almacencito[i].toString());
if(document.f1.ciudad.options[j].text==ciudad[i])
{
document.f1.Almacen.length=k+1;
document.f1.Almacen.options[k].value=almacencito[i].toString();
document.f1.Almacen.options[k].text=almacencito[i].toString();
k++;
}
i++;
}
}
Se que existen formas mas eficientes y sofisticadas de hacer esto, pero esta me saco de un apuro.
Etiquetas:
arreglos,
JavaScript,
PHP
Suscribirse a:
Entradas (Atom)