Comunidad de diseño web y desarrollo en internet online

Plantillas y Php - Error en rutas de imagenes tutorial de Maikel

Citar            
MensajeEscrito el 02 Jun 2012 08:58 pm
Buenas tardes, estube estudiando el excelente tutorial de Maikel, que explica como utilizar plantillas en php, separando la programacion del diseño web.
Este es el tutorial: http://www.cristalab.com/tutoriales/galeria-de-imagenes-con-templates-en-php-c160l/

Tengo un problema que no logro solucionar:

Por un lado, dentro de la carpeta "plantillas" cree un archivo.tpl, que tiene todo el diseño visual, colores, imagenes, etc. Ademas dentro de esta carpeta, esta el archivo css que le da forma y colores a "archivo.tpl".

Por otro lado, fuera de la carpeta plantillas tengo un script en php, que hace lo que tiene que hacer, e instancia la clase "Template.php" (que esta en otra carpeta).
Indico la carpeta donde esta guardada la plantilla y hago .show() para mostrarla.

Esta todo correcto, solo que no me muestra ni las imagenes ni el css, solo el html que contiene la plantilla.

Esto se da porque la plantilla se muestra desde la misma ruta que el script php que la llama, por lo tanto las rutas relativas de las imagenes y css quedan erroneas.

Como puedo solucionar esto???
Gracias!

Este es el codigo:

Código PHP :

   include("../../clases-y-librerias/template.php"); //La clase para cargar la plantilla visual...
   $miPlantilla = new Template(); //Instancio el objeto...
   //$miPlantilla->PATH ="../../plantillas/"; ///El directorio donde estan las plantillas...
    
    //El nombre del archivo de la plantilla, ejemplo: "mensaje.html" o "mensaje.tpl"...
   $miPlantilla->setTemplate("mensaje"); 
   
    //Los datos a mostrar en la plantilla...
    $miPlantilla->setVars(
        array
        (
            "TITULO" => "Error!", 
            "MENSAJE" => "<p>Este es un mensaje de prueba<p>", 
        )
    );
   
    //Muestro...
    echo $miPlantilla->show(); 

Por dyhsoluciones

11 de clabLevel



 

firefox
Citar            
MensajeEscrito el 03 Jun 2012 04:21 am
sabes, viendo como esta echa ese archivo Template.php, no te queda otra solucion que poner las URL Absolutas, o crearte una variable que la uses globalmente, como decir {URL}/plantilla.css y etc.
tambien te recuerdo que PHP tiene su propio sistema de plantillas aunque parece un poco acostumbrarse al tipeado es mas facil ,rapido y optimo

Código :

<h1><?=$titulo?></h1>

si te interesa cambiar de gestor de plantillas
yo use hace un tiempito uno que desarrolle y su uso es el siguiente

mis plantillas de ejemplo
*test.tpl.php*

Código :

<p>los {odio} a todos</p>
<h1>{hola}</h1>
<strong>{var}</strong>
<span>{titulo_corto}== <?=strtoupper($titulo_corto)?>/{tiempo}</span>

*formulario.tpl.php*

Código :

<select name="mi" id="">
<?php foreach($opciones as $id => $valor):?>
   <option value="<?=$id?>"><?=$valor?></option>
<?php endforeach;?>
</select>

---codigo_De_ejemplo.php--

Código PHP :

define('DS',DIRECTORY_SEPARATOR);
//ubicacion de nuestras plantillas
$PATH = dirname(__FILE__) . DS . 'mis_plantillas'.DS 'ejemplos';
//instanciamos nuestra plantilla
$t = new Plantilla_tuadmin($PATH);
//cargamos todas las variables por array
$t->vars(array(
   "hola" => "este es un hola mundano",
   "odio" => "amo"
));
// o alternativamente por esta forma
$t->_('titulo_corto','este esl titulo')
  ->_('tiempo',time())
  ->_('var','Este es el valor de lo que ya sabemos');
//mostramos el resultado el TRUE es para decirle que en nuestra plantilla hay variables de la forma {VARIABLE}
echo $t->load('test',true);
//borramos todas la variables para que no afecte nuestra siguiente plantilla
$t->erase();
//lo comentado abajo hace exactamente lo mismo
//$t->assigns(array('opciones' => array('1' => "comer","2"=> "defecar")));
//$t->assign('opciones' , array('1' => "comer","2"=> "defecar"));
$t->opciones = array('1' => "comer","2"=> "defecar");
echo $t->load('formulario');
//la siguiente mostrara un mensaje de error
echo $t->load("no_Existe");
$t->erase();

y el resultado FINAL

Código :

<p>los amo a todos</p>
<h1>este es un hola mundano</h1>
<strong>Este es el valor de lo que ya sabemos</strong>
<span>este esl titulo== ESTE ESL TITULO/1338696882</span>
<select name="mi" id="">
   <option value="<?=$id?>"><?=$valor?></option>
   <option value="<?=$id?>"><?=$valor?></option>
</select>La siguiente plantilla no existe C:/sitios/proyecto_fantasm/mis_plantillas/ejemplos\no_Existe.tpl.php<br />

si te interesa lo puedo subir a un server la clase plantilla_tuadmin
jeje se que no viene al caso todo esto segun tu pregunta, pero ejej es que estas usando una clase de plantillas publicada en el 2005,
php por esos tiempos estaba por la version 4 y creo que habia betas de la 5 , ahora php esta mejor optimizado y tiene la version php5.2 estable, y php5.3 estable

Por tuadmin

Claber

598 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 03 Jun 2012 02:17 pm
Hola, muchas gracias por semejante respuesta!! Si podes subirme o enviarme la clase me encantaria.

Estoy probando el tema de las plantillas porque nunca las use, asi que podria cambiar sin problemas a tu sistemas.

Gracias!!!

Por dyhsoluciones

11 de clabLevel



 

firefox
Citar            
MensajeEscrito el 03 Jun 2012 03:08 pm
bueno aca te dejo el archivo , por que no se donde ponerlo jjaa

Código PHP :

<?php 
/**
 * Esta clase solo es basica la pueden modificar , ya que solo es una idea rapida :),PHP es genial
 * @version 1.0
 * @author tuadmin
 */
class plantilla_tuadmin
{
   private $vars =array();
   private $assigns =array();
   private $path ;
   /**
    * @param string $path ubicacion de la carpeta de plantillas
    */
   public function __construct($path)
   {
      $this->path = $path;
   }
   /**
    * @param array $array este array solo debe ser usado en arrays de asignacion con valor cadena,numerico,booleano de tipo array(clave => valor )
    */
   public function vars($array)
   {
      $this->vars = $array;
   }
   /**
    * @param string $var solo acepta cadenas
    * @param string|int|boolean $value el valor de la variable
    * @return plantilla_tuadmin
    */
   public function _($var,$value)
   {
      $this->vars[$var] = $value;
      return $this;
   }
   /**
    * @param array $array este array solo debe ser usado en caso de ser variables o arrays multidimencionales array("pepito"=>array("casado" => "si"))
    */
   public function assigns($array)
   {
      $this->assigns = $array;
   }
   /**
    * @param string $var
    * @param mixed $value el valor puede ser cualquiera
    */
   public function assign($var,$value)
   {
      $this->assigns[$var] = $value;
      return $this;
   }
   /**
    * @param string $__file_name el nombre del archiv
    * @param boolean $__short_variables activar o no variables cortas {VARIABLE}  como si fuese <?=$VARIABLE?>
    * @return string retorna la cadena o la plantilla ya procesada
    */
   public function load($__file_name,$__short_variables = false)
   {
      //extraemos el array en variables por REFERENCIA lo cual hace que NO se dupliquen los valores y se optimize en la MEMORIA
      extract($this->vars,EXTR_REFS);
      extract($this->assigns,EXTR_REFS);
      //iniciamos el proceso para capturar la salida
      ob_start ();
      //comprobamos que la plantilla exista
      if(is_file($this->path . DIRECTORY_SEPARATOR . $__file_name .'.tpl.php'))
      {
         require $this->path . DIRECTORY_SEPARATOR . $__file_name .'.tpl.php';
      }
      else
      {
         echo "La siguiente plantilla no existe " . $this->path . DIRECTORY_SEPARATOR . $__file_name .'.tpl.php' ."<br />\n";
      }
      return $__short_variables && !empty($this->vars) ? $this->parsear_resultado(ob_get_clean())
                           : ob_get_clean();
   }
   /**
    * @param string $all acepta 'all','vars','assigns' , por defecto esta en all para limpiar todas la variables
    * @return plantilla_tuadmin retorna la misma clase para seguir procesando
    */
   public function erase($all = 'all')
   {
      switch($all)
      {
         default : ;
         case 'all' : $this->vars = array();
         case 'assigns' : $this->assigns = array(); break;
         case 'vars' : $this->vars = array(); break;
      }
      return $this;
   }
   protected function parsear_resultado($data)
   {
      $var_referencia = array();
      foreach($this->vars as $key => $value)
      {
         $var_referencia['{'.$key.'}'] = & $this->vars[$key];
      }
      return strtr($data , $var_referencia);
   }
   /**
    * metodo magico que hace que las variables ingresadas a la clase  sean procesadas de $plantilla->VARIABLE = "valor cualquier"
    * como si fuese $plantilla->assign('VARIABLE',"valor cualquier");
    */
   public function __set($var,$value)
   {
      $this->assign($var,$value);
   }
}

Por tuadmin

Claber

598 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 03 Jun 2012 03:15 pm
Muchisimas gracias, lo prueba y si no es molestia te cosulto las dudas.
Gracias!!

Por dyhsoluciones

11 de clabLevel



 

firefox
Citar            
MensajeEscrito el 03 Jun 2012 09:34 pm
Hola, estuve probando la clase y funciona muy bien, pero tengo dos dudas:

La primera, no entiendo que hace este codigo:

Código PHP :

define('DS',DIRECTORY_SEPARATOR);
//ubicacion de nuestras plantillas
$PATH = dirname(__FILE__) . DS . 'mis_plantillas'.DS 'ejemplos';


Como no entendia lo reemplaze por este, pero me gustaria entenderlo:

Código PHP :

    include("Plantilla_tuadmin.php");
    
    //ubicacion de nuestras plantillas
    $PATH = 'mis_plantillas/ejemplos';



Y hay una cosa que no me funciona que es el:

Código PHP :

 <?=strtoupper($var4)?>


Loque deberia pasar es que el valor de la $var4 este en mayusculas verdad? Simplemente no me muestra nada, recuerdo haber leido qeu es porque el servidor no admite la forma abreviada de php, puede ser???


Saludos!!

Por dyhsoluciones

11 de clabLevel



 

firefox
Citar            
MensajeEscrito el 03 Jun 2012 11:31 pm
que raro la mayoria de los servidores tiene por defecto esa opcion habilitada y desde php5.4, biene recomendad, estas trabajando en LOCAL?? o en tu servidor remoto?

Por tuadmin

Claber

598 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 04 Jun 2012 03:16 am
Lo probe en local, y es porque en el php.ini tenia en off lo de php abreviado, asi que ya no hay problema.

La clase funciona muy bien asi que voy a usarla en vez de la otra, muchas gracias.

Lo unico que sigo con el problema, que si pongo rutas relativas las imagenes y demas no se muestran porque la ruta queda incompleta.

Por dyhsoluciones

11 de clabLevel



 

firefox
Citar            
MensajeEscrito el 04 Jun 2012 03:28 am
lo que podrias hacer es crear una CONSTANTE que contenga la ruta del sitio rais

Código PHP :

define('URL_SITIO','http://el_cangrejo_veloz.com/blog');

y en la plantilla

Código PHP :

<h3>mi plnatilla</h3>
<img src="<?=URL_SITIO?>/media/imagenes/etcetera.png" alt="" />

es mejor que manejes url absolutas, lo de las constantes , puedes crearte un archivo aparte, donde solo esten constantes que vayan cambiando segun cada proyecto
yo generalmente la llamo configuracion.php y la incluyo en todos los archivos y al momento de llevarlo del LOCAL al REMOTO solo modifico ese archivo,

Por tuadmin

Claber

598 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 04 Jun 2012 04:00 am
Muchisimas gracias, fuiste de gran ayuda!!!

Por dyhsoluciones

11 de clabLevel



 

firefox
Citar            
MensajeEscrito el 04 Jun 2012 08:30 pm

dyhsoluciones escribió:

Hola, estuve probando la clase y funciona muy bien, pero tengo dos dudas:

La primera, no entiendo que hace este codigo:

Código PHP :

define('DS',DIRECTORY_SEPARATOR);
//ubicacion de nuestras plantillas
$PATH = dirname(__FILE__) . DS . 'mis_plantillas'.DS 'ejemplos';


Como no entendia lo reemplaze por este, pero me gustaria entenderlo:

Código PHP :

    include("Plantilla_tuadmin.php");
    
    //ubicacion de nuestras plantillas
    $PATH = 'mis_plantillas/ejemplos';


lo que hace este codigo

Código PHP :

define('DS',DIRECTORY_SEPARATOR);
//ubicacion de nuestras plantillas
$PATH = dirname(__FILE__) . DS . 'mis_plantillas'.DS 'ejemplos';

es que usa una Constante especial llamada __FILE__, osea escribo la ruta ABSOLUTA del archivo
link de informacion
http://php.net/manual/es/language.constants.predefined.php
y el dirname,retrocede un directorio atras
http://es2.php.net/dirname
desde PHP 5.3 en adelante hay una constante nueva __DIR__ que es equivalente a
__DIR__ = dirname(__FILE__)
-------------------------------------------------------
y por ultimo la constante, DIRECTORY_SEPARATOR; esta constante devuelve el separador de directorios
en WIndows es : \
en linux es :/
en php para poner la barra que usa windows tienes que escaparla
echo "c:\\Windows\\system32"; y bueno a mi me gusta usar el DIRECTORY_SEPARATOR, pero como es algo tedioso escribir todo eso yo creo otra constante mas COrta que la vi en JOOMLA, y me gusto
echo "c:".DS."Windows".DS."system32"
pero desde php 5.2 en adelante es indiferente las barras separadoras,
asi que es valido tambien escribir
echo "c:/Windows/system32";

Por tuadmin

Claber

598 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 05 Jun 2012 01:27 am
Ahora entiendo, muchas gracias!!!

Por dyhsoluciones

11 de clabLevel



 

firefox

 

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