Retornar código HTML como template con PHP sin frameworks – php

Pregunta:


Tengo un template llamado view1.php en un folder que se llama views y que tiene esto dentro

<?php
session_start();
<h1>Hola <?php echo $_SESSION['NOMBRE']; ?></h1>
?>

Estoy intentado llamarlo desde otro PHP que funge como mi controlador

$folder   = strtolower( $_REQUEST['parent'] );
$view     = strtolower( $_REQUEST['view'] );
$route    = '../views/' . $folder . '/' . $view . '.php';
$template = file_get_contents( $route );
var_dump( $template );

Y literalmente me está trayendo una cadena

string(95) "<?php

session_start();
<h1>Hola <?php echo $_SESSION['NOMBRE']; ?></h1>

 ?>
"

Yo esperaba un retorno así

<h1>Hola Alberto</h1>

No quiero meter todo en un string y luego hacerle un echo, me gustaría codificar en HTML, algunas partes en PHP dependiendo de lo que necesite hacer y todo ese conjunto retornarlo como un template.
Reitero, lo estoy haciendo nativo, sin frameworks

Preguntado por: Alberto Siurob

Sacha

EDICION: Cambie los ejemplos por unos mas generales con una funcion para renderizar templates

La funcion file_get_contents lo unico que hara sera leer los caracteres del archivo y meterlos en una variable. Si lo que queres es almacenar el output de ese archivo en una variable lo que necesitas es lo siguiente:
– primero encender el output buffering con la funcion ob_start que hara que todo el output se quede en el buffer en lugar de ir al stdout.
– luego ejecutar el archivo usando la funcion include o require.
– y finalmente pedir el resultado del buffer con la fucnion ob_get_clean, la cual limpia el buffer de output y retorna el contenido que tenia como resultado.

NOTA: Usar templates de esta manera es efectivo, pero quizas no sea la mejor idea, podes tratar de definirte algun wrapper que decida que variables enviarle al archivo y que variables no, para que sea un poco mas seguro y desacoplado.
Propongo usar una funcion de este estilo:

<?php

function render_view( $view_name, &$view_vars=null){

    if( $view_vars == null ){
        include $_SERVER["DOCUMENT_ROOT"]."/views/$view_name";
        return;
    }

    $keys = array_keys($view_vars);
    $key_count = count($keys);

    for($i = 0; $i<$key_count;$i++){
        ${$keys[$i]} = $view_vars[$keys[$i]];
    }

    ob_start();

    include $_SERVER["DOCUMENT_ROOT"]."/views/$view_name";

    return ob_get_clean();
}

?>

De modo que tu view terminaria viendose asi:

<h1>Hola <?= $NOMBRE ?> ></h1>

Y tu controlador asi:

<?php

    require "render_view.php";

    $folder   = strtolower( $_REQUEST['parent'] );
    $view     = strtolower( $_REQUEST['view'] );
    $route    = $folder . '/' . $view . '.php';

    session_start();

    $view_vars = array(
        "NOMBRE" => $_SESSION["NOMBRE"]
    )

    $tempalte = render_view( $route , $view_vars );

    echo $template;
?>

Fuente

Tags:

Add a Comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *