Tag: cakephp

CakePHP: caching semi automatico delle query tramite AppModel

23 gennaio 2012Categoria:database | php

In un precedente articolo è stata mostrata una semplice struttura per salvare i dati in cache da controller.
Per automatizzare questa funzionalità e scrivere meno codice è possibile centralizzare le funzioni necessarie all’interno della classe AppModel.

La classe contiene:

  • una variabile $cache_key per impostare la chiave per il salvataggio in cache
  • una funzione findCached() da richiamare con gli stessi parametri della funzione find() standard che ritorna i risultati salvati in cache oppure, nel caso in cui non ci siano risultati salvati, esegue la funzione find()
  • il callback afterFind() per salvare i risultati in cache dopo la prima esecuzione della query

Ed ecco la classe completa con i commenti necessari per comprenderne il funzionamento:

Leggi tutto…

CakePHP Paginator: ordinamento in base a un campo Translated

6 dicembre 2011Categoria:database | php

Nel caso in cui si utilizzi il Paginator Helper e si vogliano ordinare i risultati in base ad un campo tradotto con Tranlsate Behavior

var $actsAs = array(
    'Translate'=> array(
        'name'
    )
);

si deve utilizzare all’interno delle view la funzione sort in questo modo

echo $paginator->sort('name','I18n__name.content');

e aggiungere  nell’AppModel la seguente funzione (testato in CakePHP 1.3):

function hasField($fieldName) {
    if (parent::hasField($fieldName))
        return true;
    else
        switch ($fieldName) {
            case "content":
                return true;
            default:
                return false;
        }
    return false;
}

CakePHP: paginazione con condizioni su campi tradotti

30 novembre 2011Categoria:php

Per eseguire la paginazione in CakePHP utilizzando delle condizioni sui campi tradotti (Translate Behavior) è necessario aggiungere alcune funzioni nell’app_model (testato nella versione 1.3):

var $usePaginateMethod = 'standard';
function setPaginate($method=''){
    if (empty($method)){
        $this->usePaginateMethod = 'standard';
    }else{
        $this->usePaginateMethod = $method;
    }
}

function paginateCount($conditions, $recursive, $extra){
    switch ($this->usePaginateMethod) {
        case 'standard':
            return $this->standardPaginateCount($conditions, $recursive, $extra);
        break;

        case 'custom':
        return $this->customPaginateCount($conditions, $recursive, $extra);
        break;
    }
}

function standardPaginateCount($conditions, $recursive, $extra){
    $results = $this->find('count', compact('conditions', 'recursive', 'extra'));
    return $results;
}

function customPaginateCount($conditions, $recursive, $extra){
    $results = $this->find('all', compact('conditions', 'recursive', 'extra'));
    $count = count($results);
    return $count;
}

Leggi tutto…

CakePHP : cronometrare la propria applicazione

21 ottobre 2011Categoria:php

In un’applicazione possono esserci dei punti critici che ne rallentano l’esecuzione; nelle applicazioni web molto spesso capita in presenza di query molto pesanti al database e magari non ottimizzate oppure nel caso di chiamate ad API che si connettono a servizi esterni.

Per capire dove l’applicazione “rallenta” è utile inserire dei punti di controllo all’interno delle varie funzioni (soprattutto quelle più critiche) per visualizzare in fase di debug  i tempi impiegati per l’esecuzione e capire subito dove si deve intervenire.

Come prima cosa inserire nell’AppController le seguenti funzioni (o creare l’AppController se non c’è già): Leggi tutto…

CakePHP: estrarre in automatico le stringhe da tradurre tramite console (Windows)

9 settembre 2011Categoria:php

1) Configurare le variabili d’ambiente aggiungendo alla fine della stringa Path:

;C:\xampp\php\

Cambiando il percorso della cartella php in base alla propria installazione.

2) Tramite linea di comando posizionarsi nella cartella “app” della propria applicazione, es:

cd C:\xampp\htdocs\vhosts\pilosio\app

Leggi tutto…

CakePHP: una semplice struttura per salvare i dati in cache via controller

8 settembre 2011Categoria:php

Ecco una struttura molto semplice per gestire via controller i dati da salvare in cache:

//imposta identificativo dei dati salvati in cache
$cache_id = 'contenuto_xyz';
//imposta un prefisso per la cache costituito da LINGUA_mycache_
Cache::set(array('prefix' => Configure::read('Config.language').'_mycache_'));
//cerca i dati. se la chiave della cache non è impostata, se è scaduta
//o si verifica un errore durante la lettura $data sarà == false
$this->data[$cache_id] = Cache::read($cache_id);
//se i dati non sono in cache
if ($this->data[$cache_id] === false) {

    /*   INIZIO RICERCA/ELABORAZIONE DATI  */
    $data = $this->XYZ->find('all');
    /*  FINE RICERCA/ELABORAZIONE DATI  */

    //scrittura dell'elemento in cache
    Cache::set(array('prefix'=>Configure::read('Config.language').'_mycache_'));
    Cache::write($cache_id, $data );
}
//imposta la variabile con i dati
$this->data[$cache_id] = $data;

Leggi tutto…

CakePHP: eseguire ricerche sui campi tradotti (Translate Behavior)

6 settembre 2011Categoria:php

CakePHP permette di gestire la traduzione dei campi del DB tramite Translate Behavior.
Ad esempio se abbiamo un Model chiamato Elements definito nel seguente modo:

class Element extends AppModel {

}

Possiamo impostare che i campi title e description siano trattati come traduzioni:

Leggi tutto…

CakePHP: creazione di un modello on the fly

27 giugno 2011Categoria:php

Durante lo sviluppo di un’applicazione con CakePHP può essere necessaria la creazione di un modello “al volo” non definito a priori come classe.

Ecco come fare con poche righe di codice:

Leggi tutto…

CakePHP: modificare dinamicamente i parametri di connessione al database

23 aprile 2011Categoria:database | php

In CakePHP i parametri per la connessione al database vengono impostati all’interno della classe DATABASE_CONFIG (file: app/config/database.php).
Per modificare i paramentri dinamicamente è possibile utilizzare la classe ConnectionManager.

Supponendo di dover modificare il prefisso delle tabelle ad esempio:

App::Import('ConnectionManager');
$ds = ConnectionManager::getDataSource('data_source_da_modificare');
$ds->config['prefix'] = $nuovo_prefisso;

Nel caso in cui si voglia creare un nuovo datasource invece di sovrascriverne uno esistente si deve utilizzare il metodo create() del ConnectionManager:

App::Import('ConnectionManager');
$ds = ConnectionManager::getDataSource('data_source_da_modificare');
$new_ds = $ds->config;
$new_ds['prefix'] = $nuovo_prefisso;
ConnectionManager::create('nome_nuovo_datasource', $new_ds);

CakePHP: visualizzare e nascondere il contenuto del debugger SQL con jQuery

2 marzo 2011Categoria:php

Impostando il livello di debug a 2 in CakePHP  è possibile visualizzare tutte le query SQL eseguite dall’applicazione.
Per non visualizzare sempre tutto è possibile utilizzare una semplice funzione jQuery per permettere il toggle del contenitore di debug.
Ecco il codice da inserire nel layout:

<?php if (Configure::read('debug') == 2) { ?>
	<style type="text/css">
		.cake-sql-log { display: none; }
	</style>
	<script language="javascript">
		<!--
		$(document).ready(function() {
			$("#sql_toggle").click(function(event) {
				event.preventDefault();
				$('.cake-sql-log').toggle();
			});
		});
		-->
	</script>
	<a href="#" id="sql_toggle">[Visualizza/Nascondi SQL]</a>
	<? echo $this->element('sql_dump'); ?>
<?php } ?>

NOTA: la classe cake-sql-log è per la versione 1.3 di cakePHP, per versioni differenti modificare con la classse corretta.