2010-09-14 18 views
9

Obtengo datos de Model (una matriz con datos) y necesito mostrarlos con un formato específico. Necesito iterar sobre la matriz, formatear los datos y luego mostrarlos. ¿Dónde debo formatear los datos para mostrar? En el modelo, controlador o vista? Gracias.MVC: ¿Dónde debo formatear los datos?

+0

Como quieras. Pero más mejor en el controlador. – pltvs

+0

@ Alexander no es responsabilidad del controlador. – Gordon

+1

@ Lo estoy haciendo en el controlador ... – jared

Respuesta

5

Iteración sobre una matriz y visualización de los datos se realiza en la vista. Por lo tanto, también haría el formateo en la vista. Si el formateo es complicado y/o requiere mucho código, colóquelo en una función de ayuda.

Por ejemplo:

Vista:

<?php foreach($array as $item): ?> 
    <p><?php echo format_function($item); ?></p> 
<?php endforeach; ?> 

Ayudante:

function format_function($text) 
{ 
    // Do some formatting here... 
    return $formatted_text; 
} 
+0

La función de ayudante suena bien :) – jared

+4

NO contamine su vista con tanta basura. La vista no es responsable del formateo. Intenta usar una capa separada que sea responsable de formatear/transformar tu modelo de objetos en un modelo de vista amigable :) Como dijo Stefanvds en .NET, existe un mapeador objeto a objeto llamado AutoMapper, tal vez haya un equivalente en php. – Rookian

+0

No estoy de acuerdo. Cada framework MVC que conozco tiene soporte listo para usar para esto. Si no fuera por casos como este, ¿para qué debería usar ayudantes? Su solución puede ser más "pura", pero en este caso simple siento que agregar otra capa es exagerar. – Mischa

2

si su viewdata tiene datos de diferentes modelos, o tiene sólo una parte seleccionada de 1 modelo, usted podría crea un ViewModel, que luego puedes asignar con Automapper.

ViewModels tiene varias ventajas. Son claras para trabajar con, el desorden de sus datos, puede agregar seguridad, ...

+0

cualquier enlace con detalles a ese patrón? – Gordon

+0

@Gordon: http://en.wikipedia.org/wiki/View_model? – fabrik

+0

@fabrik Para otros usos, vea [Ver modelo (desambiguación)] (http://en.wikipedia.org/wiki/View_model_%28disambiguation%29). Nunca está de más tener un enlace al hacer referencia a un patrón. – Gordon

2

Puede hacerlo en View.Not en el modelo En vista que usted puede hacer la operación específica (conversión/condiciones /)

2

Si está trabajando en un proyecto más grande, le sugiero que tenga una capa o clase adicional que es responsable de transformar su objeto (es decir, el objeto del modelo de dominio) en un objeto de transferencia de datos (ver el objeto modelo).

De lo contrario se aplican las sugerencias de hacer el formato en la vista :)

El transformador podrían estar involucrados con las cadenas de formato, decimales (divisas), datetimes y así sucesivamente. También es posible transformar un gráfico de objetos (mire mi ejemplo) en un DTO plano.

El controlador sería responsable de llamar al algoritmo de asignación.

Por lo tanto, en la vista no tiene que iterar sobre las referencias de su objeto. En su lugar, utiliza un modelo de vista con formato plano.

Su vista no se amontonará y se ve muy limpia.

Una herramienta que hace este trabajo de transformación está disponible en el mundo .NET. Se llama AutoMapper. Tal vez haya un equivalente en PHP.

Aquí es un ejemplo

Este es un modelo de objetos: alt text

Se podría transformarlo en este punto de vista inteligente modelo:

alt text

Las ventajas de este acercamiento:

  • separación de las preocupaciones

  • Limpiar Ver

  • No hay duplicaciones de códigos, es decir, el formateo de una fecha y hora en cada vista. (No te repitas!)

Las desventajas de este enfoque:

  • caro para el inicio, por lo que pequeños proyectos no se benefician de este enfoque
1

Do en su Vista ya que es responsable de la presentación.

La razón de

  • no hacerlo del modelo es que él puede procesar diferentes puntos de vista utilizando los mismos datos (si no es necesario crear un conjunto diferente de datos),
  • no hacerlo en el controlador es porque no es responsabilidad del controlador

Ver MVC background reading

2

Presentación! = formato de datos. Tenga en cuenta el siguiente ejemplo:

Una tienda internacional con una página de producto, con diversa información sobre las dimensiones del producto, etcétera. Debido a la naturaleza internacional de la tienda, estos datos deben formatearse de forma diferente para cada localidad donde se visita la tienda. Por ejemplo: en Europa, las mediciones se muestran como valores métricos, mientras que los clientes de EE. UU. Ven los mismos datos formateados como valores imperiales.

Una nota importante es que este tipo particular de datos no se debe almacenar varias veces para cada formato, aunque los datos relativos a los precios, por ejemplo, deberían. Esto se debe al hecho de que los precios del producto do difieren según el lugar. Las mediciones y fechas, por otro lado, son universalmente iguales en diferentes lugares; solo la forma en que se muestran y formatean difiere. La información siempre debe almacenarse con la menor redundancia posible.

La parte de la vista de una tienda de este tipo (o cualquier aplicación basada en MVC, para el caso) no debe hacer nada más que representar los datos y determinar cómo se presentan estos datos al usuario. La vista no debe modificar los datos en modo alguno.Esta es exactamente la razón por la cual la información con respecto a las mediciones y el tiempo debe almacenarse en un formato estandarizado ISO , lo que facilita el formateo de los datos en otros formatos. Las mediciones se deben almacenar como valores métricos, por ejemplo. El formato real de los datos por localidad debe tener lugar en el modelo una vez que el conjunto de datos se recupera de la base de datos, preferiblemente con una clase de tipo Helper estáticamente accesible para la mayor flexibilidad. Después de formatear los datos, se devuelve al controlador que luego lo devuelve a la vista actual.

Otra ventaja importante de esta forma de manejar el formato de datos es que sus datos estarán correctamente formateados cuando intente obtener el conjunto de datos mediante una acción sin vista (es decir, un objeto JSON recuperado mediante AJAX). Los datos que se envían al cliente de cualquier manera (a través de una plantilla HTML "normal" o como una cadena JSON/XML) no deberían diferir; solo la forma en que se presenta .

+0

de acuerdo. El SoC tiene que ver con la responsabilidad, y normalmente en una arquitectura de presentación con una vista pasiva (como la variación de MVP, MVVM, MVPVM, etc.), la responsabilidad del formato/preparación de datos no es responsabilidad de la vista. Sería el presentador/modelo de vista, y en el caso de ASP.Net MVC más "MVP-style" por ejemplo, el controlador mejor aún, una vm). La pasividad aumenta la prueba/reutilización, mantiene la lógica del negocio fuera de la presentación. Y el último para hizo un gran punto en el que no había pensado, lo que también significa que "formateado" no tiene que formatearse para su visualización. – user1172173

Cuestiones relacionadas