Ver Mensaje Individual
  #21 (permalink)  
Antiguo 27/11/2013, 06:03
Avatar de dashtrash
dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años, 1 mes
Puntos: 270
Respuesta: ¿Cómo construir un front-end correctamente?

Cita:
Iniciado por guardarmicorreo Ver Mensaje
Muchas gracias Cuervoo! :) miraré sobre Smarty.

dashtrash ¿qué utilizas si no es MVC?
Pues no es algo que se cuente rápido...Pero, en general, para mí MVC (que es una filosofía no diseñada para web), tiene bastantes problemas.
Como te digo, en mi opinión, las peticiones POST y GET no tienen demasiado que ver las unas con las otras.Procesarlas bajo la misma estructura, es un problema.
Hay conceptos como "página" (una página es más que una "vista"...de hecho, no es una "vista"), enrutado, petición, etc, que son vitales en programación web, que no existen en el paradigma original MVC.Y, como no existen, cada framework implementa a su forma (y, en mi opinión, usualmente bastante discutiblemente).

Pero, lo que sí te puedo decir, es que para una petición GET, la prioridad es la página, y la composición de páginas como vistas.Las vistas obtienen los datos que necesitan sin necesidad de controlador.
Esta última frase puede poner los pelos de punta....Pero el secreto está en el sistema de plantillas.
Esto es código que está en producción:
Con mi sistema de plantillas, defino una página entera así:
Código HTML:
Ver original
  1. [*PAGE]
  2.     [_CONTENT]
  3.         [*/ps_customer/html/forms/EditAction][#]
  4.     [#]
  5. [#]

Eso es una *pagina*, mientras EditAction es una *vista*, ya que está asociada a un objeto, en este caso, ps_customer.
Esa vista se define como:
Código PHP:
Ver original
  1. <?php
  2.             global $SERIALIZERS;
  3.             $formKeys=array("id_customer"=>Registry::$registry["params"]["id_customer"]);;
  4.             $serializer=\lib\storage\StorageFactory::getSerializerByName('backoffice');
  5.             $serializer->useDataSpace($SERIALIZERS["backoffice"]["ADDRESS"]["database"]["NAME"]);
  6. ?>
  7.  
  8.  
  9.                 [*/FORMS/form({"object":"ps_customer","layer":"backoffice","name":"EditAction","form":"&$form"})]        
  10.                 [_TITLE]EditAction ps_customer[#]
  11.                 [_DESCRIPTION]Form Description[#]
  12.                 [_MODEL({"keys":"$formKeys","serializer":"$serializer","model":"&$currentModel"})][#]                          
  13.                 [_FORMGROUP]
  14.                         [_TITLE]Form Group Title[#]
  15.                         [_DESCRIPTION]Form Group Description[#]
  16.                         [_FORMERRORS]
  17.  
  18.                         [#]
  19.                         [_FIELDS]
  20.  
  21.  
  22.                 [*/FORMS/inputContainer({"name":"date_add"})]
  23.                     [_LABEL]date_add[#]
  24.                     [_HELP]**Insert Field Help**[#]
  25.                     [_INPUT]
  26.                         [*:/types/inputs/DateTime({"model":"$currentModel","name":"date_add","form":"$form"})][#]
  27.                     [#]
  28.                     [_ERRORS]
  29.                         [_ERROR({"type":"INVALID","code":"2"})][@L]ps_customer__date_add_INVALID[#][#]
  30.                         [_ERROR({"type":"UNSET","code":"1"})][@L]ps_customer__date_add_UNSET[#][#]
  31.                     [#]
  32.                 [#]
  33.  
  34.  
  35.                 [*/FORMS/inputContainer({"name":"optin"})]
  36.                     [_LABEL]optin[#]
  37.                     [_HELP]**Insert Field Help**[#]
  38.                     [_INPUT]
  39.                         [*:/types/inputs/Integer({"model":"$currentModel","name":"optin","form":"$form"})][#]
  40.                     [#]
  41.                     [_ERRORS]
  42.                         [_ERROR({"type":"INVALID","code":"2"})][@L]ps_customer__optin_INVALID[#][#]
  43.                         [_ERROR({"type":"UNSET","code":"1"})][@L]ps_customer__optin_UNSET[#][#]
  44.                     [#]
  45.                 [#]
  46.  
  47.  
  48.                 [*/FORMS/inputContainer({"name":"id_gender"})]
  49.                     [_LABEL]id_gender[#]
  50.                     [_HELP]**Insert Field Help**[#]
  51.                     [_INPUT]
  52.                         [*:/types/inputs/Integer({"model":"$currentModel","name":"id_gender","form":"$form"})][#]
  53.                     [#]
  54.                     [_ERRORS]
  55.                         [_ERROR({"type":"INVALID","code":"2"})][@L]ps_customer__id_gender_INVALID[#][#]
  56.                         [_ERROR({"type":"UNSET","code":"1"})][@L]ps_customer__id_gender_UNSET[#][#]
  57.                     [#]
  58.                 [#]
  59.        .......
Y esa plantilla a su vez usa otras plantillas que usan otras plantillas...Y sólo las de ultimo nivel contienen HTML.
Cosas como listar elementos se hacen asi:
Código PHP:
Ver original
  1. <?php
  2.             global $SERIALIZERS;
  3.             $params=Registry::$registry["PAGE"];
  4.             $serializer=\lib\storage\StorageFactory::getSerializerByName('backoffice');
  5.             $serializer->useDataSpace($SERIALIZERS["backoffice"]["ADDRESS"]["database"]["NAME"]);
  6. ?>
  7.  
  8.  
  9.  
  10. [*LIST_DS({"currentPage":"$currentPage","object":"ps_customer","dsName":"FullListDs","serializer":"$serializer","params":"$params","iterator":"&$iterator"})]
  11.                 [_HEADER]
  12.                     [_TITLE]Titulo de la lista[#]
  13.                     [_DESCRIPTION]Descripcion de la lista[#]
  14.                 [#]
  15.                 [_LISTING]
  16.                     [_COLUMNHEADERS]
  17.                         [_COLUMN][_LABEL]date_add[#][#]
  18.                         [_COLUMN][_LABEL]optin[#][#]
  19.                         [_COLUMN][_LABEL]id_gender[#][#]
  20.                         [_COLUMN][_LABEL]id_default_group[#][#]
  21.                         [_COLUMN][_LABEL]firstname[#][#]
  22.                         [_COLUMN][_LABEL]id_customer[#][#]
  23.                         [_COLUMN][_LABEL]date_upd[#][#]
  24.                         [_COLUMN][_LABEL]lastname[#][#]
  25.                         [_COLUMN][_LABEL]ip_registration_newsletter[#][#]
  26.                         [_COLUMN][_LABEL]newsletter_date_add[#][#]
  27.                         [_COLUMN][_LABEL]note[#][#]
  28.                         [_COLUMN][_LABEL]deleted[#][#]
  29.                         [_COLUMN][_LABEL]birthday[#][#]
  30.                         [_COLUMN][_LABEL]passwd[#][#]
  31.                         [_COLUMN][_LABEL]secure_key[#][#]
  32.                         [_COLUMN][_LABEL]active[#][#]
  33.                         [_COLUMN][_LABEL]is_guest[#][#]
  34.                         [_COLUMN][_LABEL]newsletter[#][#]
  35.                         [_COLUMN][_LABEL]email[#][#]
  36.        
  37.                     [#]
  38.                     [_ROWS]
  39.                         [_ROW][_VALUE][*:/types/DateTime({"name":"date_add","model":"$iterator"})][#][#][#]
  40.                         [_ROW][_VALUE][*:/types/Integer({"name":"optin","model":"$iterator"})][#][#][#]
  41.                         [_ROW][_VALUE][*:/types/Integer({"name":"id_gender","model":"$iterator"})][#][#][#]
  42.                         [_ROW][_VALUE][*:/types/Integer({"name":"id_default_group","model":"$iterator"})][#][#][#]
  43.                         [_ROW][_VALUE][*:/types/String({"name":"firstname","model":"$iterator"})][#][#][#]
  44.                         [_ROW][_VALUE][*:/types/AutoIncrement({"name":"id_customer","model":"$iterator"})][#][#][#]
  45.                         [_ROW][_VALUE][*:/types/DateTime({"name":"date_upd","model":"$iterator"})][#][#][#]
  46.                         [_ROW][_VALUE][*:/types/String({"name":"lastname","model":"$iterator"})][#][#][#]
  47.                         [_ROW][_VALUE][*:/types/String({"name":"ip_registration_newsletter","model":"$iterator"})][#][#][#]
  48.                         [_ROW][_VALUE][*:/types/DateTime({"name":"newsletter_date_add","model":"$iterator"})][#][#][#]
  49.                         [_ROW][_VALUE][*:/types/Text({"name":"note","model":"$iterator"})][#][#][#]
  50.                         [_ROW][_VALUE][*:/types/Integer({"name":"deleted","model":"$iterator"})][#][#][#]
  51.                         [_ROW][_VALUE][*:/types/DateTime({"name":"birthday","model":"$iterator"})][#][#][#]
  52.                         [_ROW][_VALUE][*:/types/String({"name":"passwd","model":"$iterator"})][#][#][#]
  53.                         [_ROW][_VALUE][*:/types/String({"name":"secure_key","model":"$iterator"})][#][#][#]
  54.                         [_ROW][_VALUE][*:/types/Integer({"name":"active","model":"$iterator"})][#][#][#]
  55.                         [_ROW][_VALUE][*:/types/Integer({"name":"is_guest","model":"$iterator"})][#][#][#]
  56.                         [_ROW][_VALUE][*:/types/Integer({"name":"newsletter","model":"$iterator"})][#][#][#]
  57.                         [_ROW][_VALUE][*:/types/String({"name":"email","model":"$iterator"})][#][#][#]
  58.  
  59.                     [#]
  60.                     [_LISTINGFOOTER]
  61.                     [#]
  62.                 [#]    
  63.            [#]

En la línea:
Código HTML:
Ver original
  1. [*LIST_DS({"currentPage":"$currentPage","object":"ps_customer","dsName":"FullListDs","serializer":"$serializer","params":"$params","iterator":"&$iterator"})]
Le estoy diciendo que para dibujar ese listado, quiero usar la fuente de datos "FullListDs" del objeto "ps_customer", parametrizada por "$params".
Eso es lo que MVC "estándar" haría en el controlador.*instanciar* esa fuente de datos.Lógicamente, la composición de la query, chequeo de parámetros, etc,etc, no se hace en la plantilla.Existen clases que hacen eso, y que son invocadas por plantillas de más bajo nivel.
A mí no me molesta en absoluto que la instanciación de la fuente de datos (repito, instanciación, no "implementación") esté en mi plantilla, ya que es lo suficientemente clara (una vez que la entiendes) como para cambiarla en cualquier momento (incluso desde un editor).

Leyendo esa plantilla, sabes qué quiere hacer.Claramente, es un listado, con unas cabeceras, y unas rows.Si te pusiera el equivalente en html con smarty, no verías nada.

Para terminar, esas plantillas son código generado...como te digo, no es para nada MVC.Para mí, resolver GET se hace desde las plantillas, ya que con este tipo de plantillas, basado en capas, me es *muy* sencillo y claro hacerlo todo desde ellas.