MVC: Com ho fem per...?¶
Es tracta d'usar el MVC per a generar aplicacions web basades en el MVC de backend
Modificar la plantilla¶
La plantilla és el document Layout.html. Es troba a dins de la carpeta \Vendors\me
Aquesta plantilla conté 3 parts
-
CAPÇALERA -> HEAD {{ TITOL}} {{ DESCRIPCIO }}
-
BODY -> COS
-
PEU -> FOOTER
El fitxer d’estils està a la carpeta \styles
La CAPÇALERA correspondrà a:
- Portada de MVC i tindrà el format indicat al fitxer style.css
- Ve marcat per les etiquetes
- Modificarà els camps {{}} pels valors
- {{ TITOL }} -> el valor indicat a define('TITOL',...) del fitxer funcionsinicials.php a dins de \config
- {{ DESCRIPCIO }} -> el valor indicat a define(‘DESCRIPCIO',...) del fitxer funcionsinicials.php a dins de \config
- A dins de cada controlador de cada bundle creat es podrà modificar aquest valor inicial, si s’escau
$this->head = array("title"=>"títol bundle","description"=>"desc");
- A dins de cada vista del controlador es pot ampliar la Capçalera amb l’etiqueta
El COS correspondrà a:
- Portada de MVC. Usa el fitxer index.html que està \bundle
- Les vistes de cada una de les interfícies de cada bundle. La ubicació serà \bundle\xxxxx
- Addicionalment a cada interfície de cada bundle podeu posar les etiquetes
<HEADER>
-> Per ampliar la capçalera<FOOTER>
-> Per ampliar el peu
- Addicionalment a cada interfície de cada bundle podeu posar les etiquetes
El PEU correspon a:
- Portada de MVC i tindrà l format indicat al fitxer style.css
- Ve marcat per les etiquetes
- A dins de cada vista del controlador es pot ampliar la Capçalera amb l’etiqueta
Modificar els estils¶
Els estils estan el fitxer style.css de la carpeta \style
Hi ha definits els estils per a:
<BODY>
<H1>
<H2>
<FOOTER>
<HEADER>
<NAV>
<INOUT> i <TEXTAREA>
Podeu modificar aquest fitxer al vostre gust
Podeu incorporar altres conceptes d’estils al model perfectament, cal modificar
define('ESTILS', "styles/style.css");
Crear un nou Bundle¶
Per crear un nou bundle xxxx (on xxx és el nom del bundle, per exemple, llibres)
- Crear una carpeta xxxx
- Podeu copiar l’estructura de carpetes a partir de l’arxiu bundle-base.rar del Drive
- Controllers -> lògica
- models -> dades
- templates -> vistes
- Primer cal crear la classe que autocarregarà a Controllers
- xxxxController
- la funció public function process($params), rebrà els paràmetres que haurà carregat de la ruta
- on $params[0] és l’acció i $params[1] és un valor
- Per exemple http://localhost/cotxes/veure/12
- A dins trobem 3 línies mínim, amb codi per exemple
$this->data = array("nom"=>"El Hobbit");
$this->twig = "index.html";
$this->head = array("title"=>"Títol bundle","description"=>"desc");
- Podem no posar $this->head(); i no ens modificarà la capçalera
- o modificar només la descripció.
- Llavors cal crear la vista a la carpeta de \templates
- Per exemple l’arxiu index,html que hem indicat a $this->twig
- Aquest fitxer tindrà tot el HTML i javascript que ens calgui per generar la interfície
- Podem aplicar el
- Podem passar-li dades que volguem incloure-he
- per exemple nom del llibre ‘“El Hobbit”
- $this->data = array("nom"=>"El Hobbit");
- Només cal posar l’etiqueta de TWIG {{ nom }}, que és el diccionari de dades que el render de la vista haurà associat automàticament
- Podem passar tantes dades amb arrays associatius com vulguem.
Com el fem actuar?¶
-
Per URL: simplement /xxxx, on xxxx és el nom del bundle
- http://localhost/Cotxes
- sempre que estigui configurada l’arrel del MVC com a /
Nota
Compte amb el nom del bundle i si el servidor és linux o Windows.
- El Sistema de Fitxers del Windows no diferencia entre majúscules i minúscules al nom de les carpetes. - El Sistema de Fitxers de Linux si diferencia entre majúscules i minúscules al nom de les carpetes.
Per tant, quan intenten obrir el controlador associat al bundle, executa aquest codi a l'arxiu '/vendors/me/RouterController.php' a la línia 91.:
<?php if (file_exists('bundle/' . str_replace("Controller", "", $controllerClass) .'/controllers/' . $controllerClass . '.php')) { $this->controller = new $controllerClass; } else { //$this->redirect(ERRDEFAULT); $this->renderView("ERROR"); exit; } ?>
Podeu modificar o adaptar el codi per evitar aquest fet.
-
Per enllaç a la plantilla base o bé interfície de layout
-
El controlador farà actuar el sistema de manera s’executin les instruccions associades a l’acció què volem fer. L’arquitectura recuperarà els valors de la URL:
- http://domini/bundle/acció/paràmetre
- la funció public function process($params), rebrà els paràmetres que haurà carregat de la ruta
- on $params[0] és l’acció i $params[1] és un valor
- A dins de la funció process hem de dissenyar la nostra lògica d’acció
public function process($params) { if (isset($params[0]) && $params[0] == "nou") // nou { $this->twig = “nou.html”; } else if (isset($params[0]) && $params[0] == "veure") // veure { $id = $params[1]; $dades = $modeldedades->Obtenir($id); //simulació d’obtenir $this->data = $dades; $this->twig = “veure.html”; } else //index { $this->twig = “index.html”; } }
-
Si com a lògica del codi del controller voleu redirigir a una altra acció o bundle podeu usar la funció redirect($URL);
- $this->redirect($URL);
Com recuperar dades amb javascript del Twig?¶
Les dades es passen a la vista i el twig ens permet recuperar-les tant si és un sol valor com un array
Us poso un exemple de com omplir un array de javascript generat al php del controlador
$dades = array("nom"=>"Judit", "matricula"=>array("MP7"=>"PHP","MP9"=>"Interfícies"));
$this->data = $dades;
$this->twig = "index.html";
i a la vista
<header>
INDEX JS
</header>
Dades1:
<script>
var mats = [];
{% for key,value in matricula %}
mats["{{key}}"] = "{{value}}";
{% endfor %}
console.log(mats);
</script>
Com redirigir automàticament a un altre bundle?¶
A dins del Controller.php, tenim la funció
/*
* @param string $url Redirects to a given URL
*/
public function redirect($url)
{
header("Location: ".WEBROOT."$url");
header("Connection: close");
exit;
}
i a dins del bundle/controller/xxxcontroller.php, escriure
$this->redirect(“/components”);
Això farà que es redirigeixi a http://localhost/MVC/components
Si el WEBROOT és http://localhost/MVC
Nota
Això és útil, per exemple si hem executat alguna acció a dins dins d'un bundle que ha modificat el model de dades i volem anar directament a un altre ruta.
Com fer la pàgina inicial del projecte sigui la inicial d’un Bundle¶
A dins del 'RouterController.php', tenim la funció 'process()'
//$this->redirect(PGDEFAULT);
Descomenteu aquesta línia i aneu a configurar el PGDEFAULT a dins de funcionainicial.php Poseu el nom del bundle/acció que volgueu
define('PGDEFAULT', "Cotxes");
I tot seguit comenteu el codi inferior que ja no s’executarà
Com usar un model de dades d’un altre bundle?¶
De manera automàtica es carreguen totes les classes dels models de dades, per tant només caldrà fer a dins d’un controlador la declaració de l’objecte que volem.
Per exemple estem al controlador de Cotxes i tenim de manera intrínseca el model de cotxes.php, però podem accedir a un altre motos.php
class CotxesController() extends Controller
{
…
public function process($params)
{
…
$cotxes = new Cotxes();
// també podem accedir a una altra classe
$motos = new Motos();
// ara tindrem accés a tots els mètodes d’aquest objecte
...
}
}