obiettivo ambizioso da perseguire, dall’ astrazione dei dati alle cose che funzionano e che si possono visualizzare a video!

Il link del progetto in working progress
http://umbriawayformazione.altervista.org/ci_project_glocal/

Riassunto delle puntate precedenti
All’ indirizzo https://umbriawayinfo.wordpress.com/2021/03/09/territorio-storia-cultura-conoscere-le-risorse-che-hai-sotto-casa-con-glocal-web-app-come-mettere-in-moto-un-progetto-con-codeigniter-quinta-puntata/ abbiamo progettato il DB per il modulo della gallery dinamica, adesso però deve mettersi in moto tutto il meccanismo MVC dentro CodeIgniter

L’obiettivo da perseguire
Il ns obiettivo è quello di rappresentare visivamente i dati, per farlo bisogna fare una query che va a pescare su due tabelle, ma oltre al MODEL serve un controller e una vista

Replicare il controller
Glocal ha una particolarità come progetto, dopo aver strimpellato CodeIgniter su 19 progetti antecedenti mai era stata usata la logica dei CONTROLLER multipli e con essi anche i MODEL ovviamente (ci siamo accorti che così la gestione del codice è semplificata e con essa anche la facilità di esportazione per successivi progetti). Per cui andiamo a replicare il controller statico rinominando Static con Dynamic e cambiando di conseguenza anche il nome del file in GalleryDynamic.php :

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class GalleryDynamic extends CI_Controller {

	public function __construct()
	{
		parent::__construct();
		$this->load->helper('url');
	}

	public function photos()
	{
		$this->load->view('gallery');
	}

}

A questo punto teniamoci forte perchè subentra la novità, non cadiamo dal seggiolone, sta per entrare in scena il MODEL, ossia il tizio che gestisce la parte logica dell’ applicazione e che rimanda i dati al CONTROLLER prima di servire il CLIENT che li richiede. Prima del model però bisogna transitare per i file di configurazione

Il file database.php: compilazione
Per fare questa operazione dobbiamo andare dentro la cartella APPLICATION entrare dentro la cartella CONFIG e cercare il file database.php e compilare i campi richiesti che sono quattro, hostname, username, password, database:

‘hostname’ => ‘ ‘,
‘username’ => ‘ ‘,
‘password’ => ‘ ‘,
‘database’ => ‘ ‘

La domanda a questo punto è, adesso siamo in grado di allacciarci ai dati del DB? La risposta è no, ma quasi!

Caricare le librerie
A questo punto dobbiamo caricare le librerie che ci servono nel file autoload.php che si trova dentro la cartella CONFIG che si trova dentro la cartella APPLICATION del framework, quindi andremo a scrivere:

$autoload[‘libraries’] = array(‘database’);

Oltre al DB servirà poi di caricare anche altro come le sessioni e la paginazione! A questo punto proviamo a rifare la domanda: adesso siamo in grado di allacciarci ai dati del DB? Risposta questa volta affermativa

Come funziona MVC?
Il pattern Model-View-Controller funziona che ogni componente è separata per semplificare la leggibilità e la gestione del codice, chi fa da mediatore tra UTENTE che condisderiamo un CLIENT e DATABASE che si trova sul SERVER e fornisce i dati è il CONTROLLER! Quindi adesso dobbiamo costruire la QUERY per estrapolare i DATI dal DB e non è una query qualsiasi perchè dobbiamo usare subito una complicata INNER JOIN all’ esordio, Vediamo la sintassi di una INNERJOIN semplificata:

inner join

quindi una volta fatta la nostra query anche grazie alla lettura della documentazione https://codeigniter.com/userguide3/index.html non ci resta che passare i dati raccolti dal MODELLO al controller che dovrà poi passare il testimone alla vista esattamente come avviene nelle competizioni olimpioniche di corse a squadre. Per non togliere il gusto della scoperta lasciamo da ora in poi armeggiare l’aspirante web developer con la documearia per allestire la vista

Creare il MODEL
Nella mia sintassi uso sempre la formula della letterea maiuscola quindi il MODEL lo chiamerò specificatamente Collegallery_Model.php e questo file conterrà la query di estrazione dei dati

Che cosa scrivere nel controller?
Qui riportiamo il codice perchè di fatto si evince proprio la dinamica base di MVC che prende da qualcuno per rigirare al client, nel mio controller con il codice riportato sopra andrò a scrivere trasformando il tutto in:

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class GalleryDynamic extends CI_Controller {

public function __construct()
{
parent::__construct();
$this->load->model('Gallery_Model');
}

public function photodynamics()
{

$config = array();
$config["base_url"] = "http://umbriawayformazione.altervista.org/ci_project_glocal/index.php/GalleryDynamic/photodynamics/";
$config["total_rows"] = $this->Gallery_Model->get_row();
$config["per_page"] = 10;
$config["uri_segment"] = 3;
$this->pagination->initialize($config);
$page = ($this->uri->segment(3))? $this->uri->segment(3) : 0;
$config['full_tag_open'] = "<ul class='pagination'>";
$config['full_tag_close'] = '</ul>';
$config['num_tag_open'] = '<li>';
$config['num_tag_close'] = '</li>';
$config['cur_tag_open'] = '<li><a href="#" class="active">';
$config['cur_tag_close'] = '</a></li>';
$config['prev_tag_open'] = '<li>';
$config['prev_tag_close'] = '</li>';
$config['first_tag_open'] = '<li>';
$config['first_tag_close'] = '</li>';
$config['last_tag_open'] = '<li>';
$config['last_tag_close'] = '</li>';
$config['next_link'] = 'ColleNext';
$config['next_tag_open'] = '<li><i class="fa fa-long-arrow-right"></i>';
$config['next_tag_close'] = '</li>';
$config['prev_link'] = 'CollePrev';
$config['prev_tag_open'] = '<li><i class="fa fa-long-arrow-left"></i>';
$config['prev_tag_close'] = '</li>';
$this->pagination->initialize($config);
$data["links"] = $this->pagination->create_links();
$data['nomedausarenelforeach'] = $this->Gallery_Model->get_photos($config["per_page"], $page);
$this->load->view('collegallerydynamicpage', $data);
}

}

IMPORTANTE: nel controller bisogna caricare anche gli helpers e le librerie oltre che riempire i campi nel file autoload.php

La gestione degli errori
Durante questo processo di costruzione parallela (abbiamo scelto di mettere in piedi un controller a fianco di un model specifico che punterà a una vista specifica non adibita ad altro) compariranno numerosi errori sulla pagina mentre cerchiamo di bucare i dati dal DB, NOTIZIE, WARNING o ANOMALIE di SISTEMA presenti nel CORE del framework. Questo perchè abbiamo sbagliato qualcosa, magari la sintassi da qualche parte non è corretta e i nomi delle funzioni da richiamare non corrispondono. Oltre a questo potrei avere errori di logica all’ interno della query, oppure pagine che non si trovano perchè le classi indicate nel controller non sono giuste o perchè qualcosa non funziona nel Model, insomma la casistica è molto varia, magari non ho richiamato gli helpers e le librerie specifiche che servono come paginazione e sessione per esempio. Oppure la paginazione non va perché manca la direttiva “initialize” che avvia la configurazione FORTUNATAMENTE il framework è anche molto preciso ad indicare dove si trova di fatto l’anomalia, su quale riga e questo ci permette se non di capire come risolverla, almeno di puntare nel punto preciso in cui qualcosa non va e si interrompe il flusso. Alla fine a forza di avere sotto gli occhi quello che serve (è questa la bravura di codeigniter, sa instradare e convogliare le attenzioni) si intuisce che qualcosa va richiamato nel modo giusto oppure che qualcosa non arriva nella tessera del domino presa in esame. In ogni caso la fase successiva alla stesura del codice che diventa preludio prima della visualizzazione dei dati può diventare un breve calvario dove può capitare di non sapere a quale santo rivolgersi. Tuttavia le leggi gravitazionali agiscono in un modo e non in un altro per cui sapendo come ragiona codeigniter e con quale freddezza non è possibile ipotizzare niente altro che porti anomalie, per cui se una cosa deve funzionare usando la logica, allora quella cosa funzionerà. Inutile dire che la parte più bella nel costruire web app è quando dal nulla vedi concretizzarsi un risultato dopo aver incrociato warning, notice ed errori su numerose righe di codice poi rettificate nella loro distorsione. La maggior parte degli errori sono legati alla sintassi e all’ invocazione di metodi con nomi sbagliati. In ogni caso quando non si riesce ad andare avanti conviene raffreddarsi e riprendere successivamente il cammino con migliore aderenza sull’ asfalto, magari dopo un caffè riconciliante dove si sopprime l’impulso di “buttare a mare” il computer!

LA GALLLERY FUNZIONA!!!!!!!!!!!!!!!!!!!!!!!!!
E certo se stai seduto diverse ore a costruire una applicazione si suppone che i problemi li crei nel tuo piccolo, ma anche li risolvi (sempre legati alla tua comprensione del momento)! Non a caso ci ho messo solo 23 giorni per completare il mio primo progetto di una semplicità sconcertante, quello western visibile nella home di http://umbriawayformazione.altervista.org/ (che è tanto tempo!). A questo punto non ci possiamo credere dopo tanti prova e riprova, tenta e ritenta, batti e ribatti vediamo qualcosa sulla pagina e non sono comparsi errori! Incredibile Newbie!

OK la gallery funziona, ma siamo solo all’ inizio, quindi spezziamo le parti della pagina con gli include
Abbiamo di nuovo usato gli INCLUDE per spezzare il codice relativo della home dinamica per lavorarlo meglio preso singolarmente, i file parziali siamo andati a salvarli e a recuperare all’ interno della cartella INCLUDE, questo ci dà il vantaggio di usare anche il MODEL per andare a sparare i dati su zone da alimentare come le sidebar per esempio. Nel nostro caso abbiamo deciso di non dinamicizzare gli include DIRETTAMENTE ma indirettamente. In particolare le tre pagine del FOOTER ci cadono a fagiolo in quanto possiamo modellarci sopra tre query e andare a pescare sulla triade indicata nella categoria che fa capo a estrapola tutte le foto della località vista da SUD, fai lo stesso per NORD e CENTRO.

Filtrare i dati con query passive che fanno tutto loro
Quando non passo nessun dato con il GET dai link di fatto avrò la mia pagina che fa capo a un METODO del CONTROLLER che a sua volta richiama una query dove viene indicata una clausola di ricerca, nel nostro caso vogliamo per esempio che tutte le foto di quella località immortalata da SUD vengano fuori e così anche per NORD e CENTER, quindi nel controller scriverò qualcosa tipo:

public function collesud()
{
$cat=$this->input->get('cat');
$data['collesouth'] = $this->Gallery_Model->nome_funzione();
$this->load->view('paginacollesouth', $data);
}

public function collecentro()
{
$cat=$this->input->get('cat');
$data['collecenter'] = $this->Gallery_Model->nome_funzione();
$this->load->view('paginacollecenter', $data);
}

public function collenord()
{
$cat=$this->input->get('cat');
$data['collenorth'] = $this->Gallery_Model->nome_funzione();
$this->load->view('paginacollenorth', $data);
}

Si noti come ovviamente dietro a ognuna di queste funzioni vi è un metodo specifico del model, ad esempio per SUD:

  public function get_sud()
  {
    $this->db->select('*');
    $this->db->from('gallery');
    $this->db->where('cat', '45');
    $query = $this->db->get();
    return $query->result();
  }

Si noti anche la particolarità di ACTIVE RECORD di estrapolare i dati con la clausola WHERE, così come si noti nel controller la formula Scat= che di fatto va a recuperare il valore della categoria , nel nostro caso 45 in una lista numerata a partire da 1

query modellate direttamente per le esignze di pagine singole

OK funziona anche questa ma allora sei un mostro!!!!
No semmai un fesso, perché per capire come si muove codeigniter su aspetti basici elementari ci ho messo un sacco di tempo, l’importante sarebbe fare un uso massivo della manualistica dedicata buona prassi che viene sempre bistrattata.

Attenti alle autocelebrazioni, torniamo sulla barra di navigazione
Adesso come vado avanti? Impostando una barra di navigazione efficace in cui vedo tutti i miei parametri sui link pronti lì per essere rappresentati a richiesta sulla pagina, per questo abbiamo tagliato il codice della barra e lo abbiamo isolato nella cartella INCLUDES, per avere un maggior controllo sul codice senza commistioni di sorta con altro! Mettere a posto la barra è solo un esercizio statico, verranno aggiunti dei link drop-down (con un menù a tendina), pensato a come organizzare i tag etc etc (probabilmente verrà inserità un’ altra select per richiamare voci specifiche con attinenza storica come “giglio” per esempio)

CONCLUSIONI
A giudicare da http://umbriawayformazione.altervista.org/ci_project_glocal/index.php/ColleGalleryDynamic/collephotodynamics e da come le cose stanno in piedi da sole supportandosi a vicenda sei riuscito a trasformare dati invisibili presenti in un DB adeguatamente preparato in rappresentazione grafica. Questo vuole anche significare che hai passato diverse ore la giornata precedente a COMBATTERE con la TECNOLOGIA per FARLA FUNZIONARE ma alla fine questo giro lo hai vinto tu, di fatto però i problemi che hai risolto paradossalmente sono anche quelli che stai per generare nuovamente. Per esempio ti sei chiesto come impostare una paginazione dopo una query con dati filtrati? Se non lo hai mai fatto, non è come rappresentare una paginazione generica con una SELECT che conta tutti i record sulla pagina principale e che si appoggia su un altro tipo di query, magari centrata su una INNER JOIN, come avviene nel modulo appena creato. Quindi come al solito pensavamo di essere arrivati da qualche parte, invece siamo di nuovo all’ inizio LUNGO e TORTUOSO per nuove esplorazioni che di fatto potranno anche regalarci GRANDI SODDISFAZIONI (sempre che i nuovi problemi che vengono generati con la pratica trovino la loro collocazione!)

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google photo

Stai commentando usando il tuo account Google. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...