Crea sito

Tutorial – Un Blog in php: Parte 5

Ciao a tutti, benvenuti alla quinta parte del tutorial su come creare un blog in php, utilizzando il framework php-easyMVC e il pattern di programmazione MVC.

La volta scorsa avevamo lavorato su una prima “vista” del nostro blog, abbiamo riorganizzato i dati preparati dal nostro modello e ricevuti attraverso il nostro controller, e con questi dati abbiamo realizzato una lista dei post presenti sul nostro database.

Scopo del tutorial di oggi sarà visualizzare il contenuto del post in una pagina ad hoc, che più avanti fornirà anche un form per postare i commenti al post.

Iniziamo!

Per prima cosa, dovendo visualizzare, il post in una nuova pagina, dovremmo creare un nuovo controller per questa pagina, per tanto creiamo un nuovo file nel nostro webserver nella directory del nostro blog e nella subdirectory: “controller”, chiamiamolo ad esempio postController.php, onde evitare problemi vari assicuriamoci di assegnare a questo file tutti i permessi possibili:

chmod 777 postController.php

a questo punto apriamo il nuovo file con il nostro editor preferito e iniziamo a impostarne la struttura, in questo modo:

<?php

class postController extends baseController{

public function index(){
/* TODO: Il nostro codice va qua... */
}

}

?>

cosa abbiamo fatto? beh niente di particolare, secondo le specifiche del framework ogni nuovo controller, nel nostro caso postController, deve estendere baseController, e implementare ALMENO il metodo index, che è quel metodo che viene chiamato di default, se nell’url non viene specificata nessuna action.

Bene, abbiamo un nuovo controller, ma dovendo visualizzare una nuova pagina ci servirà anche una nuova vista, creiamo dunque un nuovo file nella directory del nostro blog, e, questa volta, nella subdirectory “views” che chiameremo: posts.php, anche qua ricordatevi i permessi:

chmod 777 posts.php

giusto per vedere se funziona tutto, mettiamo dentro al file un po’ di html:

<!-- This is the default home page -->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<link rel="stylesheet" href="styles/main.css" type="text/css" />
<title>myBlog - Post Viewer</title>
</head>
<body>
<h1>Qua' si dovrebbe vedere il post...</h1>
</body>
</html>

Bene, stiamo solamente preparando il tutto per collegare le due pagine, ora dobbiamo dire al metodo index del postController, che abbiamo appena creato di mostrarci questa vista, per cui modifichiamo il metodo index in modo che appaia così:

public function index(){
/* Show the view */
$this->registry->template->show('posts');
}

direi niente da dire fino a questo punto, abbiamo semplicemente chiesto al metodo index di visualizzare la vista denominata “posts”, attraverso un istanza della classe template che si trova all’interno del registry del framework, esattamente come abbiamo fatto nelle prime parti del tutorial!

Proviamo il tutto! aprite il browser e puntatelo verso il vostro blog, richiedendo però al router del framework di eseguire il controller “postController” utilizzando un indirizzo simile a questo:

http://localhost/myblog/index.php?rt=post

il risultato dovrebbe essere una pagina di questo tipo:

Vista del Post

Visualizzare il post

Benissimo! Ora non ci resta che visualizzare il post in questa schermata! Come fare?

Il concetto sarà quello di comunicare l’ID del post da visualizzare al postController, il quale richiederà al modello, utilizzando il metodo “get_post_by_id()” che andremo ad implementare, tutti i dati relativi al post e li passerà alla vista che ce li mostrerà,

Quindi primo problema, come passiamo l’ID del post al nuovo controller?

Una delle possibili soluzioni è di passarlo tramite $_GET, ovvero attraverso l’URL della pagina quando clicchiamo sul link leggi, che abbiamo preparato nel tutorial scorso, vediamo come fare…

Apriamo la vista dell’index: views/index.php, dove abbiamo stampato l’elenco dei post presenti nel database…

Individuiamo la print, nella quale stampiamo il link “leggi”:

/* link per la lettura del post */
print(" - <a href=\"#\">Leggi...</a>");

come vedete, al momento href è settato a “#”, perchè ovviamente il link non punta ancora a niente, modifichiamolo per puntare alla pagina che abbiamo appena creato, e specifichiamo l’id del post da visualizzare, aggiungendo una variabile post_id nell’URL, che andremo a recuperare tramite $_GET in questo modo:

/* link per la lettura del post */

print(" - <a href=\"index.php?rt=post&post_id=".$posts[$i]["post_id"]."\">Leggi...</a>");

salviamo il file, e puntiamo nuovamente il browser sul nostro blog, alla pagina iniziale: http://localhost/myblog/

ora, cliccando su uno qualsiasi dei pulsanti “leggi” nella nostra lista, ci sposteremo nella nuova pagina appena creata, notate però che l’URL della pagina sarà qualcosa del tipo: http://localhost/myblog/index.php?rt=post&post_id=1

con al posto dell’1, l’id del post su cui avete cliccato.

Bene! Ora dobbiamo recuperare il post_id da $_GET nel postController, e recuperare i dati che ci servono da mostrare nella vista, per cui aprite il file postController.php e modificate il metodo index() come segue:

public function index(){

/* Recupero l'id del post da mostrare da $_GET */
$post_id = $_GET['post_id'];

/* Se non è stato passato alcun id al controller ritorno alla pagina principale */
if(!isset($post_id) || $post_id == ""){
header("Location:index.php");
exit;
}

/* Creo un istanza del modello blog, per poter utilizzare i suoi metodi */
$blog = new Blog($this->registry->db);
$post_data = $blog->get_post_by_id($post_id);

/* Se non ho trovato nessun post con l'id specificato torno alla pagina principale */
if($post_data == NULL){
header("Location:index.php");
exit;
}

/* Preparo i risultati della query da passare alla vista */
$this->registry->template->post = $post_data;

/* Show the view */
$this->registry->template->show('posts');
}

Come si può facilmente evincere dal codice, non facciamo nient’altro che  recuperare l’ID del post dall’URL, se l’ID non è presente, reindirizziamo automaticamente alla home page, dopo di che istanziamo il nostro modello, e chiediamo di recuperare tutti i dati relativi al post, dati che poi salviamo in una variabile visibile dalla vista, e mostriamo la vista…

Quello che ci manca a questo punto è semplicemente di implementare il metodo get_post_by_id nel modello e di visualizzare tutti i dati recuperati,

per cui apriamo il nostro modello: models/blog.class.php e modifichiamo il metodo get_post_by_id() come segue:

/* Ritorna l'intero post (tutti i dati) corrispondente all'ID assegnato */
public function get_post_by_id($post_id){
/* Questo conterrà i dati da restituire */
$data = NULL;
/* Apro una connessione col dbms usando le API fornite dal framework: *
* Potete trovare le specifiche di queste funzioni nel file              *
* models/db.class.php                                                  */
$this->dbms->connect();
$query = "SELECT * FROM posts WHERE post_id = ".$post_id.";";
$this->dbms->prepare($query);
if($this->dbms->query()){
/* Se non ho trovato nessun post con l'ID specificato devo ritornare NULL, quindi non entro in questo if */
if($this->dbms->numrows() != 0){
$data = $this->dbms->fetch("array");
}
}
$this->dbms->disconnect();
return $data;

}

Come vedete, si tratta di eseguire una select * sul database, e restituire il risultato della query, notate come, in mancanza di risultati con l’id specificato il metodo ritorni NULL!

Bene, a questo punto abbiamo tutto ciò che ci serve, si tratta, di modificare la vista in modo da mostrare il post appena prelevato dal db!!!

Apriamo la nostra vista, e, come nella lezione scorsa, si tratterà di embeddare un po’ di php nella vista, come segue:

<!-- This is the default home page -->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<link rel="stylesheet" href="styles/main.css" type="text/css" />
<title>myBlog - Post Viewer</title>
</head>
<body>
<h1><?php print($post["title"]); ?></h1>
<h4>(Scritto da: <?php print($post["author"]); ?>, il giorno: <?php print($post["post_date"]); ?>) </h4>
<br/><hr/>
<p>
<?php print($post["content"]); ?>
</p>
</body>
</html>

Ed ecco il risultato finale:

Vista post 2

Direi che per questo tutorial può bastare! la prossima volta abbelliremo un po’ questa vista, aggiungendo qualche classe al nostro foglio di stile css, e inizieremo a implementare la parte relativa ai commenti, e alla loro visualizzazione…

Come al solito per domande, dubbi o suggerimenti non esitate a commentare!

A presto!!!

<– Parte 4: Abbellire la Vista Parte 6: Commenti–>

39 Responses to Tutorial – Un Blog in php: Parte 5

  1. mla maggio 24, 2013 at 9:18 pm #

    Ciao.

    Non sono un esperto di PHP, ma lo sto “studiando” da autodidatta perchè ho in mente un piccolo progetto su cui lavorare, come passatempo…
    Sono rimaso incuriosito da questo tuo ottimo lavoro, e non manco di ringraziarti. Anche dei tutorial chiari, oltre che utili.

    Volevo chiederti se mi aiuti a capire meglio.

    Argomento: passaggio di variabili fra controllers differenti.

    Definisco e valorizzo una variabile in un controller (esempio index).
    Eseguo da questo controller una view.
    Nella view richiedo dei dati che passo ad un nuovo controller tramite il metodo POST.
    Il caso classico è per fare della validazioni dei dati inseriti.

    La domanda è: come vedere le variabili inizializzate dal primo controller (con i relativi valori)?

    Domanda collegata alla prima: come distinguere la chiamata di un controller per la prima volta e nelle volte successive (nel senso: la prima volta inizializzo dei valori in una variabile, le volte successive uso i valori senza inizializzare da zero).

    Sicuramente potrei avere altre domande, ma per ora mi fermo e ti ringrazio.

    Per finire dico solo che il primo pezzo che sto cercando di implememtare è una semplice procedura di autenticazione di un utente.

    Grazie

    • Jacopo maggio 24, 2013 at 10:15 pm #

      Ciao!

      Allora quì la situazione è un po’ complicata, ti spiego il perché:

      ogni volta che tu clicchi su un link, o fai la submit di un form all’interno del framework, in realtà ricarichi il sito da zero, se analizzi l’url tipo, ovvero:
      index.php?rt=controllername/actioname, tu ogni volta stai richiamando l’index principale del sito passandogli via GET il nome del controller e la action. Questo cosa significa? semplicemente che se tu richiami lo stesso controller di prima, il router in realtà istanzia un nuovo controller uguale a quello di prima ed esegue la action specificata, per cui i contenuti delle variabili istanziate prima del click sul link vengono persi, questo in qualche modo risponde anche alla seconda domanda, non si possono distinguere due chiamate eseguite sulla stessa coppia “controller/action” .

      Devi tenere presente quindi, quando progetti la tua applicazione, che ogni volta che chiami un link che inizia per index.php ecc. ecc. stai creando una nuova istanza del controller, come se in un linguaggio di programmazione ad oggetti stessi usando l’operatore “new”! Come fare allora? Qual’è il trucco?

      Ti faccio proprio l’esempio dell’autenticazione, così magari ti do anche una mano 🙂 :

      quello che faccio io di solito è prepararmi:

      – un modello: users.class.php che contiene un metodo check_user_login che prende come parametri, nomeutente e password, sostanzialmente cerca di matchare i parametri con i dati su un database, e restituisce true o false (oppure lo user_id) se è riuscito ad autenticare o meno l’utente

      – il controller della pagina avrà invece due metodi: index e user_login, il primo è obbligatorio e sostanzialmente chiama la vista, e il secondo è invece quello che si occupa di chiamare il metodo check_user_login nel modello ed effettivamente loggare l’utente.

      – la vista contiene un form, in cui l’utente inserisce nome utente e password e trasmette via POST i dati all’indirizzo: index.php?rt=nomeController/user_login.

      A questo punto il procedimento seguente autentica l’utente:

      – L’utente compila il form
      – Il controller e in particolare il metodo user_login() recupera i dati da post, e li passa al modello chiamando $nomemodello->check_user_login(nomeutente, password)
      – Il modello ritorna true o false al controller il quale a questo punto setta una campo del controller che si chiama, ad esempio $islogged = true (o false);
      – fa in modo che questa variabile sia leggibile dalla vista: quindi, come al solito, $registry->template->islogged = $islogged, e richiama la vista con il solito metodo $registry->show(‘nomevista’);
      – ora è tutto un gioco di vista, embeddi un di php all’interno della vista e fai un controllo del tipo:

      Per quanto riguarda la validazione del form, ricordati sempre che è buona norma fare controlli tipo numero minimo dei caratteri, campi password uguali, email formattata correttamente ecc. lato client, usando, ad esempio, degli script javascript, ti consiglio un plugin di jquery molto carino e potente, magari già lo conosci: ( http://jqueryvalidation.org/ )
      è veramente semplice da usare, e molto efficace…

      Se invece vuoi fare il controllo lo stesso lato server, lo puoi fare semplicemente riprogettando il metodo check_user_login del modello, facendogli ritornare non solo true o false, ma dei codici, magari dei numeri negativi, in modo che tu possa fare, nella vista, controlli del tipo:

      Spero di esserti stato utile, in caso di dubbi chiedi pure, che ti rispondo volentieri!

      • mla maggio 24, 2013 at 10:40 pm #

        OK. Grazie.
        Mi sembra di essere più o meno sulla strada che mi indichi.

        Ma facciamo il caso pratico.

        Visto che via URL posso accedere a qualsiasi action di qualsiasi controller, come faccio a verificare che sono passato regolarmente dalla pagina di login (ovvero bloccare l’accesso in caso di richiamo dell’url senza login)?

        • Jacopo maggio 24, 2013 at 11:39 pm #

          In questo caso la risposta sono le sessioni (o i cookies, ma sono meglio le sessioni), come in qualsiasi normalissimo sito o applicaione scritti in php http://www.php.net/manual/it/book.session.php

          nel tuo caso specifico, a login effettuato, dovrai creare una nuova sessione con session_start(), a questo punto verrà creata una sessione univoca associata all’utente che ha effettuato il login, nella sessione puoi salvare ad esempio anche l’ID dell’utente, se ne ha uno sul tuo database, ora a questo punto nella vista, dovrai verificare se esiste una sessione per l’utente che sta visualizzando la pagina. se esiste allora l’utente è loggato, il codice di controllo sarà una cosa del tipo:

          considera che $_SESSION è una variabile globale in php, per cui il suo contenuto si preserva anche se ricarichi il controller o cambi pagina!

          • mla maggio 25, 2013 at 1:39 pm #

            OK. Grazie.

            Immaginavo non ci fossero controindicazioni ad utilizzare tutte le logiche comprese nell’ambinete PHP, sessioni comprese.
            Le domande erano quindi solo per comprendere se nella logica del framework, sebbene volutamente semplice e semplificata come hai dichiarato nel renderla disponibile, fosse stato previsto qualche sistema di scambio dati fra controller e viste della sessione.

            Un altro passo: accesso PDO a diversi database

            Avendo esperienze pregresse con Postgres (quindi non perchè MySql non sia adatto al progetto a cui sto lavorando) ho voluto provare a duplicare la classe da te distribuita mysql_db.class in pgsql_db.class.

            Ho modificato la chiamata mysqli e la modalità di connessione secondo la sintassi documentata PDO.

            Fino a qui nessun problema. COnnessiona ok a Postgres.

            Ma provando ad eseguire i vari step del tutorial che hai pubblicato, con il DBMS configurato su Postgres sono iniziati i problemi.

            In particolare per esempio viene segnalato errore quando si richiama la funzione num_row

            Capisco la complessità dell’argomento, ma ero incuriosito dalla modalita di applicazione della interessante logica di astrazione che sta dietro (mi sembra di aver capito) al PDO.

            Mi aspettavo che magicamente essendo un approccio “astratto”, fosse talmente distaccato dal database che ci sta sotto tanto da divenirne indipendente…
            Ma forse è un po’ troppo questa aspettativa…
            Cosa ne dici?
            Da dove hai preso la classe mysql_db.class ? L’hai scritta tu?
            Che approccio dare per rendere effettivamente trasparente il tipo di DB?
            Come costruire la classe per Postgres?

            Sono domande che vorrebebro solo essere per favorire una discussione sull’argomento.

            Grazie

  2. Jacopo maggio 26, 2013 at 6:58 pm #

    Ciao,

    scusa se ti rispondo solo ora, cerco di rispondere alle tue domande, iniziando dalla più semplice: sì la classe mysql_db.class l’ho scritta io e fa parte del framework, ti spiego come funziona il processo di astrazione: esiste una classe astratta che avrai sicuramente visto nella cartella models che si chiama db.class.php, che sostanzialmente specifica i prototipi dei metodi da implementare per l’accesso PDO ai database:

    i metodi sono sostanzialmente, la connect, la disconnect, la query, la fetch ecc. ecc.

    cosa fa la classe mysql_db.class.php? semplicemente implementa questa classe astratta PER il dbms mysql, ovvero mysql_db.class è quella classe che io chiamo driver per mysql…

    di default, allo stato attuale il framework fornisce unicamente il driver per mysql, però è predisposto per accettare qualsiasi altro driver che implementi la classe astratta db.class.php…

    per cui quello che serve a te al momento è un driver per postgresql, ovvero una nuova implementazione di db.class.php che invece di eseguire, ti faccio un esempio, la connect con la chiamata a mysqli, chiami ad esempio la funzione pg_connect() ecc. ecc.

    a questo punto ti basterà modificare il file config.php con i dati di configurazione relativi al database postgres, ad esempio così:

    e aggiornare il file index.php, all’interno dello switch, intorno alla riga 21 aggiungendo il caso di database postgresql, come vedi qui’ di seguito:

    Mi sono permesso anche di abbozzarti una semplicissima implementazione del driver pgsql per il framework… è veramente un abbozzo, l’ho scritto in 5 minuti, non prenderlo per oro colato, ma dovrebbe funzionare, usalo come punto di partenza!

    ti basta creare un file pgsql_db.class.php nella cartella models e incollarci dentro questo codice:

    future versioni del framework conterranno di default i driver per diversi dbms per cui il passaggio da uno all’altro sarà veramente questione di cambiare il file config.php e basta…

    spero di aver risposto a tutto, e di essere stato chiaro, se hai altre domande non esitare a scrivermi, che sicuramente sono cose che possono essere utili anche a chi legge e basta!

  3. mla maggio 27, 2013 at 10:43 pm #

    Ciao.
    Una domanda che riguarda la logica della programmazione a oggetti (non so se in generale o con questo framework… non sono esperto di programmazione aoggetti).
    Seguendo gli esempi del tutorial ho eseguito la chiamata del tipo:

    $utente = new Utente($this->registry->db);

    all’interno di indexController.php

    La mia domanda (forse banale) è: una volta istanziato questa classe, posso eseguire una serie di query, richiamando più funzione inserite in utente.class.php

    Ma quando il controller vene di nuovo richiamato, e viene quindi di nuovo eseguita la chiamata con la “new” di cui sopra, di fatto cosa succede?
    In altre parole: la chiamata di cui sopra serve solo per richiamare la classe (e quindi alla seconda o ennesima chiamata non succede nulla) oppure ad ogni chiamata viene istanziato un nuovo oggetto?

    Grazie e scusa per la banalità di alcune domande.

  4. Jacopo maggio 28, 2013 at 9:48 am #

    Ciao, allora brevemente,

    a ogni chiamata dell’operatore new, in qualsiasi linguaggio di programmazione orientato agli oggetti, si crea una nuovo oggetto istanza della classe “tal dei tali”, per cui venendo al framework, ogni volta che ricarichi la pagina, e viene eseguito un metodo del controller che ha al suo interno un’istruzione con l’operatore new, allora viene istanziato un nuovo oggetto.

    Se hai un po’ di tempo e voglia, ti consiglio di leggerti questa guida introduttiva alla programmazione oop in php che trovi su html.it:

    http://www.html.it/pag/18339/introduzione-alla-oop/

    • mla maggio 28, 2013 at 10:05 am #

      Sicuramente leggerò la guida che mi suggerisci.
      Grazie.

      La domanda che avevo fatto voleva essere: è indispensabile istanziare di nuovo lo stesso oggetto, o peggio ancora non è opportuno, oppure è normale così e non crea nessuna controindicazione?

      • Jacopo maggio 29, 2013 at 7:01 pm #

        Ciao e scusa il ritardo,

        comunque la risposta breve alla tua domanda è sì, se il controller viene richiamato da URL, è necessario reistanziare il modello perchè stai lavorando su una nuova istanza del controller stesso, per cui è come se tu ti trovassi in un nuovo controller, che ha la stessa struttura del vecchio, ma non ha, passami la figura retorica, “la sua storia”.

        Per quanto riguarda gli effetti collaterali del dover istanziare un nuovo oggetto, purtroppo esistono eccome, e riguardano, come in qualsiasi altro linguaggio di programmazione, la gestione della memoria… istanziare un nuovo oggetto, come hai tu stesso suggerito non è gratuito, ma si tratta di occupare spazio in memoria…

        ogni linguaggio di programmazione gestisce il problema a modo suo, ad esempio C e C++ lo lasciano gestire al programmatore, java usa un sistema di garbage collection… in php, generalmente si tende a ignorare il problema per script corti, se lo script serve a mostrare una pagina web, ad esempio, una volta che la pagina è mostrata, finisce la sua esecuzione… per cui la memoria occupata viene restituita al sistema operativo….

        in caso di script invece che rimangono in esecuzione per molto tempo, magari perché è presente qualche ciclo molto lungo, allora anche php offre un sistema di garbage collection, puoi avere qualche info in più qua: http://php.net/manual/it/features.gc.php

  5. mla giugno 1, 2013 at 3:14 pm #

    Ciao.
    Grazie per le info che mi stai dando.
    Disturbo ancora, in merito ai messaggi di errore.
    Qual è il metodo migliore per gestire gli errori di ritorno dalle operazioni SQL eseguite sul database?
    Il framework è già impostato in qualche modo per intercettarli (es: un erroe su una istruzione di insert o update, oppure un errore sulla connect…)?
    Se no, come suggeriresti di implementarli?
    Come gestire il messaggio di errore che ne deriva?
    Grazie

  6. mla giugno 1, 2013 at 3:54 pm #

    Un’altra domanda…
    Compongo una stringa da passare come query per ina istruzione di INSERT del DB.
    I campi che uso nella direttiva VALUES ( … ) sono stringhe che arrivano da una FORM.
    Questi campi non sono tutti obbligatori.
    Mi trovo che database ho i valori corretti per quei campi dove nella form ho messo effetivamente una striga.
    Per i campi che ho lasciato vuoti nella form, nel DB trovo la stringa costituita dalla sequenza ” (due volte la virgoletta singola).

    Tieni conto che la composizione dei valori è del tipo:

    $query_str=”insert into table1 (campo1, campo2) values (‘” . $campo1 . “‘, ‘” . $campo2 . “‘)”

    Come si può fare per sostituire la sequenza “virgoletta campo virgoletta” con il valore NULL nel caso di campo vuoto?

    Grazie

  7. taddeus agosto 4, 2013 at 1:26 pm #

    ciao ho trovato molto interessante questa serie di articoli ma mi chiedevo se si potesse avere anche il seguito e cioè l’inserimento di un post e di un commento e accesso area riservata.
    Questo soprattutto per capire il funzionamento del framework che mi sembra fatto bene ed utile.
    Grazie e complimenti

    • Jacopo agosto 5, 2013 at 8:26 am #

      Ciao taddeus,

      il seguito è in lavorazione… dovrebbe essere pubblicato in settimana, scusa per l’attesa, e grazie per la pazienza…

      • taddeus agosto 5, 2013 at 2:55 pm #

        grazie a te per la disponibilità.
        buon lavoro

  8. taddeus agosto 4, 2013 at 10:29 pm #

    ciao scusa ancora …una domada: per integrare jquery e quindi per esempio aggiornare una pagina il cui contenuto viene restituito da un database?

    • Jacopo agosto 5, 2013 at 9:28 am #

      Ciao,

      allora l’integrazione di jquery all’interno del framework è molto semplice di per sé, ti basta scaricare jquery dal sito ufficiale, creare una cartella nella root del framework, chiamandola che ne so, “js” e incollare il file javascript al suo interno, a questo punto di basta linkarlo all’interno della VISTA che vuoi che utilizzi jquery, così come faresti per una normalissima pagina web:

      questo ti permette di utilizzare nel contesto della vista in cui hai incluso il file l’intera libreria jquery…

      la cosa un po’ più per così dire macchinosa, ma non impossibile, è l’utilizzo della funzione ajax per accedere al db, perché?
      Perché la natura del framework prevede che sia solo il controller l’unico a poter costruire e chiamare metodi dai vari modelli, questo implica che una richiesta ricevuta da una vista debba essere gestita dal controller, che può essere richiamato solo ricaricando la pagina, questo va contro al concetto stesso di ajax,

      ciò cosa vuol dire? significa che le chiamate ajax vanno gestite a parte, interrogando direttamente il database, senza usare il $registry->db per intenderci…

      ti faccio un esempio, supponiamo di avere scaricato jquery, creata una cartella js nella root, incollato li dentro jquery e importato nella vista dell’index: “views/index.php”:

      sul nostro database creiamo una tabella cretinissima che riempiamo con un po’ di valori:

      vogliamo inserire nella nostra vista un pulsante che esegua una richiesta ajax e stampi, prendendoli dal database, l’elenco degli utenti:

      dobbiamo predisporre uno spazio, un div, per la stampa degli utenti, e creare il pulsante:

      ora in fondo alla pagina creiamo lo script che in soldoni farà onClick sul pulsante con id pulsante, esegui la query ajax e aggiorna il contenuto del div utenti…

      ora ci manca solo la funzione di callback, andiamo nuovamente nella root del framework e creiamo una nuova cartella, che chiamiamo “callbacks” al suo interno creiamo il file che viene chiamato dal nostro script, ovvero “ajax_test.php”…

      ora si tratta solamente di eseguire la query e ritornare il risultato, ricordati di includere il file di configurazione “config.php” che sta nella root del framework per avere i dati di connessione al database:

      la callback php sarà qualcosa di questo tipo:

      il risultato dovrebbe essere un pulsante che ti stampa l’elenco dei nomi degli utenti facendo una chiamata ajax e quindi senza ricaricare la pagina…

      • taddeus agosto 5, 2013 at 2:52 pm #

        ciao grazie per la risposta; io, forse sporcando un pò quello che è il framework, avevo pensato di mettere nel controller il codice tipo questo:
        /* Implement post controller */
        public function stampa_dati_form_2(){
        $casellaTesto = $_POST[‘prova’];
        echo $casellaTesto;
        }
        dove stampa_dati_form_2 è la action del controller e
        $_POST[‘prova’] è la textbox inviata dal form della view.
        questo per non uscire e rientrare nel framework
        Cosa mi consigli?

        • Jacopo agosto 5, 2013 at 5:11 pm #

          Ciao,

          allora il problema è che richiamando il controller, per come è strutturato il framework siamo costretti a passare per l’index (ti ricordo che tutti gli indirizzi all’interno del framework sono del tipo index.php?rt=controller/action), per cui sarebbe come fare una chiamata a se stessi e, per come funziona ajax, ti verrà restituita come risposta dal server l’intera pagina che stai visualizzando!

          per cui il metodo che suggerisci potrebbe andare bene per query di inserimento o update, in realtà non ho provato, però dovrebbe darti problemi per query di ricerca, o selezione, da cui effettivamente ti aspetti una risposta…

          ergo per il momento ti consiglio di seguire il metodo delle callbacks che ti ho segnalato, il quale ti permette di usare ajax nel modo più semplice possibile…

          mi rendo conto che si tratta di un limite del framework, sto cercando di lavorarci in modo da risolvere il problema (insieme a molti altri 🙂 ) in una futura release…

          se ti venisse in mente un metodo migliore, fammelo sapere!

          • taddeus agosto 5, 2013 at 8:34 pm #

            ok. mi diresti se c’è la possibilità di recuperare un errore e stamparlo (X esempio fai in inserimento e va in errore)

          • taddeus agosto 7, 2013 at 10:12 am #

            come dicevi tu per inserimento funziona; provo a fare una ricerca e vedo se va. ti faccio sapere.
            Ciao

  9. taddeus agosto 5, 2013 at 3:32 pm #

    ciao altra domanda: come faccio a catturare un errore tramite il framework, ad esempio di inserimento nel database?
    ciao

  10. taddeus agosto 9, 2013 at 1:54 pm #

    ciao ho fatto una modifica al framework per fare in modo che se nella cartella view si vogliono creare delle sotto cartelle sia possibile farlo per metterci i relativi file php. per esempio se si vuole fare una sottocartella news per mettere il file news.php e fare in modo che dal controller sia possibile richiamato. se ti interessa ti posto il codice

    • Jacopo agosto 9, 2013 at 2:52 pm #

      Ciao taddeus,

      volentieri, ti chiedo solo un favore, per un problema di leggibilità, quando posti il codice, cerca di metterlo all’interno di un tag “pre” in questo modo

      in questo modo il codice viene formattato correttamente, colorato e identato, rendendolo più leggibile anche per altri che potrebbero essere interessati… io sto raccogliendo tutti i suggerimenti che mi date sul blog, e le issue che mi vengono segnalate su github per la prossima versione del framework…

      ah mi ero dimenticato di rispondere alla tua domanda sul controllo errori, in realtà non ho ancora previsto un sistema efficace di gestione dell’errore, in ogni caso puoi facilmente modificare il driver mysql, per effettuare tutti i controlli che vuoi, lo trovi nella cartella models, il file è mysql_db.class.php, puoi ad esempio creare un campo $error nella classe che viene settato con il testo dell’errore restituito dalla funzione mysqli_error e poi scriverti un metodo, che ne so get_last_error() che restituisce al chiamante la descrizione dell’errore, ovvero il contenuto del campo $error…

      grazie ancora per le segnalazioni che mi stai facendo!

  11. taddeus agosto 9, 2013 at 4:01 pm #

    In realtà la modifi la modfica è molto banale ma credo utile per una migliore organizzazione delle pagine specialmente se si prevede di fare un progetto nu pò più corposo e quindi con tante pagine php.
    Il file da modificare è template.class.php che si trova nella cartella application; ho aggiunto una funzione che ho chiamato show_with_path il cui codice è il seguente:

    il codice come potrai verificare è identico a quello della funzione show implementata da te nel framework ma con la differenza che c’è un parametro in più che è il path ossia il percorso che poi vado ad utilizzare in questa riga di codice:

    Per utilizzarla nel controller si deve richiamare la nuova funzione in questo modo:

    dove ‘miavista’ è il nome della sotto cartella presente nella cartella views e myfilephp è il nome della vista ossia del file php presente nella cartella miavista.

    si potrebbe anche prevedere una modifica alla funzione show in cui si passano direttamente 2 parametri e si verifica se path è settata o meno.

    Spero di esserti stato utile e di aver seguito la logica del framework.
    Alla prossima

  12. Jacopo agosto 9, 2013 at 8:36 pm #

    Ragazzi visto, che è stato richiesto a gran voce, ve lo scrivo anche qua, è disponibile la parte 6 del tutorial… eccovi il link:

    http://nerdangolo.altervista.org/tutorial-un-blog-in-php-parte-6/

  13. taddeus agosto 15, 2013 at 9:44 am #

    ciao volevo chiederti se per inizializzare una variabile di sessione dopo l’autenticazione è possibile farlo nel model oppure nel controller o bisogna farlo per forza nella view.
    grazie

  14. Jacopo agosto 16, 2013 at 3:43 pm #

    Ciao taddeus, se intendi una cosa tipo $_SESSION[‘varname’] = “qualcosa”… non ci sono restrizioni, puoi inizializzarla dove preferisci, io ad esempio sto usando il framework per costruire un sito web che prevederà l’autenticazione dell’utente, e una volta loggato e recuperato il suo id nel database, inizializzo nel modello una variabile $_SESSION[‘user_id’] che poi riutilizzo nel controller di un modulo che mi stampa un menu utente personalizzato per verificare se l’utente è loggato o meno… insomma puoi fare come vuoi con $_SESSION 🙂

    • taddeus agosto 17, 2013 at 3:18 pm #

      ok allora sbaglio io qcs perchè nel model ho messo l’istruzione che dici tu ma nella view non mi ritrovo settata la variabile di sessione.

    • taddeus agosto 17, 2013 at 5:28 pm #

      scusami ancora una domanda ma io ho il questo problema:
      dopo aver fatto l’autenticazione dell’utente ed aver salvato in sessione i dati dell’utente in questo modo:

      nel file index.php faccio questo:

      Sempre in questo file ho un link che rimanda al file stesso di cui ti riporto il codice:

      ma quando ci clicco su mi fallisce il controllo sulla sessione mi riporta al login.
      Ti scrivo anche il codice del controller

      Mi suggerisci dove sbaglio poiché sto usando anche io questo frameword per fare un gestionale ..?
      Grazie e buon lavoro.

      • Jacopo agosto 18, 2013 at 10:43 am #

        Ciao taddeus, allora vediamo un attimo…

        mi stai dicendo che in sostanza il problema sta nel fatto che ti entra sempre nell’ if che mi hai scritto, ovvero quello che controlla se non è settata la variabile $_SESSION[‘user’] ho capito bene?

        Ciò significa che per lui $_SESSION[‘user’] non esiste proprio…

        in tal caso ti provo a buttare lì un controllo stupido da fare, magari ci avevi già pensato, prima di controllare il contenuto di $_SESSION esegui questo pezzetto di codice, nell’index.php

        se non va prova a stampare da qualche parte il contenuto di $_SESSION[‘user’], per vedere che cosa c’è che non va, il problema è li dentro,

        fammi sapere in caso vediamo di risolvere in altro modo… fare si riesce a fare sicuramente, e sei sulla strada giusta, perchè stai facendo una cosa molto simile a quella che ho fatto io, facendo i miei test…

        • taddeus agosto 18, 2013 at 2:59 pm #

          ho aggiunto il controllo che mi dicevi;

          if(!session_id() ){
          session_start();
          echo “utente non loggato”;
          }
          else {
          echo “utente loggato “;
          echo “utente loggato : ” . $_SESSION[‘user’];
          }

          if ((empty($_SESSION[‘user’]))) {
          header(“Location: index.php?rt=login/accessoNonAutorizzato”);
          }
          else {
          echo “utente loggato : ” . $_SESSION[‘user’];
          }

          il risultato è :
          utente non loggato
          utente loggato :
          quindi evidentemente eseguendo il session_start() riattiva la sessione ma ovviamente la variabile inizializzata da me $_SESSION[‘user’] è vuota.
          Volevo anche dirti che io le istruzioni:

          session_start();
          $_SESSION[‘user’] = $row;

          le metto nel controller e precisamente quando al controller dopo che nel model ho fatto i controlli di accesso.
          quindi nel model faccio il controllo sul DB e se la funzione di check mi restituisce true (come avevi suggerito tu ad un altro utente) allora imposto nel controller la session.
          Se hai suggerimenti…
          grazie

          • taddeus agosto 19, 2013 at 1:26 pm #

            ciao jacopo volevo dirti che credo di aver risolto: in pratica nel controller indexAdminController.php dimenticavo di mettere l’istruzione:
            session_start() e quindi quando tornavo nella view falliva il controllo sulla variabile di sessione inizializzata e cioè $_SESSION[‘user’].

            ciao

  15. taddeus agosto 19, 2013 at 1:58 pm #

    ciao Jacopo, ti chiedo troppo se ti chiedo di postare un esempio di utiizzo di un modulo?vorrei utilizzarlo per creare un menu che viene utilizzato in tutte le pagine del pannello di amministrazione del sito.
    Grazie

    • Jacopo agosto 20, 2013 at 8:41 am #

      Ciao, come no!

      allora, in linea di massima quello che devi fare è questo,

      supponiamo di voler scrivere un menu da visualizzare in tutte le pagine:

      – Step 1: Vai nella cartella modules, e crea una nuova cartella, chiamala come vuoi che si chiami il modulo, io ad esempio la chiamo menu.

      – Step 2: All’interno della nuova cartella menu, crea un controller per il modulo, chiamalo, ad esempio, menuController.php

      -Step 3: All’interno del file menuController.php devi creare una classe secondo questo prototipo:

      come per il caso del baseController anche una classe che estende moduleController deve implementare il metodo index, che in questo caso però prevede un parametro $args opzionale, che sostanzialmente ti permette di chiamare il modulo passandogli alcuni parametri.

      Ora, all’interno del controller puoi comportarti come ti comporteresti in un controller normale, inizializzare variabili ecc. ecc. ricordati solo, che in un modulo, non è necessario salvare le variabili in $this->registry->template sarà sufficiente dichiararla nel controller in maniera classica: $nomevariabile = “value” affinchè essa sia visibile nella vista.

      – Step 4: All’interno della cartella del modulo puoi creare una vista, la puoi chiamare come vuoi, io di solito mantengo per convenzione il nome del modulo, in questo caso la chiamerei menuView.php. All’interno della vista scriveremo del semplice codice html, che ne so una lista di link, trattandosi di un menu…

      – Step 5: In fondo al metodo index del menuController aggiungiamo l’istruzione: include “menuView.php” per visualizzare la vista.

      – Step 6: Nel controller principale della nostra PAGINA questa volta, assicuriamoci di aver trasferito la variabile $modules presente nel $registry in una variabile di template, con l’istruzione: $this->registry->template->modules = $this->registry->modules;

      – Step 7: A questo punto rechiamoci nella vista in cui vogliamo eseguire il modulo, e embeddando un po’ di php nel codice html, all’interno dell’ipotetico div in cui vogliamo mostrare il nostro modulo, scriviamo: $modules->execute(‘menu’); // per eseguire il modulo senza passare parametri, oppure: $modules->execute(‘menu’, $variabile_contenete_un_vettore_di_argomenti);

      In sostanza, una volta preparato il modulo, sarà sufficiente chiamare il metodo execute con il nome del modulo da eseguire all’interno di una vista qualsiasi della nostra applicazione per mostrare il nostro menu…

      Spero di esserti stato utile…

      ciao!

      • taddeus agosto 20, 2013 at 12:06 pm #

        grazie mille.
        appena metto in pratica ti faccio sapere.
        Ciao e buon lavoro.
        Restiamo in attesa dei prossimi passi di creazione del blog 😉

  16. andrea ottobre 16, 2013 at 7:20 pm #

    Complimenti… molto interessante l’approccio pulito e semplice.
    Proverò ad usarlo ed ad estenderlo per le mie esigenze.

    Ottimo lavoro, complimenti ancora

  17. Kampa gennaio 23, 2014 at 10:37 am #

    Ciao Jacopo,
    Innanzitutto complimenti per il framework, lo sto utilizzando proprio per un blog, con un altro DB, classi ecc…

    Vorrei chiederti una cosa che da solo purtroppo non sono riuscito a capire…

    Nella pagina dove appare la lista dei post avrei bisogno di inserire alcune info riguardanti i commenti per ogni relativo post, come il numero di commenti che ci sono in ogni post.
    Il problema è che non riesco a passare l’id del post per fare la query dei commenti, per esempio SELECT * FROM commenti EHERE id_post = “.$id_post.”.

    Come posso fare?

    Grazie

    • Jacopo gennaio 27, 2014 at 10:24 am #

      Ciao, scusa il ritardo nella risposta, ultimamente le notifiche dal blog mi arrivano nella casella Spam della posta… fortunatamente sono andato a controllare…

      comunque, veniamo al tuo problema… si tratta se ho capito bene, di modificare la funzione get_post_meta del modello di cui ho parlato, se non erro nella parte 2 del tutorial, dopo la prima query che abbiamo fatto, ovvero quella in cui recuperiamo l’elenco dei post, nella select estraiamo il post_id di tutti i post nel database… il concetto è quello di ciclare su tutti i post id del form PRIMA di ritornare l’array dei post e per ognuno di essi fare una query sulla tabella comments in cui ad esempio fai un count delle voci, ognuna delle query ti restituirà il numero dei commenti per l’i-esimo post del ciclo che potrai aggiungere all’arra di metadati da restituire.

      In alternativa potresti modificare proprio la query di selezione dal database, facendo una Join tra la tabella post e la tabella commenti sulla chiave post_id e selezionare oltre a tutti gli altri metadati anche la count(*) dei commenti…

      spero di esserti stato utile, poi in caso se hai domande chiedi!
      a presto…

Lascia un commento

Powered by WordPress. Designed by WooThemes