CakePHP

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 »

Cakephp: leggere la configurazione del database

A volte si usano Vendors di terze parti che hanno un proprio accesso al DB, quindi è utile passare i parametri di collegamento al DB specificati in app/config/database.php.

if (class_exists('DATABASE_CONFIG')) {
	$dbconfig =& new DATABASE_CONFIG();
}

$host = $dbconfig->default['host'];
$login = $dbconfig->default['login '];
$password= $dbconfig->default['password'];

Ordinare i risultati con i campi dei model associati ricorsivamente: ORDER BY FIELD.

Il titolo è un po’ contorto, ma non sono riuscito a trovare di meglio.
L’esigenza nasce quando voglio ordinare il risultato di una query che vede interessati vari Model utilizzando un determinato campo per l’ordinamento.
Faccio l’esempio: ho i seguenti model e le seguenti relazioni.

Continent hasMany Country
Country hasMany News

Il modello Continent ha un campo ‘order’ che serve a mantenere un determinato ordine di presentazione per i continenti.
Voglio ottenere una lista di News ordinate per Continent.order.
Poichè il model News ha molte relazioni con altri model (Tag, Area, Comment, ecc. ecc. ), utilizzo il behavior Containable.
A questo punto non è sufficente impostare l’elemento ‘order’ a ‘Continent.order ASC’, perchè la query restituisce un errore. Infatti CakePHP esegue prima una query per ricavare l’elenco delle News e per ogni News ricavata esegue una successiva query per determinare il continente relativo al country.

//
$this->Continent->find('all', array('order' => 'Continent.name')) // Restituisce un errore nell query SQL
//
 

SOLUZIONI
Una soluzione generica che risolve ampiamente il problema è impiegare questo behavior suggeritomi da fzanardo nel forum, ma che non ho personalmente provato.

Una soluzione light invece è la seguente:

// estraggo gli di dei continenti ordinati in base al campo 'order'
$continents = array_keys($this->News->Country->Continent->find('list',array('fields'=>array('id','order'),'recursive'=>-1,'order'=>'order')));

$lista = $this->News->find('all',array(	'conditions'=>$conditions,
												'contain'=>array(
															'Area',
															'Country'=>array('Continent'),
														),
												'order' => array('FIELD(Country.continent_id,'.implode(',',$continents).')')

ORDER BY FIELD(Country.continent_id, 1,4,3,6,5,2) sarà l’impostazione del’ordine che consentirà di ottenere l’ordine voluto, mantenendo la query leggera.
Riferimento: http://cakebaker.42dh.com/2008/06/10/order-by-field/

Attenti al model del plugin in CakePhp

Quando si crea un plugin, si possono utilizzare la maggior parte delle convenzioni comuni, facendo attenzione però al model.
Ad esempio: ho un plugin chiamato categories che mi consente di gestire le categorie strutturate con gerarchia ad albero e in questo plugin dichiaro il model Category.
Se nella mia applicazione voglio creare una relazione con il model Article dovrò fare attenzione di inserire nel campo ‘className’ il nome del plugin anteposto al nome del model, così come nell’esempio riportato qui sotto.

var $belongsTo = array(
        'Category' => array(
            'className' => 'Categories.Category',
            'foreignKey' => 'category_id'
        )
    );

Riferimento al manuale: http://book.cakephp.org/view/117/Plugin-Models

poEdit e i file .ctp

Se si tenta di utilizzare poEdit per la traduzione di file con estensione .ctp inizialmente si ottiene un messaggio del tipo:
“Poedit non ha trovato alcun file nelle directory analizzate”
Se si va in File > Preferenze > Parser e si modifica PHP si può aggiungere una estensione e si avrà una lista del tipo
“*.php;*.ctp”
Ma questo non basta perchè si otterrebbe un messaggio del tipo:
“xgettext: warning:file `users/login’ extension `ctp’ is unknown;will try C”

Per far processare correttamente i file .ctp da poEdit è sufficente aggiungere una riga nel comando del parser.

1. Aprire le preferenze di poEdit
2. Selezionare Parsers e scegliere PHP
3. Modificare il setup del parser PHP. Aggiungere la seguente riga nel comando del parser
(alla fine): –language=php

Riavviare il programma

Estendere un controller

Per estendere un controller è sufficente importare il controller da inserire prima della dichiarazione della nuova classe che ne è l’estensione.

Esempio:

App::import('Controller', 'Nodes');
class ArticlesController extends NodesController {
    var $name = 'Articles';
}

Giusto da far notare che si deve importare “Nodes” e non “NodesController”

Ancora su Auth component

A completamento degli appunti sul component Auth voglio segnalare una serie di tutorial interessanti su Web Developement 2.0

http://www.webdevelopment2.com/cakephp-auth-component-tutorial-1/

http://www.webdevelopment2.com/cakephp-auth-component-tutorial-2/

http://www.webdevelopment2.com/cakephp-auth-component-tutorial-3/

Generare documenti RTF: la soluzione finale ?

E’ risaputo che la strada più semplice per produrre documenti formattati e stampabili nelle applicazioni web è quella di creare un file PDF al volo, usando una delle diverse librerie disponibili (la mia preferita rimane comunque FPDF).
Nelle applicazioni gestionali capita frequentemente che il cliente richieda la produzione di un documento da trattare con MS-Word e che abbia una formattazione predefinita e allora le soluzioni diventano più complesse: si potrebbe pensare a interfacciare PHP con OpenOffice usando ad esempio, la libreria PHP DocWriter oppure usare le funzioni COM per interfacciarsi direttamente a MS-Word.
Queste due strade sono poco percorribili quando l’applicazione deve girare su uno spazio web su server in hosting condiviso per via dell’impossibilità di installare a proprio piacimento librerie o applicazioni aggiuntive.
Ecco allora che una soluzione più facilmente realizzabile è la produzione di un documento RTF con una libreria che, secondo me, è nel panorama open source la più completa in assoluto, la più documentata in assoluto, la più ben fatta in assoluto: PhpRtf (http://www.phprtf.com).
Nonostante la versione attualmente distribuita è la 0.3, questa libreria risulta molto stabile e presenta le funzioni necessarie per creare i principali elementi di un documento RTF: Intestazioni e piè di pagina, tabelle, immagini, link, bordi, sflondi, sessioni…. che altro vi serve ?
Usando la programmazione a oggetti è stata realizzato un set di classi che possono essere usate con molta semplicità e molta flessibilità, grazie anche alla documentazione delle API realizzata con phpDocumentor.
Per creare un documento è sufficente istanziare la classe principale, aggiungere una sezione e cominciare a scrivere del testo nella sezione.
Una comodità che si può apprezzare usando la classe è quella dell’uso di tag all’interno del testo in stile HTML per la formattazione semplice e l’inserimento di elementi quali data corrente e numero di pagina.
L’integrazione con CakePHP è immediata utilizzando la funzione vendor.


vendor("rtf/rtf/Rtf");
$rtf = new Rtf();
$sect = &$rtf->addSection();
$sect->writeText('Hello World.', new Font(12), new ParFormat('center'));
$rtf->sendRtf('Hello World');

Questo è uno dei vari esempi presenti nel sito dal quale trarre spunto.

Creare una lista per la select in CakePHP

Ho bisogno di creare un’array di date per alimentare una select.
Al di là della correttezza progettuale del metodo da me adottato, quanto segue mi serve come “esercizio” nell’uso del metodo find che ha sostituito il generateList ormai deprecato.

Nella mia select vorrei avere un elenco di date, in formato italiano (d-m-Y), ordinate in ordine discendente, che rappresentano tutte le date utilizzate in una tabella nel campo ‘data’.

Una prima soluzione è quella di eseguire una normale query utilizzando il metodo $model->query().
$mylista = $this->$table->query("SELECT news.data, DATE_FORMAT(news.data , '%d-%m-%Y' ) AS `datait` FROM `news` GROUP BY `data` ORDER BY `data` DESC ");
In questo caso si dovrebbero utilizzare i nomi delle tabelle impiegate e non i nomi dei modelli.

La soluzione che utilizza il nome del model è la seguente.
$mylista = $this->$table->find('all',array('fields'=>array("DATE_FORMAT(data , '%d-%m-%Y' ) as datait",'data'),'order'=>'data DESC'));

$mylista è un array che contiene i dati cercati e è sufficente utilizzare combine per ottenre l’array desiderato.
$datelist = Set::combine($mylista,'{n}.News.data','{n}.0.datait');

Successiva »