CakePHP

Notepad++ : come far riconoscere i file .ctp come .php

Avevo già parlato di come configurare Notepad++ per far riconoscere il codice HTML e PHP presente nei file .ctp, usati da CakePHP per la creazione di templates.

Questa che riporto è una procedura che non richiede la modifica manuale dei file di configurazione di Notepad++

  1. aprire Notepad++ e selezionare dal menu “Configurazione > Configura gli slili …”;
  2. nella colonna “Linguaggio” selezionare “PHP”;
  3. nel campo in basso sotto la colonna “Stile” inserire “ctp”
  4. fare click su Salva & Chiudi
  5. riavviare Notepad++

Ora il codice dei file .ctp verrà interpretato e colorato come fossero file .php

CakePHP: Security.salt e Security.cipherSeed generator

Semplicissima utility che ho scritto per generare automaticamente i due valori da impostare ogni qualvolta si installa CakePHP.

Uso: copia e incolla nel file app/config/core.php sostituendo quelli esistenti.

Per avere un’altra coppia di valori casuali, fare un refresh della pagina. Leggi l’appunto »

Validazione con regole multiple e traduzioni dei messaggi

Per chi deve lavorare pesantemente con le validazioni e deve realizzare un sito multilingua, è utilissimo leggere bene prima questo articolo del grande Mariano Iglesias:
http://bakery.cakephp.org/articles/mariano/2007/05/16/multiple-rules-of-validation-per-field-in-cakephp-1-2

Select multipli (o in cascata) in CakePHP con JQuery e AJAX

E’ un classico problema per i form da utilizzare nelle web application: selezionare in una select un elemento e popolare una seconda select con elementi ottenuti dalla scelta della prima.
Il tipico esempio è quello della scelta del Comune: per facilitare la vita all’utente gli si chiede di selezionare la provincia in una prima select per poi scegliere nella seconda tra i comuni della sola provincia selezionata.
Tra i vari modi di ottenere delle select in cascata, ho scelto di sfruttare JQuery, ma soprattutto gli oggetti messi a disposizione da CakePHP nella versione 1.3 per accedervi facilmente.

Installazione di JQuery

Si potrebbe scaricare la libreria sul proprio server e richiamarla da lì, ma preferisco richiamarle dal repository di Google.

echo $this->Html->script(array('https://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js'));

per inserirla nel layout, oppure

$this->Html->script(array('https://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js'),false);

da utilizzare occasionalmente nella view.

Nel layout

Si deve aggiungere un comando per la scrittura della cache degli script prima del tag di chiusura

echo $this->Js->writeBuffer(); // Write cached scripts

Nel controller

Immaginiamo di dover scegliere la città per un utente, quindi nel controller Users richiamiamo l’heleper

var $helpers = array('Js' => array('Jquery'));

Popoliamo la prima select con i nomi delle province (districts)

	function add(){
		$this->set('districts',$this->User->City->District->find('list'));
	}

Per ottenere l’elenco delle città in base alla provincia selezionata si deve creare un metodo del controller Cities

function getCities(){
		$this->layout="ajax";
		$district_id = $this->data['City']['district_id'];
		$cities = $this->City->find('list',array('conditions'=>array('City.district_id'=>$district_id)));
		$this->set('cities',$cities);
}

Nella view Cities/getCities

foreach($cities as $k=>$v){

	echo "


";

}

Nella view Users/add

echo $this->Form->create();
echo $this->Form->input('district_id',array('empty'=>true));
echo $this->Form->input('city_id',array('type'=>'select'));
echo $this->Form->end('Invia');

A questo punto bisogna inserire il codice JQuery che attiva il meccanismo, ma lo facciamo utilizzando i metodi del component JS.
Inserire prima del form il seguente codice:

$this->Js->get('#UserDistrictId')->event('change',
				$this->Js->request(array('controller'=>'cities','action' => 'getCities'),
						array(
							'method' => 'POST',
							'type'=>'json',
							'async' => true,
							'update' => '#UserCityId',
							'dataExpression'=>true,
							'data'=>$this->Js->serializeForm(array('isForm' => true, 'inline' => true))
						)
					)
			);

Fare attenzione al nome delle select interessate, utilizzando la notazione CSS per la loro identificazione ‘#nomecampo’ e la convenzione di CakePHP.

CakePHP: un campo data con i mesi in italiano

Volendo utilizzare un campo data, quello con le select per giorno mese e anno, avendo i nomi dei mesi in italiano, è sufficente sfruttare l’opzione offerta dalla funzione.

$mesi = array('Gennaio', 'Febbraio', 'Marzo', 'Aprile', 'Maggio', 'Giugno','Luglio','Agosto', 'Settembre', 'Ottobre', 'Novembre', 'Dicembre');
echo $this->Form->input('datanascita', array('type'=>'date','label'=>'Data di nascita', 'dateFormat'=> 'DMY', 'monthNames'=>$mesi));

Come ottenere una lista di tutti i componenti e relative actions

Grazie a questo component, è facilissimo !

http://cakebaker.42dh.com/2006/07/21/how-to-list-all-controllers/

Behavior Linkable: dove non arriva Containable

Grazie al suggerimento di Tox che ha + fiuto del cane di Lycos nello scovare risorse in rete, ho provato il LinkableBehavior per risolvere un problema con una query che con Containable non riuscivo a rendere efficente.

Problema

Ho il seguente schema di modelli:
Regions hasMany District hasMany City hasMany Customer.
Ho necesità di ottenere l’elenco dei clienti (Customer) che risiedono nella provincia (District) di Torino (id=1).

Soluzione con LinkableBehavior

Model:

var $actsAs = array('Linkable');

Codice:

$customers = $this->District->City->Customer->find('all',array(
        'link'=>array('City'=>array('District')),
        'conditions'=>array('District.id'=>$id),
        'fields'=>array('Customer.id','Customer.nome','Customer.cognome','City.name')))

Risultato:


Array
(
    [0] => Array
        (
            [Customer] => Array
                (
                    [id] => 1
                    [nome] => Giuseppe
                    [cognome] => De Santis
                )

            [City] => Array
                (
                    [name] => Buttigliera Alta
                )

        )

)

Query eseguita (unica):

SELECT `Customer`.`id`, `Customer`.`nome`, `Customer`.`cognome`, `City`.`name` FROM `customers` AS `Customer` LEFT JOIN `cities` AS `City` ON (`City`.`id` = `Customer`.`city_id`) LEFT JOIN `districts` AS `District` ON (`District`.`id` = `City`.`district_id`) WHERE `District`.`id` = 1

Meglio di così….

Risorsa utile: http://planetcakephp.org/aggregator/items/891-linkable-behavior-taking-it-easy-in-your-db

Effetti JQuery in CakePHP 1.3

Con CakePHP 1.3 è possibile sfruttare altri framework Javascript oltre all’accoppiata Prototype/Scriptaculous utilizzando il JsHelper.
Per utilizzare JQuery è sufficiente seguire le istruzioni del manuale on line http://book.cakephp.org/view/1592/Js che riassumo di seguito.

  1. Scaricare JQuery http://docs.jquery.com/Downloading_jQuery
  2. Copiare gli script in app/webroot/js
  3. Includere la libreria in tutte le pagine. Per fare questo si può modificare il file /app/views/layout/default.ctp inserendo il codice
    echo $this->Html->script('jquery-1.4.2.min'); 

    nella sezione <head></head>.

  4. Includere il seguente comando
    echo $js->writeBuffer();

    prima del tag </body>

  5. Richiamare il JsHelper inserendo il seguente codice nel controller
    var $helpers = array('Js' => array('Jquery'));

A questo punto siamo pronti per utilizzare gli effetti di JQuery nelle nostre views

Nella view inseriamo il seguente codice che permette di mostrare o nascondere un DIV con effetto slide.
Creiamo i link e il box

<a href="#" id="apri">Apri il box</a> | <a href="#" id="chiudi">Chiudi il box</a>
<div id="box" style=" border: 1px solid green; height:200px; width:100px; display:none"></div>

e poi aggiungiamo il codice PHP

 $apri = $js->get("#box")->effect('slideIn');
 $chiudi = $js->get("#box")->effect('slideOut');
 $js->get("#apri")->event('click', $apri );
 $js->get("#chiudi")->event('click', $chiudi );

Volendo includere un effetto non disponibile con JsHelper è possibile inserire del codice nativo JQuery e riutilizzarlo nel seguente modo

$codice = '$("#box").toggle("blind",{},500);';
$js->get("#toggle")->event('click', $codice );

Notepad++ : come far riconoscere l’HTML nei template .ctp e .thtml0

Un editor leggero e veloce che uso al posto del classico blocco note e anche per eseguire delle piccole modifiche su semplici progetti.
Per progetti in php + complessi uso Eclipse con plugin legati al PHP.

Utilizzando massicciamente i template con i vari sistemi da me utilizzati (Smarty, CakePHP, ecc), mi trovo di fronte a estensioni del tipo tpl, thtml, che non contengono altro che codice HTML, ma che non sono riconosciuti dall’editor come tali e quindi non viene attivata la colorazione del codice.

Per Notepad++ è sufficente aggiungere l’estensione nel file langs.xml che si trova nella directory di installazione del programma.

La dove è definito il linguaggio html

E’ sufficente aggiungere le estensioni da associare all’HTML

e poi registrare le due estensioni selezionando da menu:

CONFIGURAZIONE > OPZIONI > ASSOCIAZIONE TIPI DI FILE > CUSTOMIZE

e inserire nel campo le estensioni “thtml” e “ctp” per poi trasferirle con la freccietta

Impostazioni di Notepad++

Per abilitare la gestione in Dreamweaver, potete seguire questo tutorial: http://www.techwave.it/blog/2010/03/09/visualizzare-i-files-thtml-e-ctp-in-dreamweaver/

Controllare lo stato di un campo con AJAX e CakePHP

Foto di Danilo Rizzuti

Foto di Danilo Rizzuti

Immaginiamo di avere un form con una select che mi permette di selezionare la nazione a cui fa riferimento l’articolo.
Voglio consentire che l’utente traduca la nazione selezionata nella sua lingua nativa senza uscire dalla compilazione del form.
Leggi l’appunto »

Successiva »