CakePHP jQuery Helper

Marco Pegoraro, 05 Marzo 2007

In questo articolo presento un helper che aiuta nell'utilizzo di jQuery come supporto alla programmazione client-side (javascript) in un'applicazione CakePHP.

CakePHP è un framework che implementa il paradigma MVC per lo sviluppo di applicazioni web in PHP.

1. Scarica il file:

cakephp_jquery_helper.zip (2k)

2. Installa l'helper:

Copia il file "jquery.php" che trovi nell'archivio zip nella cartella "/app/views/helper/".

Crea il file "/app/app_controller.php" per estendere la classe Controller ed utilizzare il nuovo helper:

class AppController extends Controller {
var $helpers = array('html', 'Jquery');
}

In questo modo gli helpers definiti in questo files verranno automaticamente caricati per ogni controller dell'applicazione. E' tuttavia possibile definire l'utilizzo degli helpers a livello di singolo controller.

3. Utilizza jQuery!

Come accennato inizialmente questo helper permette di utilizzare in modo estremamente semplice jQuery ad i suoi plugins per includere funzionalità client avanzate quali AJAX ed effetti grafici da capogiro.

Innanzitutto scarica l'ultima versione di jQuery e salvala in:
/app/webroot/js/jQuery/jquery.js

Per includere la libreria in un layout (suppongo che il tag HEAD risieda in un layout e non in una vista) si usa la funzione "core()":

<?php echo $jquery->core() ?>
... oppure con Smarty ...
{$jquery->core()}

Successivamente è possibile importare nella pagina i propri script tramite la funzione "run()". Gli script dovranno essere salvati nella cartella "webroot/js" e avere prefisso "jq_":

<?php echo $jquery->run('prova')?>  // Carica "jq_prova.js"
... oppure con Smarty ...
{$jquery->run('prova')}

E' possibile caricare più script in un'unica istruzione separando i nomi degli script con una virgola.

<?php echo $jquery->run('prova,liste')?>
... oppure con Smarty ...
{$jquery->run('prova,liste')}

E' inoltre possibile organizzare i propri script in cartelle e sottocartelle:

<?php echo $jquery->run('comm/chat,media/images')?>
... oppure con Smarty ...
{$jquery->run('comm/chat,media/images')}

L'helper mette a disposizione delle funzioni che permettono di caricare dei files js dipendenti dal controller o dall'azione che si sta richiedendo:

controller()
carica il file "webroot/js/jq_controller_controllername.js". Se la pagina attualmente visualizzata è "http://localhost/cake/posts/read/22" verrà caricato il file js "webroot/js/jq_controller_posts.js".

controllerAction()
carica il file "webroot/js/jq_controller_controllername_action.js". Se la pagina attualmente visualizzata è "http://localhost/cake/posts/read/22" verrà caricato il file js "webroot/js/jq_controller_posts_read.js".

action()
carica il file "webroot/js/jq_action_actionname.js". Se la pagina attualmente visualizzata è "http://localhost/cake/posts/read/22" verrà caricato il file js "webroot/js/jq_action_add.js".

Tutti e tre i metodi non richiedono parametri. Il codice per l'inserimento delle librerie viene prodotto solamente se le librerie esistono.

Utilizziamo i Plugins

Una delle caratteristiche migliori di jQuery è la possibilità di estendere la libreria base attraverso la scrittura di plugins. Solitamente un plugin consiste in un file javascript contenente il codice del plugin stesso.

E' però abbastanza comune trovare un plugin che utilizza un file css predefinito. jQuery helper fornisce un metodo per caricare un plugin in un'unica operazione generando il codice per importare la libreria Js ed i files css anche per diversi tipi di media.

Il metodo per caricare un plugin è "plugin($name, $media)":

<?php echo $jquery->plugin('iwin', 'screen,print')?>
... oppure con Smarty ...
{$jquery->plugin('iwin', 'screen,print')}

Verranno caricati i seguenti files:
/webroot/js/jQuery/pl_iwin/iwin.jquery.js
/webroot/js/jQuery/pl_iwin/screen.css
/webroot/js/jQuery/pl_iwin/print.css

Come si può vedere dal codice qui sopra sono state adottate delle regole di naming che consentono di organizzare i plugin in modo ordinato.

E' anche possibile caricare più plugins con un'unica istruzione:

<?php echo $jquery->plugins('interface,iwin') ?>

In questo codice verrà caricato il css screen in quanto è il media predefinito.

NOTA: Sia per i files javascript che per i css viene sempre controllata l'esistenza. Non viene prodotto il codice di inclusione di files inesistenti in modo da non appesantire inutilmente la pagina prodotta.

Novità della nuova release:

All'interno del codice dell'helper è stata introdotta la variabile di configurazione "wellCode". Tale impostazione, se settata a 1 (o true), forza l'helper nella creazione di codice ordinato, con le corrette interruzioni di riga e con alcuni commenti che ne facilitano la lettura durante il debugging dell'applicazione che si sta realizzando.

A livello di produzione tale variabile deve essere impostata a "0" (o false) per produrre un codice più compatto a sacrificio della leggibilità: velocità di caricamente e costi dell'hosting ne avranno un sicuro vantaggio!

La seconda novità consiste in un blocco SCRIPT che definisce delle variabili globali per l'applicazione JavaScript:

  • __appPath__:  Uri della pagina attualmente caricata.
  • __appBase__: BasePath dell'applicazione. (Ad esempio se ci si trova all'interno di una cartella).
  • __appController__: nome del controller in uso.
  • __appAction__: nome dell'azione in uso.
  • __appPlugin__: nome del plugin in uso (CakePHP plugin)
  • __appLang__: flag della lingua in uso.

L'ultima novità consiste nella creazione del metodo "Ext()" che rappresenta l'inizio del supporto per la libreria Ext. Questa funzionalità è ancora in fase di sviluppo e sarà oggetto delle prossime release.

Commenti all'articolo:

Use Router::url

function core() {
$url = Router::url( '/js/jQuery/jQuery.js' );

return $this->script($url);
}
24/03/2007 00:17
by Grant Cox
Thanks, i will try your solution in a few days.

I was looking for something like this!
24/03/2007 10:08
by thepeg
Molto utile il tuo post. Sto realizzando un gestione e mi piacerebbe sapere se è possibile fare in modo che se da http://localhost/cake/home c'è un link a http://localhost/cake/azione è possibile aggiornare SOLO un pezzo della pagina (contrassegnato da div). Purtroppo ancora ci riesco...
Grazie
24/08/2007 14:35
Devi approfondire la conoscenza di jQuery per effettuare delle chiamate AJAX.

Il mio helper ti aiuta nell'inclusione delle librerie per jQuery e nella strutturazione dei plugins ma poi devi studiare da solo il codice da produrre!

Ciao,
Marco.
24/08/2007 15:12
by thepeg
Grazie Marco,
comunque ho risolto usando $this->render() nel controller.
La cosa che ho notato è che le funzioni Ajax di Cake si basano tutte su prototype e purtroppo non va tanto d'accordo con Jquery, vero?
Ho letto questo:
http://docs.jquery.com/Using_jQuery_with_Other_Libraries
Ma non riesco a risolvere la cosa...
27/08/2007 09:35
CakePHP include un helper per utilizzare prototype però porta a realizzare una programmazione veramente fatta male inserendo codice Javascript nell'html.

Il mio helper per jQuery fornisce solamente delle funzioni per automatizzare il caricamento di librerie e css esterni.

Tutto il codice Javascript utilizzato da una pagina dovrebbe essere riposto in librerie esterne!

Ciao,
Marco.
28/08/2007 12:10
by thepeg
Hai ragione, Cake con Prototype genera un mare di codice javascript nell'html.
Vorrei utilizzare xajax nelle mie applicazioni, sapresti dirmi come fare ad utilizzarlo con Cake?
xajax con Jquery mi sembra la soluzione ideale per applicazioni Ajax con codice pulito.
Ho visto che esiste CakeX ma non mi pare una cosa molto affidabile...
04/09/2007 19:58
Bè, usare xajax non mi sembra una bella idea... Come primo punto ti costringe ad utilizzare parecchio codice javascript nella pagina, punto secondo va contro il modo con cui CakePHP utilizza le url.

jQuery ha incorporata una libreria Ajax di estrema potenza... fai qualche prova... vedrai che in poco tempo inizierai a considerare xajax un semplice giocattolino rispetto alla vera potenzialità di AJAX!

Ciao,
Marco.
05/09/2007 17:18
by thepeg
Ma come faresti a creare SOLO con CakePHP e Jquery un link HTML che aggiorna un div all'interno della pagina senza ricaricarla.
Dopo un check dei dati come faresti solo a colorare gli input che hanno dato errore?.
Sono poco pratico di Cake, puoi darmi qualche dritta per utilizzare solo Jquery.
05/09/2007 19:09
La prima domanda la puoi soddisfare esclusivamente con jQuery mentre la seconda la puoi soddisfare con CakePHP.

Se la settimana prossima avanzerò un po' di tempo cercherò di scrivere un tutorial sull'utilizzo di jQuery in CakePHP (ho pubblicato un helper a tal proposito) e successivamente una serie di lezioni dedicate ai due ambienti.

Ad ogni modo ti consoglio di leggerti a fondo i rispettivi manuali e documentazioni varie...

In ultima vorrei sottolineare che i 2 framework non sono da utilizzarsi INSIEME. CakePHP si occupa di operazioni server-side mentre jQuery si occupa di manipolazione del DOM di una pagina web.

E' possibile utilizzarli al meglio per ottenere delle applicazioni web veramente avanzate.

PS: se non vedi nulla di nuovo inizia a bombardarmi di email perchè sono veramente preso da un paio di grossi progetti e ho la testa a qualche metro dal collo.

Ciao,
Marco.
06/09/2007 11:59
by thepeg
Hi,
can I use this with cakephp 1.2?

cu
28/10/2007 20:58
by dix
@dix: Hi, I never used cakePhp 1.2 but this helper only provide methods for dinamical javascript and css inclusion using only CakePHP's path constants.

I hope it wor fine with booth CakePHP 1.1 and 1.2!
Please test it and post here your opinion.

Thanks,
Marco.
29/10/2007 09:06
by thepeg

Categorie: Php; jQuery; CakePHP;


Aggiungi il Tuo Commento:

Inviando questa risposta dichiaro di aver letto ed approvato le condizioni di utilizzo di questo sito web.

(*) = campo obbligatorio.


Condizioni di Utilizzo:

1 - Tutte le risposte inviate a questo sito saranno sottoposte a moderazione manuale da parte dell'amministratore al fine di evitare il fenomeno detto "SPAM".

2 - Tutti i dati inseriti nel modulo di risposta verranno pubblicati in questa pagina ad eccezione dell'e-mail. Tale informazione viene richiesta ed archiviata dagli amministratori al fine di scoraggiare un utilizzo non consono del blog.

3 - Non utilizzare le risposte per pubblicizzare il tuo sito web. Tale tentativo verrà cancellato dall'amministratore. In ogni caso ai link inseriti nelle risposte viene applicato il "nofollow" per cui non ti portano vantaggi.
Se vuoi possiamo discutere uno scambio link: Srivimi!