Php retorcido
Seguimos con symfony, 2 trasnochadas y dos monitores después
Cómo ha se habrán dado la lata con los dos artículos anteriores sobre symfony, he tenido que tragarme más de un par de trasnochadas mejorando una aplicación en symfony que debo sacar sí o sí esta semana.
Después de leer casi completo EL LIBRO y partes de la API, ya casi, casi, puedo decir que entiendo como funciona el bicho.
En primer lugar, todavía me parece muy razonable la forma en la cual estructuraron la capa "Control". No es nada del otro mundo desarrollarlo (es cosa de hacer un par de includes bien puestos en función del URL), pero el sistema de ruteo con las URL no está mal. Casi drupaliano :)
- 2 comentarios
- Leer más
- 804 lecturas
PHP 4.4.0, o la escoba que está quedando
Aunque yo no he tenido muchos líos, excepto con phppgadmin, parece ser que los arreglos en la manera de trabajar las referencias en PHP 4.4.0 ha dado multitud de problemas a mucha gente.
Lo malo ha sido la actitud de los desarrolladores de PHP, tipo "su código es malo, arréglenlo". Hombre, que uno trabaja muchas veces con código de muchas otras personas, ya sea por las bibliotecas o por otros desarrolladores del proyecto, y es horrible tratar de encontrar todos los movimientos extraños de referencias dando vueltas.
En términos sencillos: no es nada bueno que un sistema completamente funcional en 4.3.x comienza a dar fallos extraños en un servidor, sólo por el hecho de que un buen admin se le ocurrió actualizar la versión a la 4.4.x. No deberían presentarse problemas tan graves de compatibilidad dentro de una revisión interna, ¿no es cierto?
- 2 comentarios
- Leer más
- 1936 lecturas
Nicechat: Un agradable chat en Php, Mysql y XmlHttpRequest
Se lo mostré a Christian, y le gustó. Lo pusé en una aplicación del lugar donde trabajo y las chicas se pusieron a chatear como locas.
Así que, nada que hacer. Presentamos en sociedad a nicechat, el chat en php que puede (o no) hacerles la vida más fácil.
Entre sus características se encuentran:
- Pequeño: No más de 20kb de código
- Rápido: En una intranet, fácil hace ping de 60ms, sin ningún tipo de optimización. En internet, los ping pueden llegar a 300ms
- Fácil de instalar: Es cosa de meter el sql en la base de datos, configurar un archivo y comienza a funcionar!
- Fácil de adaptar: El sistema está hecho para que se integre del modo menos instrusivo posible en cualquier tipo de aplicación ya hecha. Hasta creo que sería fácil con smarty :P
- 20 comentarios
- Leer más
- 10258 lecturas
PHP5 para Ctags
Un patch para Ctags 5.4.2, que permite listar por separado los miembros privados, protegidos y públicos de las clases en PHP 5. Buena adición para jEdit!
- Añadir nuevo comentario
- 1985 lecturas
Libro a leer: PHP 5 Power Programming
En la lista en español de php lo recomendaron harto, así que a leerlo:
PHP 5 Power Programming, por Andi Gutmans, Stig Bakken, Derick Rethans.
- 3 comentarios
- 3418 lecturas
Mi primer módulo drupaliano : codefilter
Bueno, tenía que pasar algún día, no? Como suelo publicar mi buena cantidad de código, me gusta que se vea lo más bonito posible. En Wordpress ocupaba un plug-in que pasaba todo texto entre <pre lang='php> por highlight_string. Al pasar a Drupal, no me quedó más que activar el modo php en algunos post y hacerlo a mano.
Obviamente, esto aburre. Así que decidí gastar un par de neuronas y ver si podía crear un filtro. En la página de ejemplo de módulo de filtro de la documentación de Drupal encontré la información que necesitaba.
Como ya he señalado en más de mil ocasiones, soy un flojo rematado, así que no me iba a dar la lata de crear un marcador de código. Entonces, mi neurona MLP recordó que había un paquete de Pear cuya única misión en la vida es mostrar código bónito: Text_Highlighter. Tiene soporte, además de código PHP, para código XML, Ruby, Python, C, y otra infinidad de cosas, así que mi soporte para otros lenguajes estaba garantizado.
Les remito a la descarga para el código del módulo, pero les muestro el par de líneas que hacen la verdadera magia
- function codefilter_filter($op, $delta = 0, $format = -1, $text = '') {
- swith($op) {
- case 'process':
- return preg_replace_callback("/<code lang=[\"']([^\"']+)[\"']>(.+?)<\/code>/ms",'_codefilter_process',$text);
- }
- }
- function _codefilter_process($match) {
- $lang=$match[1];
- $text=$match[2];
- $options = array(
- 'numbers' => HL_NUMBERS_LI,
- 'tabsize' => 4,
- );
- $renderer =& new Text_Highlighter_Renderer_HTML($options);
- if($hl =& Text_Highlighter::factory($lang)) {
- $hl->setRenderer($renderer);
- return $hl->highlight(trim($text));
- } else {
- return $text;
- }
- }
Si lo leen con atención, lo primera es una preg_replace_callback reemplaza todos los textos que van entre tags code con atributo lang por el resultado de la función _codefilter_process. Esta, a su vez, instancia dos objetos, una subclase de Text_Highlighter y un Text_Highlighter_Renderer_HTML, siendo el primero encargado de procesar el texto y el segundo, de mostrarlo como HTML. La subclase de Text_Highlighter la obtengo directamente del atributo, así que hay que tener cuidado de que el lenguaje esté soportado.
El código que mostré de ejemplo está procesado, precisamente, con el módulo. Si les sirve o quieren saber más, cosa de comentar
- 2 comentarios
- 2881 lecturas
Lector de Excel, en Php nativo
El ejemplo incluido reza algo como lo siguiente:
- require_once 'Excel/reader.php';
- $data = new Spreadsheet_Excel_Reader();
- $data->setOutputEncoding('CP1251');
- $data->setUTFEncoder('mb');
- $data->read('jxlrwtest.xls');
- /*
- $data->sheets[0]['numRows'] - count rows
- $data->sheets[0]['numCols'] - count columns
- $data->sheets[0]['cells'][$i][$j] - data from $i-row $j-column
- $data->sheets[0]['cellsInfo'][$i][$j] - extended info about cell
- $data->sheets[0]['cellsInfo'][$i][$j]['type'] = "date" | "number" | "unknown"
- if 'type' == "unknown" - use 'raw' value, because cell contain value with format '0.00';
- $data->sheets[0]['cellsInfo'][$i][$j]['raw'] = value if cell without format
- $data->sheets[0]['cellsInfo'][$i][$j]['colspan']
- $data->sheets[0]['cellsInfo'][$i][$j]['rowspan']
- */
- error_reporting(E_ALL ^ E_NOTICE);
- for ($i = 1; $i <= $data->sheets[0]['numRows']; $i++) {
- for ($j = 1; $j <= $data->sheets[0]['numCols']; $j++) {
- echo "\"".$data->sheets[0]['cells'][$i][$j]."\",";
- }
- echo "\n";
- }
Nice. Hubiera preferido un método basado en objetos, de tal manera de hacer algo como
- while($aSheet=&$data->fetchSheet()) {
- while($aRow=$aSheet->fetchRow()) {
- echo $aSheet->name.' '.$aRow[1];
- }
- }
- 28 comentarios
- 14544 lecturas
Ordenar por campos múltiples en arrays asociativos
Una de las grandes dudas existenciales es como lograr ordenar un array de dos dimensiones por los nombres de los campos en la segunda dimension.
Un ejemplo bruto:- $a=array(
- 0=>array('id'=>1,'nombre'=>'Uno'),
- 1=>array('id'=>2,'nombre'=>'Dos')
- );
En este caso, podríamos querer ordenar las filas por la columna 'id', o la columna 'nombre'. En el fondo, lo mismo que ORDER BY en SQL.
Para los que no saben, la función uasort permite ordenar un array de acuerdo al criterio que estimemos conveniente, a través de la entrega de un callback. O sea, podríamos ordenar a mano el array por el nombre haciendo
- uasort($a,'ordenar');
- function ordenar($a,$b) {
- if ($a['nombre']>$b['nombre']) {return 1;
- } elseif ($a['nombre']<$b['nombre']) {return -1;
- } else {
- return 0; }
- }
El problema está en si queremos ordenar por múltiples campos. Por decir, primero el nombre, luego el id, o viceversa. La solución está en crear en forma dinámica el código que permita resolver el problema.
Si se dieron cuenta, la función es muy simple. Debe devolver 1 si se quiere dar a entender que el primer valor de la tupla debe ir después, -1 si debe ir antes.
Por tanto, bastaría con entregar el array y la lista de campos en un array a la función, señalando la dirección del orden (ascendente o descendente). La función debería crear en tiempo real el código necesario para ordenar, el cual se 'inyecta' en el uasort a través de la función create_function, la cual nos permite crear una función lambda o anónima, a partir de una cadena.
Basta de chachara y les muestro la función con un pequeño ejemplo
- function ordenar(&$aTabla,$aCampos) {
- $aSalida=array();
- foreach($aCampos as $sCampo=>$sOrden) {
- if($sOrden=='ASC') {
- $s1='>';
- $s2='<';
- } else {
- $s1='<';
- $s2='>';
- }
- $aSalida[]=<<<HERE
- if(array_key_exists('$sCampo',\$a)) {
- if(\$a['$sCampo'] $s1 \$b['$sCampo']) {
- return 1;
- } elseif (\$a['$sCampo'] $s2 \$b['$sCampo']) {
- return -1;
- }
- }
- HERE;
- }
- $aSalida[]='return 0;';
- uasort($aTabla, create_function('$a, $b', implode("\n",$aSalida)));
- }
- $tabla=array(
- array("nombre"=>"7-Juan Perez","direccion"=>"Aseo 100"),
- array("nombre"=>"6-Juan Perez","direccion"=>"Aseo 300"),
- array("nombre"=>"2-Juan Perez","direccion"=>"Aseo 200"),
- array("nombre"=>"1-Juan Perez","direccion"=>"Aseo 500"),
- array("nombre"=>"9-Juan Perez","direccion"=>"Aseo 900"),
- array("nombre"=>"3-Juan Perez","direccion"=>"Aseo 700"),
- array("nombre"=>"4-Juan Perez","direccion"=>"Aseo 600"),
- );
- ordenar($tabla,array("nombre"=>"ASC","direccion"=>"ASC"));
- print_r($tabla);
Ven? Nada tan terrible.Recuerden dos cosas: la tabla se envía por referencia a la función y, segundo, los campos se envían en un array asociativo, siendo la clave el campo y el valor "ASC" o "DESC"
Si algo no se entiende mucho, tiren un comentario!
- 3 comentarios
- 8336 lecturas
Drupal vs. Wordpress vs. Tikiwiki
Uno de los últimos comentarios pedía alguna referencia sobre que es mejor para administrar un sitio como este, si Wordpress o Drupal.
Hacer una comparativa punto a punto va más allá de mis intenciones, así que trataré de hacer una síntesis de lo más importante, según mi punto de vista. Agregaré a la comparativa a Tikiwiki, ya que mi sitio de psicología, Apsique, corre en esa plataforma.
- 20 comentarios
- Leer más
- 18548 lecturas
Worpress a Drupal, 0.0.2
Primer correo para mi pequeño script de traspaso de Worpress a Drupal! Ya creía que nadie lo había ocupado. Por lo visto, le funcionó perfectamente, excepto por la actualización de las secuencias de páginas (nid_id).
Por si acaso, en drupal la tabla sequences mantiene la referencia del último id creado para una página. No sé que le habrá pasado, porque a mí me funcionó perfecto eso. Me imagino que puede haber tratado de importar antes de crear una página de drupal.
Por si acaso, agregué un par instrucciones para crear la tupla si no existe y recomiendo, en las instrucciones, crear un par de páginas en drupal para crear las tuplas auxiliares necesarias.
- 2 comentarios
- Leer más
- 1704 lecturas

Comentarios recientes
hace 1 día 1 hora
hace 2 días 7 horas
hace 2 días 14 horas
hace 1 semana 2 días
hace 1 semana 4 días
hace 1 semana 5 días
hace 2 semanas 1 día
hace 2 semanas 1 día
hace 3 semanas 1 hora
hace 3 semanas 2 horas