Comunidad de diseño web y desarrollo en internet online

Proyecto de Framework MVC en PHP 5

Citar            
MensajeEscrito el 14 Dic 2006 09:32 pm
¡Saludos estimada comunidad de CLab!

En esta oportunidad vengo a ustedes, para comentarles que al fin perdí el juicio y estoy tratando de crear un Framework MVC en PHP 5 que emule las ventajas básicas del lenguaje Ruby On Rails o de frameworks en PHP como PHPCake ¿Por qué? Primero porque, como ya comenté, enloquecí. Segundo, porque me gusta PHP y no quiero cambiarme a RoR. Tercero, porque no quiero depender de herramientas de terceros que: 1. por tanta generalización/personalización/configuración/adaptación poseen miles de líneas de código innecesarias para mí, y aunque posean decenas de utilidades, es difícil entrar y reconfigurar el núcleo a gusto propio. 2. Por las restricciones de licencia (si aplica). 3. porque quiero mis tablas en español sin modificar "inflectores" y códigos ajenos (léase punto 1 y 2). 4. porque no quiero ser dependiente de dichos códigos y actualizaciones. 5. porque ya estoy grande y sé programar. 6. porque me gusta. 7. porque no tengo novia...

En fin. el caso es que, me gustaría saber si alguno de ustedes coincide con los puntos arriba mencionados y quiere compartir lo que será este desarrollo que, aun cuando no sé si podré terminarlo, en ese caso lo más probable es que lo libere, para ponerlo al servicio de la comunidad (y hacerme famoso).

Por ahora lo que más tengo son dudas, sobre la mejor práctica de hacer esto o lo otro. Y el acoplamiento de plantillas con sus métodos de caché para mejorar y "descolapsar" las vistas, que en estos frameworks me han parecido casi insoportables por la gran cantidad de código (así sean "html helpers", que considero casi incomprensible para un diseñador normal)

Ya hice (apoyandome en el mod_rewrite de apache) el esqueleto para las llamadas a las clases y metodos, controladores y modelos... y algunas otras cosas, y bueno, creo que va quedando bien porque me considero muy bueno en PHP, lo único que aún no entiendo muy bien es para qué sirve el echo

Por acá les dejo un código sencillito en PHP 5 de los llamados métodos mágicos que hice hace una semana.

Código :

<?php

   class Modelo {
  
    function __call($metodo,$aParam=NULL) {
   
     $metodos = array('encuentraPor');
   
     for($i=0;$i<count($metodos);$i++)
      
       if( strpos($metodo,$metodos[$i]) === 0 ):
      
        $metodo_a_llamar = $metodos[$i];

        $parametro = array( str_replace($metodo_a_llamar,'',$metodo) );
        
        count($aParam) ? $aParam = array_merge($parametro,$aParam) : $aParam = $parametro;
      
      endif;
      
     if ( !isset($parametro) ) die('no encontrado');
     
     call_user_func_array(array(&$this,$metodo_a_llamar),$aParam);
   
   }
   
   function encuentraPor($campo) {
   
     echo "usted desea encontrar un registro por $campo";
   
   }
  
  }
  
  $mod = new Modelo;
  
  $mod->encuentraPorNombre(); //cambiar aca por encuentraPorApellido, etc

?>

Por Duilio

Claber

2590 de clabLevel

25 tutoriales
1 articulo

Genero:Masculino   Premio_Secretos

Venezuela

firefox
Citar            
MensajeEscrito el 19 Dic 2006 04:00 am

Duilio escribió:

7. porque no tengo novia...

wow! puedes lograrlo entonces

:lol: :lol:


Una optimización a tu código

Código :

//demas codigo 
$metodos = array('encuentraPor');
$total = count($metodos);
 for($i=0;$i<$total;$i++)
/* demas codigo */


saludos

Por Maikel

BOFH

5575 de clabLevel

22 tutoriales
5 articulos

Genero:Masculino   Team Cristalab

Claber de baja indefinida

firefox
Citar            
MensajeEscrito el 19 Dic 2006 04:10 pm
De todos los puntos, efectivamente el 7 es el mas convincente :lol:



Tu clase optimizada: ^^

Código :

<?php
class Modelo {
   function __call($metodo,$aParam=NULL) {
      $metodos = array('encuentraPor');
      foreach($metodos as $metodoEnArrelgo){ //Prefiero recorrer un array con un ciclo hecho para recorrer arrays
         if( strpos($metodo, $metodoEnArrelgo) === 0 ){
            $parametro = array( substr($metodo, strlen($metodoEnArrelgo) ) );
            count($aParam) ? $aParam = array_merge($parametro,$aParam) : $aParam = $parametro;
            break; //Termina el ciclo, no tiene caso seguir revisando
         }
      }
      if ( !isset($parametro) ){
         trigger_error('WTF!? ¿Dónde carajos inventaste ese método?');
         return null;
      }
      call_user_func_array(array(&$this,$metodoEnArrelgo),$aParam);
   }
   function encuentraPor($campo) {
      echo "usted desea encontrar un registro por $campo";
   }
}
$mod = new Modelo;
$mod->encuentraPorNombre(); //cambiar aca por encuentraPorApellido, etc
$mod->encuentraPsorNombre(); //Provoca error
?>

Por Dano

BOFH

4273 de clabLevel

14 tutoriales
4 articulos
10 ejemplos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Lugar estratégico para vigilarte

firefox
Citar            
MensajeEscrito el 19 Dic 2006 08:50 pm
Muchas gracias Maikel y Dano.

Claro, en la primera opción no se tiene que usar la funcion count() una y otra vez. Es algo que habia pasado por alto en pro de ahorrarme una linea de codigo :$

y la segunda opcion está mucho más óptima. No sé que me pasó que obvié el "break" (suelo usarlo para todo), aunque confieso que el foreach no lo hacía sino para arrays asociativos. Haré el update.

Me entusiasma mucho que alguien se tomara un segundo en revisar esto. Si no les molesta subiré otras cosas que he ido terminando. Entre ellas un método de Scaffold junto con comprobaciones en dos capas (cliente - javascript, servidor - php) que hice.

Por ahora lo que más me ha costado es lo de las plantillas, aún no entiendo muy bien el uso de reemplazar expresiones regulares con preg_replace, como las usadas en el tutorial de plantillas de CLab, pero investigaré apenas tenga tiempo. De todas formas, alguna ayudilla se agradece :)

Un saludo.

Por Duilio

Claber

2590 de clabLevel

25 tutoriales
1 articulo

Genero:Masculino   Premio_Secretos



Ultima edición por Duilio el 19 Dic 2006 08:56 pm, editado 1 vez

Venezuela

firefox
Citar            
MensajeEscrito el 19 Dic 2006 08:56 pm
eh bueno Dano tiene más tiempo que yo :lol: , yo ni siquiera lei completo el código y justamente eso de ahorrar una linea de código siempre lo critico.

Cualquier duda con el sistema de plantillas puedes postear tus dudas aqui y te atenderemos.

saludos

Por Maikel

BOFH

5575 de clabLevel

22 tutoriales
5 articulos

Genero:Masculino   Team Cristalab

Claber de baja indefinida

firefox
Citar            
MensajeEscrito el 19 Dic 2006 09:11 pm
tendría que revisar el código con calma, para poder decir verdaderamente qué dudas tengo. Por ahora una cosilla:

Código :

sostenedor_error('error al abrir la plantilla ' . $this->tpl_file);


<< creo que esta es una funcion de Dano que no se incluye y tendría que cambiarse por algo nativo de php

y...

Código :

$this->mihtml = preg_replace('#\{([a-z0-9\-_]*?)\}#is', "' . $\\1 . '", $this->mihtml);


creo que dice algo como: cualquier cosa que sea de la 'a' a la 'z' o del '0' al '9' o '-' o '_' que aparezca una o mas veces y este enmarcada en { y } pero, que es el numeral y el #is ?

Además, me gustaria aparte de la clase plantilla, agregarle un caché... y no ignorar el código php... o colocarle al menos {if} a la plantilla... pero aún no me he sentado con ello...

es un arduo trabajo, pero hasta ahora creo que ha valido la pena: es divertido y mas economico que salir con la novia :lol:

Por Duilio

Claber

2590 de clabLevel

25 tutoriales
1 articulo

Genero:Masculino   Premio_Secretos

Venezuela

firefox
Citar            
MensajeEscrito el 19 Dic 2006 11:47 pm
eh no, esa version ya es obsoleta. Revisa la que esta disponible aqui:
http://www.cristalab.com/tutoriales/160/galeria-de-imagenes-con-templates-en-php

Esta mejor definida y tienes otras opciones mejores que esa vieja.

Lo del cache no lo veo factible con la ultima version, pues puedes separar todo el codigo php del html, que es la razón principal de la existencia de Template "NO mezclar codigo php con html". En teoría atentarias con el "objetivo" de la clase.


Esto:
$this->mihtml = preg_replace('#\{([a-z0-9\-_]*?)\}#is', "' . $\\1 . '", $this->mihtml);

hace que si la plantilla tiene esto

Código :

<body>
{variable}
</body>


lo convierta a

Código :

<body>
$variable
</body>


Expresión regular importantisima y es la linea base de la clase.

Por Maikel

BOFH

5575 de clabLevel

22 tutoriales
5 articulos

Genero:Masculino   Team Cristalab

Claber de baja indefinida

firefox
Citar            
MensajeEscrito el 23 Dic 2006 03:15 pm
Vale... Pero el caché yo lo entendería algo así como que, la salida que se obtenga de la plantilla se guarde en una carpeta temporal... y la clase, antes de llamar a la plantilla compruebe que el archivo en la carpeta temporal ya exista, y si existe, cargue éste en vez de volver a generar la plantilla...consumiendo, obviamente menos recursos...

ahora, lo "difícil" he pensado, es borrar el contenido en caché, cuando se generen nuevas versiones. Pero creo que se podría mandar la orden de eliminar el caché cuando se envíe INSERT, UPDATE, o DELETE a la tabla que corresponda a la salida del caché. Suponiendo que se trabaje con convenciones de nombres... Es decir, para una tabla "noticias" se tenga un archivo de caché llamado "noticias.tmp", que se yo...

Claro, esto muy a grosso modo.

Te agradezco tu respuesta Maikel, pero mi duda persiste, sobre qué hacen el "#" y el "#is" en la expresión... Aunque confieso que tampoco he googleado a ver si consigo qué significan dichos simbolos.

Un saludo... Luego subo algunos codigos

Por Duilio

Claber

2590 de clabLevel

25 tutoriales
1 articulo

Genero:Masculino   Premio_Secretos

Venezuela

firefox
Citar            
MensajeEscrito el 23 Dic 2006 03:19 pm
Por cierto, ahora que dices lo de mantener separados php y html. Es una de las cosas que no me gusta de los frameworks, que en las llamadas "vistas" hay toneladas de codigo php, foreach para recorrer vectores, "html helpers" y un largo etcétera. Y yo prefiero tener HTML concatenado dentro de mi PHP (por ejemplo, en el controlador), pero que el diseñador no vaya enloquecer tratando de modificar algo en las vistas.

Saludos ^^

Por Duilio

Claber

2590 de clabLevel

25 tutoriales
1 articulo

Genero:Masculino   Premio_Secretos

Venezuela

firefox
Citar            
MensajeEscrito el 23 Dic 2006 09:01 pm
el primer # empieza un expresion regular
el segundo # termina la expresion regular
i luego del segundo # son modificadores de la expresiones regular, "i" es que tome encuenta mayusculas y minusculas asi en la expresion regular se haya escrito "explicitamente" con alguno de ellos.
s que la expresion revise todo el texto sin importar saltos de lineas, espacios, tabulaciones, etc.

Duilio escribió:

Y yo prefiero tener HTML concatenado dentro de mi PHP (por ejemplo, en el controlador)


En lo personal odio leer codigo html y php mezclado(pienso que igual a Dano, sino que me corrija...), La legibilidad del codigo se compromete considerablemente. Como te digo la idea principal de la clase Template es esa, y forma parte de nuestra clases ultra-consentidas ^^ .

Por Maikel

BOFH

5575 de clabLevel

22 tutoriales
5 articulos

Genero:Masculino   Team Cristalab

Claber de baja indefinida

firefox
Citar            
MensajeEscrito el 23 Dic 2006 09:45 pm
Ah! es que con tanto código que estoy haciendo / viendo, no me había fijado que ustedes tienen como mini-plantillas para las partes dinámicas (difíciles) del desarrollo. Ahí es donde yo me refería que concateno PHP y HTML, por ejemplo:

Código :

$cadena .= "<li><a href='$tabla.php?id=$id_modulo'>$titulo</a></li>";


y por ultimo le asigno $cadena al motor de plantillas (hasta ahora he trabajado con Smarty) y llamo por ultimo a la plantilla completa.

Ahora, lo que ha hecho Dano es interesante porque en apariencia logra separar 100% codigo y html, ahora, tengo que analizar cual de estas opciones me conviene más a mí...

Pero en cualquier caso, me da gusto poder participar en esta comunidad y sobretodo ver sus aportes..

snif :cry: xD

Por Duilio

Claber

2590 de clabLevel

25 tutoriales
1 articulo

Genero:Masculino   Premio_Secretos

Venezuela

firefox
Citar            
MensajeEscrito el 24 Dic 2006 09:51 pm

Código :

$cadena .= "<li><a href='$tabla.php?id=$id_modulo'>$titulo</a></li>";


Para estos casos de plantillas cortas que no hacen falta crear un archivo .tpl le agregamos nuevos metodos, en realidad la version final de Template no fue liberada.

Por Maikel

BOFH

5575 de clabLevel

22 tutoriales
5 articulos

Genero:Masculino   Team Cristalab

Claber de baja indefinida

firefox
Citar            
MensajeEscrito el 26 Dic 2006 03:10 pm
En realidad esta forma de crear tpl cortos me parecio excelente. Para mi framework, yo los colocaria en una carpeta aparte, que se llame misc o algo así... creo que al diseñador le puede ser útil.

de todas formas, ahora como hacen ustedes? si se puede :oops:

estoy molestando mucho ya? :lol:

tambien estoy haciendo una clase de plantillas desde cero, no porque la de Dano no sea genial, sino porque me gusta programar... y sigo sin novia...

UPDATE: estoy tratando de hacer un metodo de plantilla pero para casos repetitivos. algo como:

Código :

#<li><a href="{variable1}">{variable}</a></li>#

Por Duilio

Claber

2590 de clabLevel

25 tutoriales
1 articulo

Genero:Masculino   Premio_Secretos

Venezuela

firefox
Citar            
MensajeEscrito el 13 Oct 2009 04:34 pm
Si tieen problemas con las plantillas, tienen que tener en consideración los siguientes puntos:

1 .- el primero de ellos, hay que comprobar como están escrito los nombres de los archivos, ya que si se encuetra en un servidor linux, estos servidores son case-sensitive, es decir diferencian las mayúsculas y las minúsculas, esto es un problema habitual si trabajan mucho con servidores Windows, que sencillamente no los diferencia. Haciendo los cambios pertienentes por ejemplo el archivo o platilla debería estar escrito como holaMundo.tpl y no holamudo.tpl, etc.

2 .- lo siguiente sería, modificar la linea en [b]clase_plantilla.php[/b]. Si quieres que sea un código php solo debes cambiarlo por lo siguente:

[code] function muestra(){
if (!($this->fd = fopen($this->tpl_file,"r"))) {
echo('error al abrir la plantilla ' . $this->tpl_file);
} else{[/code]

Así dejarás de tener errores, y se ejecutaría el código ya que corresponde con el lenguaje nativo, aunque no luzca muy atractivo, por lo menos evitaremos tener el error.

Espero que les haya sido útil,

Ricardo

[email protected]

Por ricardodel

0 de clabLevel



 

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.