2012-08-07 24 views
5

Así que hice una pregunta similar anteriormente y ahora estoy más confundido, así que lo preguntaré de otra manera ...¿La mejor manera de devolver html desde la función php?

Lo que intento hacer es abstraer mi php y poner los bits de html, usado en mi validador como mensajes de error, en funciones que devuelven el html al lugar donde se necesitan en la página.

Lo que tengo en este momento es:

<section> 
<?php 
if($errMsg) 
{ 
    errMsg(); 
} 
?> 
</section> 

<?php 
function errMsg() 
{ 
     ?> 
     <section> 
      <p>O crap! There was an error</p> 
     </section> 
     <?php 
} 
?> 

Pero en mi pregunta se ha mencionado anteriormente, me dijeron hacerlo de esta manera es un 'truco sucio' y su mejor utilizar retorno en situaciones como esta. Pero para usar el retorno necesitaría asignar todo el html que regresa a una var y para hacerlo necesitaría poner el html en una cadena. Prefiero evitar poner más de dos líneas de html en una cadena debido al dolor en el número de citas necesarias para hacerlo.

Así que estoy pensando que o bien uso la sintaxis heredoc o las funciones ob_start/ob_get_clean. Lo que me gustaría saber es

1 ¿Debo molestarme en abstraer mi código así?
2 De ser así, ¿de qué manera es la mejor forma de hacerlo? Y/O
3 ¿Debería renunciar al desarrollo web y volver a la entrega de pizza? : - \

Respuesta

4

No devolvería ningún HTML. Simplemente devuelva el mensaje de error de la función y luego construya el html en un lugar más apropiado. Por ejemplo, el interior de la plantilla.

4
  1. Sí, definitivamente, no tiene flexibilidad con la forma en que lo está haciendo.
  2. Debería separar todo su HTML de su PHP idealmente, al menos funciones; el único lugar donde es remotamente aceptable es dentro de una vista que usa PHP solo para mostrar la salida de las funciones.
  3. Pizza! Es broma, pero nunca puede haber suficiente pizza?

Tome una mirada en el marco de Zend http://framework.zend.com/manual/en/zend.application.quick-start.html reenvían mensajes de error que no se capturan a un controlador de errores, que a su vez utiliza su propio punto de vista para hacer el error.

O w/o un marco:

try{ 
    //do work here and throw exception on error 
} 
catch (Exception $e) 
{ 
    //do error logging/display error 
    //or preferably load another class which handles your error and produces output 
} 
+0

Por favor, perdona mi noobness, pero cuando dice separar todo mi HTML de mi PHP, ¿quiere decir mantener los diferentes idiomas en diferentes archivos? Como JavaScript discreto? Porque ahora mismo, casi todos mis archivos .php son páginas web con PHP escrito arriba del doctype. –

+0

En la parte superior del archivo está bien, pero no mezclaría HTML con PHP directamente, es decir, usar <<< EOF o cerrar etiquetas de php para agregar HTML es un problema cuando se trata de un rediseño. Piensa para ti mismo cuándo codificas: ¿esto me dificultará la vida a la hora de rediseñar mi sitio web? La respuesta probable dada sus ejemplos es un claro sí ;-) – williamvicary

+0

Gracias por su respuesta. Ahora bien, si mezclar el PHP en el HTML usando las etiquetas de cierre es una mala idea. ¿Cómo generarías algo desde el PHP al HTML? Por ejemplo, si un formulario regresó del servidor con un error, ¿cómo mantendría la entrada del usuario en los campos de entrada sin usar algo como value = ""? –

4

1: Usted no necesita, pero puede hacerlo si se hace correctamente.

2: Para ello, recomiendo que utilice el EOF en su func error de PHP, que se ve así:

function errMsg() 
{ 
     $error = <<<EOF 
<section> 
<p>O crap! There was an error</p> 
</section> 
EOF; 
} 
+3

No se llama EOF, se llama [heredoc] (http://www.php.net/heredoc). – vascowhite

+0

Tiene razón, pero todos entienden con el EOF;) – PoulsQ

+5

Esa es una gran suposición. – vascowhite

2

Se podía hacer esto:

<?php if($errMgs){ ?> 
<section> 
    <p><?php echo errMsg(); ?></p> 
</section> 
<?php } ?> 

general, Hago mi mejor esfuerzo para no repetir el HTML a través de PHP. ¿Por qué? Porque si un diseñador necesita trabajar en mi código, no quiero que se preocupe por qué HTML están escupiendo mis funciones.

2

Mueva el código html a un archivo separado, error.php.Después de eso solo captura la salida:

function errMsg() 
{ 
    ob_start(); 
    include '/path/to/error.php'; 
    return ob_get_clean(); 
} 

// ... 

echo errMsg(); 
2

En primer lugar, estoy de acuerdo con las publicaciones anteriores. No formatee, simplemente haga que la función devuelva el mensaje de error y si necesita formatearlo apropiadamente donde desea mostrarlo.

En segundo lugar, siempre me parece que es útil poder activar y desactivar los mensajes de error y de prueba rápidamente. Como la mayor parte de mi código está orientado objeto y sólo considere conveniente que la aparición de mensajes de un objeto a la vez, normalmente tengo algo como esto en mis clases:

class userObject 
{ 
    public $history;// = historyObject; 
    public $userName; 
    public $userRelation; 
    public $userCode; 
    private $mySQLAccessData; 
    private $isDebug=false; 

    public function makeHistoryObject($KPI, $KPIType) 
    { 
     if($this->isDebug){echo "Having a go at creating ".$this->userName.".<br>";} 
     $this->history = new historyObject($this->userCode, $KPI, $KPIType); 
    } 
} 

me deslizo un elemento private en el que yo dejar como false por defecto. Si necesito depurar o realizar cambios, lo configuro en true y todos mis mensajes de error/registro se muestran nítidamente en la pantalla. Sé que esto no está respondiendo directamente a su pregunta, pero me parece que es así que puede ser útil para usted cuando comience. Sin duda es mejor comentar y luego descomentar potencialmente docenas de mensajes. Puede dejar estas salidas en el objeto sin preocuparse y hacer que muestren todos los detalles que necesita.

0

Si es posible que en algún momento tener el número de errores, a continuación, hacer como esto

<?php 
$errors = array(); 

if (!$item = getItem($id)) { 
    addError("No item $id"); 
} 

if (!updateUser($user, $id)) { 
    addError("Can not update user"); 
} 

if (!updateItemPicture($id, $picture)) { 
    addError("Can not add picture to $id"); 
} 

function addError($error) { 
    global $errors; $errors []= $error; 
} 

function hasErrors() { 
    global $errors; return count($errors); 
} 

function printErrors() { 
    if (!hasErrors()) return; 

    print "<ul class='errors'><li>" . join("</li><li>", $errors) . "</li></ul"; 
} 


printErrors(); 
?> 

Esto es en caso de que no está utilizando manera orientada a objetos. Y suponiendo que todos los errores no son fatales y están atrapados en los bloques try {} catch() {}.

Cuestiones relacionadas