Adesso vogliamo accedere da Ajax, quindi dopo aver inserito il nome e cognome da delle normalissime input text html, a questo metodo e printare il nome e cognome, scriverò
al click del bottone dall'html, per esempio bottone "invia dati" farò una funzione javascript ed un ajax in questo modo :
oppure usando un normale link da browser(ovviamente usando un $_REQUEST nel costruttore) basterà scrivere:
indice?metodo=scriviNomeVariazione&nome=Andrea&cognome=Rossi
Provare a digitare questo url nel browser e provare a cambiare i valori o mettere un metodo=prova&nome=pippo&cognome=topolino:
https://fractalcosmo.com/MVC/indice?metodo=scriviNomeVariazione&nome=Andrea&cognome=Rossi
Oppure inserire dei valori qui, il quale rispecchia l'esempio scritto sopra :
Ovviamente possiamo lavorare con interfacce, in maniera molto ordinata, l'MvcWebLog non è altro che una struttura
ordinata di lavoro a classi in OOP con PHP dove tutto è studiato per gestire al meglio ed in maniera più dinamica e comoda possibile un sito
di gestione dei dati.
Dal link che ho scritto sopra si può provare ad inserire anche la variabile classe, ovviamente la libreria ci avvertirà di un errore,
perchè inserendo la classe ed il metodo vuol dire che il metodo deve appartenere ad un'interfaccia e la classe deve implementare quell'interfaccia,vengono eseguiti tutti i controlli del caso.
Facciamo adesso un esempio con le interfacce, creiamo un file nominato interfacce, lo mettiamo nella cartella model e lo facciamo includere alla struttura dal controller, in questo file inseriremo solamente le interfacce
che vogliamo usare nelle classi, per il momento scriviamo un'ipotetica interfaccia persona, interface persona così definita:
Mentre nel file dove è presente la classe variazioni quindi il file variazioni, sotto la classe variazioni, NB possiamo metterlo in qualsiasi file vogliamo, non cambierebbe nulla,
proprio perchè il controller e il model, insieme, scannerizzano la cartella model quindi non c'è un ordine prestabilito, il controller
include in primis i file che non presentano classi(questo è stato fatto apposta per non appesantire lo scan e i file che non presentano classi sono esclusi dallo scan), quali ad esempio
le funzioni(per ordine è meglio creare un file apposito per le interfacce ma si potrebbero anche inserire in un
file dove sono presenti classi, però è meglio includere subito le interfacce perchè quando il parse scannerizza le classi se l'interfaccia viene inclusa dopo che il parse scannerizza la classe non troverebbe l'interfaccia),
qui rientriamo in un ordine di progetto, e cioè, un file dove metteremo tutte le nostre interfacce e lo facciamo includere al controller, a questo punto vengono inclusi subito i file primari dal controller ed in ultimo viene effettuato
lo scan ed ovviamente la classe può implementare l'interfaccia senza problemi poichè è già stata inclusa, quindi dopo aver incluso questi file il parse scannerizza la cartella model ed include in splAutoLoad tutti i file dove sono presenti classi.
NB il controller scannerizza anche le interfacce, il file interfacce lo facciamo includere dal controller ma non lo escludiamo dallo scan.
Inseriamo quindi sotto la classe variazione queste classi, due delle quali implementano l'interface persona così definite:

Abbiamo creato tre classi, la prima estende la classe variazioni(esempio di prima con nome e cognome) ed abbiamo inserito un metodo, le altre due
classi implementano l'interfaccia persona, ovviamente le classi Student e lavoratore devono implementare i metodi dell'interfaccia altrimenti
PHP andrebbe in errore, se implementassimo l'interfaccia senza inserire i metodi nella classe PHP andrebbe in fatal error, proprio per definizione di interfaccia nella OOP.
Negli screen ci sono due funzioni chiamate definisciCostruttori, questa funzione permette di definire i costruttori sia se la chiamata viene effettuata dal PHP sia se venisse
effettuata da Ajax, i costruttori per il momento sono due e sono "nome" e "cognome", vediamo che ci sono tre metodi oltre che il metodo magico __construct.
Il primo metodo getName printa il nome passandogli i costruttori che vengono ridefiniti nel metodo setName mentre il metodo invoca è quello completo
che setta i costruttori ed invoca la getName per il print.
Adesso la libreria ci permette di accedere a queste classi e questi metodi sia da Ajax che dal Php ma ovviamente possiamo tranquillamente scriverlo tramite url,
è importante sapere che nella libreria sono presenti anche funzioni che permettono di accedere ad un metodo o solo in chiamata POST o solo in GET o solo in AJAX proprio per
avere maggiore sicurezza, ma non faccio qui l'esempio.
Andiamo ad accedere al metodo invoca tramite url sia nella classe Student che lavoratore, esempio per la classe Student:
https://fractalcosmo.com/MVC/indice?metodo=invoca&classe=Student&nome=Andrea&cognome=Rossi
Esempio per la classe lavoratore :
https://fractalcosmo.com/MVC/indice?metodo=invoca&classe=lavoratore&nome=Luca&cognome=Bianchi
Adesso però proviamo a mettere come classe la classe variazioniAggiornate che estende la class variazioni, ovviamente dobbiamo avere un errore
perchè la classe variazioniAggiornate non implementa interfacce ed inoltre il metodo invoca non è presente nella class variazioniAggiornate.
Ed Infatti, ecco cosa ci dice la libreria.
https://fractalcosmo.com/MVC/indice?metodo=invoca&classe=variazioniAggiornate&nome=Luca&cognome=Bianchi
Oppure :
https://fractalcosmo.com/MVC/indice?metodo=invoca&classe=variazioni&nome=Luca&cognome=Bianchi
Oppure chiamiamo il metodo invoca senza però passare la classe :
https://fractalcosmo.com/MVC/indice?metodo=invoca&nome=Luca&cognome=Bianchi
Ecco l'esempio con l'uso delle interfacce accedente da Ajax dopo la compilazione dei dati, come l'esempio sopra a metodo univoco:
Come ho detto nelle righe sopra possiamo accedere da qualsiasi punto di un file del model alla classe lavoratore(passando sempre ovviamente dal controller) anche se non è la prima classe del file,
nota bene se io scrivessi new lavoratore(), l'splAutoloadRegister in automatico include lavoratore ma non lo trova poichè lavoratore è l'ultima classe del file variazioni, di conseguenza
se non avessi creato un metodo che mi permettesse l'istanziamento della classe e l'invocazione di un metodo avrei il limite di una classe per singolo file, ma a noi i limiti non piacciono,
ed adesso da qualsiasi file del model mi basterà scrivere
$arrayCostruttori = array('nome'=>'Ciccio','cognome'=>'Pasticcio');
$controller = new controller();
$controller->invocaMetodo('lavoratore', 'invoca', $arrayCostruttori);
Il parse printerà Nome : Ciccio Cognome : Pasticcio e sei un lavoratore
Proprio grazie all'utilizzo della funzione definisciCostruttori nel metodo magico __contruct, non sto qui a spiegare la logica, accenno solamente che una volta che il parse ha ricavato classe e metodo
ed ha controllato che effettivamente sia tutto nella corretta struttura imposta dall'MVC(cioè in questo caso il metodo "invoca" appartiene ad un'interfaccia e lavoratore implementa l'interfaccia etc..etc..)
istanzia i costruttori usando la newInstanceArgs della reflectionClass e li passa come $array di costruttori alla classe.
Possiamo accedere a questo punto sia da server che da Ajax.
Facciamo un altro esempio ampliando la classe Student, inserendo un array come indirizzo, al costruttore andiamo quindi a passare un array di array a due dimensioni per la chiave
indirizzo contenente via e citta, come nello screen sottostante:

Se volessimo accedere al metodo indirizzoStudent da un qualsiasi file php anche esterno dalla cartella model, basterà includere il controller, ci basterà scrivere, screen sottostante :

Come vediamo dal primo screen nel costruttore impostiamo un definisciCostruttori con la chiave dell'array, in questo caso "indirizzo", all'interno del metodo scriviamo
$this->indirizzo['citta'] e $this->indirizzo['via'], ovviamente questa è solamente una metodologia, mi permetto di dire abbastanza comoda ma nessuno ci impedisce di usare altre metodologie.
Ovviamente come si vede nello screen 2 non passiamo la classe Student perchè il metodo indirizzoStudent è univoco non vi sono altri metodi con lo stesso nome.
Per accedere ad esempio da url cliccare il link sottostante impostando sempre l'array indirizzo via e città:
https://fractalcosmo.com/MVC/indice?metodo=indirizzoStudent&nome=Andrea&cognome=Rossi&indirizzo[citta]=Roma&indirizzo[via]=Tiburtina
Possiamo anche farci ritornare i valori e poi maneggiarli successivamente, si rispettano le piene regole della OOP.
Se invece volessimo accedere al metodo variazioneDatiEstesa, degli screen precedenti che è sempre un metodo univoco, basterà digitare o invocare:
https://fractalcosmo.com/MVC/indice?metodo=variazioneDatiEstesa
Oppure usare il meotodo invocaMetodo senza passare la classe, essendo variazioneDatiEstesa un metodo univoco.
Da questi esempi credo che si noti bene che in questa libreria, composta da 3 file, indice inserito nella root principale del progetto,
controller inserito nella cartella controller del progetto e model inserito nella cartella model del progetto, permette, innanzi tutto,
di avere sott'occhio tutta la struttura della cartella model, di poter lavorare con le classi le interfacce, rispettando le regole di OOP e poter accedere
a metodi delle classi sia da Ajax che dal PHP, completa dinamicità all'interno della cartella model, piena gestione di tutta la cartella model.
Ordine di struttura e debug immediato.
Inoltre vi è un metodo che ci informa su tutta la struttura della cartella model, quante classi ci sono, se ci sono delle classi che implementano delle interfacce,
quali sono i metodi delle classi, se ci sono dei metodi doppi(devono essere solamente i metodi delle interfacce e il metodo magico construct per avere ordine),
se ci sono delle interfacce, quali sono i metodi delle interfacce etc..etc..etc...
È una libreria creata per avere stabilità e pieno controllo su tutto il progetto lavorando in OOP.
Cliccando il link sottostante veniamo informati proprio sulla struttura del model presente in queste pagine di esempio, ovviamente
ci sono anche i metodi usati per gli esempi di w2ui ai quali si può accedere dal menù in alto.
https://fractalcosmo.com/MVC/indice?metodo=debugStruttura
Fin'ora ho parlato di invocazioni a metodi di Classi, utilizzo delle interfacce e struttura della OOP, ma la libreria permette anche di invocare una funzione
definita di un file, in un qualsiasi file, dopo che questo viene incluso in require_once dal controller.
La funzione può essere invocata da Ajax con una semplice composizione di url utilizzando la scrittura:
indice?funzione=nomeFunzione
Ad oggi il parse, ad esempio in queste pagine di esempio, per dirottare la chiamata all'interno di un metodo della cartella model, quindi eseguire lo scan della struttura,
effettuare i controlli etc... impiega, dal mio computer con una normale connessione, circa 60/80 millisecondi, per esempio se dal menù aprite la modale bootstrap,
Esempi W2ui 1.4->Modal W2Grid V1.4.3 ADV-SEARCH-WINDOW WORK e eseguite un autocompletamento dei comuni, cliccate su un record e digitate ad esempio una lettera,
quell'autocompletamento viene dirottato all'interno del metodo "ricercaComune", quindi all'interno di una classe, la classe viewEsempi, come si può ben vedere
è molto veloce, proprio perchè ho inserito una classe myRecursiveFilterIterator, nel controller, dove vado ad escludere quei file che non presentano classi, per velocizzare lo scan,
ripeto che lo scan viene effettuato con la token_get_all di PHP, ovviamente per sapere se abbiamo a che fare con una classe dobbiamo scannerizzare i file della cartella model e recuperare il
token T_CLASS della classe o T_INTERFACE delle interfacce, quindi dato che a noi interessa dirottare dentro un metodo di una classe, non ha senso scannerizzare anche i file
che non presentano classi, questo aumenta di molto le prestazioni, anche se parliamo sempre di millisecondi.
In un progetto dove ad esempio abbiamo tanti file con tante classi potrebbe essere utile eseguire alcune chiamate a delle funzioni piuttosto che a dei metodi, per esempio in un progetto
di grandi dimensioni il parse per dirottare all'interno di un metodo potrebbe impiegare circa 150 millisecondi mentre per dirottare all'interno di una funzione impiegherebbe circa 60/80millisecondi, questo
è logico poichè non deve effettuare i controlli della struttura, ma tramite la funzione di php function_exists, che ritorna le funzioni definite, cerca la funzione e la invoca dinamicamente.
In alcuni casi potrebbe essere più utile, ad esempio per un autocompletamento, invocare una funzione piuttosto che un metodo di una classe, ovviamente sempre in sicurezza di chiamata.
Quindi per esempio nel file funzioni incluso dal controller vado a scrivere questa funzione :
Alla quale si accede da un normalissimo url di chiamata o inserimento dati da input html, con Ajax, come l'esempio sopra :
https://fractalcosmo.com/MVC/indice?funzione=invocazioneScriviNome&nome=Pippo&cognome=Paperopoli
Per qualsiasi info o per i file non esitate a contattarmi.
{screenShot}