Dare lo scacco matto del barbiere a CODEIGNITER per inserire risorse esterne seguendo la logica MVC del framework

Scacco e poi Matto!

Dare lo scacco matto del barbiere a CODEIGNITER per inserire risorse esterne seguendo la logica MVC del framework

Ottobre 20, 2020 codeigniter 0

Quando si lavora su progetti concreti saltano fuori tantissimi problemi pratici che nessun manuale di 400 pagine sulla tecnologia potrà mai aiutarci a risolvere e questo è normale perché ogni progetto è unico e le situazioni non sono tutte standardizzabili. Spesso persino i tutorial presenti in rete mostrano delle gravi lacune , nel senso che si va incontro a grandi spiegazioni altisonanti ma manca l’approccio PASSO-PASSO del risolvo i problemi alla WOLF per cui la domanda COME FACCIO A rimane senza risposte. Qualche altra volta trovi qualcuno che incontrando il tuo problema é riuscito a risolverlo e a divilgarlo mostrando grande cura per la risoluzione. Quindi grazie a questo qualcuno vediamo come è stato risolto il problema del titolo. La questione di base é la seguente: non voglio integrare script JS e script CSS all’ interno della pagina, ma voglio usare dei link da mettere nell’ header, come devo fare visto che MVC Codeigniter è estremamente perverso nelle sue logiche URL? Mettiamo il caso di avere locandine di film tutte di varia dimensione presenti nella mia home page e che io voglia modellare uno stile dove si evince che le dimensioni devono essere uguali per tutti gli elementi grafici, come faccio? Di fatto sarebbe semplicissimo perché potrei inserire nalla stessa pagina un semplice:

img {
width: 160px;
height: 210px;
}

tra i tag <STYLE> e </STYLE> ma abbiamo detto che le risorse devono stare all’ esterno della pagina per alleggerire il caricamento. Quindi vediamo una situazione reale, semplificata, nel senso proprio di generiamola staccandola come quesito elementare dall’ applicativo complesso che stavamo costruendo. Se funzionerà poi la inseriremo nella nostra galley western che tra l’altro ha delle funzioni JQuery che necessitano di lavorare con delle SELECT per far scorrere delle informazioni dai menù a tendina.

Prima cosa da fare creare tutto quello che serve:

All’ altezza di APPLICATION (e non dentro erroneamente come facevo io creando confusioni di PATH!) creo la cartella risorse dove metto le cartelle

IMG
CSS
JS

la cartella IMG contiene i miei formati grafici da inserire nella pagina
la cartella CSS conterrà quindi nel file assets.css senza i tag style:

img {
width: 160px;
height: 210px;
}

la cartella JS qui contiene solo una semplice funzione che richiamerà un ALERT:

function assets() {
alert(‘test’);
}

da notare la mancanza di fantasia, per non confondermi cerco di indicare una funzionalità che posso riportare al nome delle funzioni. A questo punto sappiamo che il cuore di tutto é il controller, quindi creo un bel file dentro CONTROLLERS di nome assets.php dove al suo interno definisco una classe che indovinate come si chiama? Vediamo il contenuto:

<?php
class Assets extends CI_Controller {

public function index() {
$this->load->helper(‘url’);
$this->load->view(‘assets_view’);
}
}
?>

Estremamente importante per rispondere alla domanda del titolo l’istruzione $this->load->helper(‘url’); perché se la facessi diventare //$this->load->helper(‘url’); il codice in esecuzione sulla rispettiva pagina vista che andrò a creare di nome assets_view.php mi darebbe un errore che spiega bene l’inghippo e cioé:

An uncaught Exception was encountered

Type: Error

Message: Call to undefined function base_url()

Filename: C:\xampp\htdocs\fwd_assets\application\views\assets_view.php

Line Number: 7

Backtrace:

File: C:\xampp\htdocs\fwd_assets\application\controllers\assets.php
Line: 6
Function: view

File: C:\xampp\htdocs\fwd_assets\index.php
Line: 315
Function: require_once

OSSIA NON POSSO fare la chiamata a base_url()

Che cosa é questo base_url()? Andando nel file config.php presente dentro la cartella CONFIG di APPLICATION (noi sviluppatori lavoriamo prevalentemente qui) dobbiamo indicare la stringa URL BASE e cioé nel nostro caso il tutto diventa:

$config[‘base_url’] = ‘http://localhost/fwd_assets/’;

Attenzione alle numerose DISTRAZIONI che generano errori perché se omettessi lo / finale potrei lottare CONTRO I MULINI A VENTO PER ORE. oK ADESS IL MESSAGGIO DI ERRORE SAPPIAMO CHE SI RIFERISCE A QUESTA STRINGA DI CONFIGURAZIONE ma l’errore è altrove, ossia nel fatto che non ho caricato l’istruzione del controller ASSETS:

$this->load->helper(‘url’);

OK, quindi a questo punto diamo un occhiata alla nostra pagina statica dove spediamo i comandi:

<!DOCTYPE html>
<html lang = “en”>

<head>
<meta charset = “utf-8”>
<title>CodeIgniter View Example</title>
<link rel = “stylesheet” type = “text/css” href = “<?php echo base_url(); ?>assets/css/img.css”>
<script type = ‘text/javascript’ src = “<?php echo base_url(); ?>assets/js/alert.js”></script>
</head>

<body>
<center><a href = ‘javascript:assets()’>Click Here</a> to execute the javascript function</center>

<div style=”float:left;”>
<img src=”<?php echo base_url(); ?>assets/images/4figli.jpg”>
<img src=”<?php echo base_url(); ?>images/ballata.jpg”>
<img src=”<?php echo base_url(); ?>images/chisum.jpg”>
<img src=”<?php echo base_url(); ?>images/comancheros.jpg”>
<img src=””>
</div>
</body>

</html>

Da notare nei link che solo la prima pagina sarà visualizzata , mentre mandando in esecuzione:

http://localhost/fwd_assets/index.php/assets

attenzione perché digitando solo http://localhost/fwd_assets/ il controller aqttivato sarebbe quello di default definito nel file router.php mentre qui abbiamo da lanciare la nostra applicazione; in ogni caso apprezzeremo sicuramente anche come la risorsa javascript esterna sia stata attivata. Ovviamente per far vedere correttamente tutte le immagini dovrò inserire al path il nome della cartella che contiene le risorse, come avviene direttamente nel primo caso:

<img src=”<?php echo base_url(); ?>assets/images/4figli.jpg”>

Abbiamo provato anche a pasticciare sulle route del file routes.php ma abbiamo verificato che non sono necessarie aggiunte a sostegno per far funzionare il tutto in locale. Spesso queste semplici operazioni di integrazioni per risorse esterne creano problemi non da poco e ci si ritrova a bere del whisky al roxy bar, nel senso che magari per una semplice-sciocchezza non si porta a casa il risultato /errati path digitati o mancanza di visione sui livelli o errate sintassi. Una volta messa in piedi questa scomposizione base sarà un giochetto da ragazzi capire come mai il nostro applicativo non funziona: hai importato l’helper ? Hai inserito il giusto valore per la costante base_url() ? Così scopriamo che a parità di condizioni la legge di gravità vale per tutti e che i problemi si possono risolvere! Questo anzichè scoraggiargi contribuirà a rafforzare quel pedigree professionale che è basato sulla lotta e la costanza applicativa e soprattutto sulla generazione degli errori! In ogni caso avventurarsi nello studio di una tecnologia uscendo dai canoni é consigliato: se vuoi costruirti qualcosa che assolve a una funzionalità e che ti risolve un problema, imparare sbattendo la testa e anche studiare parallelamente é consigliabile. Ad esempio che cosa sono gli HELPER di codeigniter? Cercando in rete da MRW.IT scopriamo che:

Gli Helpers sono appunto degli “aiutanti”, cioè dei costrutti forniti nativamente dal framework CodeIgniter che mettono a disposizione strumenti per rendere più semplice la vita degli sviluppatori nella creazione delle proprie applicazioni. Gli Helpers si presentano come delle raccolte di funzioni dedicate a particolari ambiti di utilizzo, per cui vi saranno Helpers ideati appositamente per la gestione degli array, dei file e delle directory, delle date, delle sessioni e dei cookies, dei form, della posta elettronica e molti altri. Gli Helpers messi a disposizione da CodeIgniter, a differenza di costrutti simili forniti da altri frameworks, non sono realizzati sulla base del paradigma OOP (Object Oriented Programming o Programmazione Orientata agli Oggetti) ma sulla base dell’approccio procedurale, sotto forma di comuni funzioni;