group by

Quante volte vi è capitato di dover fare una semplice group by per contare le righe di una tabella raggruppate per una data colonna? Per intenderci, quello che si fa in maniera semplicissima in SQL con

SELECT TYPE,COUNT(*) AS num FROM card GROUP BY TYPE;

Purtroppo con Propel la cosa non appare subito immediata. Ecco quindi un prezioso metodo da aggiungere alla vostra classe Peer per poterlo fare in modo semplice. Prima di tutto occorre inserire una nuova proprietà $count nel vostro modello (che nel mio esempio si chiama “Card”), con relativi getter e setter:

1
2
3
4
5
6
7
8
9
10
11
protected $count;
 
public function getCount()
{
  return $this->count;
}
 
public function setCount($count)
{
  $this->count = $count;
}

Ecco quindi il pezzo forte, in CardPeer (ricordate sempre che va adattato secondo il nome del vostro modello):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/**
 * grouped select
 * @param  Criteria $c
 * @param  string   $column
 * @return array
 */
public static function doSelectGroupBy(Criteria $c = null, $column)
{
  if (empty($c))
  {
    $c = new Criteria;
  }
  self::addSelectColumns($c);
  $c->addGroupByColumn($column);
  $c->addAsColumn('cnt', 'COUNT(*)');
  $stmt = self::doSelectStmt($c);
  $cards = array();
  while ($row = $stmt->fetch(PDO::FETCH_NUM))
  {
    $card = new Card;
    $col = $card->hydrate($row);
    $card->setCount(($row[$col] !== null) ? (int) $row[$col] : null);
    $cards[] = $card;
  }
  return $cards;
}

Ecco infine un esempio di utilizzo:

1
$cards = CardPeer::doSelectGroupBy(null, CardPeer::TYPE);

personalizzare i filtri nel backend

La generazione automatica dei moduli di backend è bellissima, ma a volte c’è da sistemare qualche dettaglio a mano. Un caso esemplare è la form dei filtri, che purtroppo resta in inglese anche se la localizzazione è stata abilitata. Ma con qualche riga aggiuntiva nella classe filter relativa, possiamo metterla facilmente in Italiano (o anche personalizzarla ulteriormente). Innanzitutto occorre individuare la classe giusta: se ad esempio il vostro modello si chiama “BlogPost”, dovete modificare il file lib/filter/BlogPostFilter.class.php. Aprite dunque il file, ed inserite queste righe all’interno del metodo configure():

1
2
3
4
5
$this->widgetSchema['created_at']->setOption('template', 'da %from_date%<br /> a %to_date%');
$this->widgetSchema['created_at']->getOption('from_date')->setOption('format', '%day%/%month%/%year%');
$this->widgetSchema['created_at']->getOption('from_date')->setOption('empty_values', array('year' => 'anno', 'month' => 'mese', 'day' => 'giorno'));
$this->widgetSchema['created_at']->getOption('to_date')->setOption('format', '%day%/%month%/%year%');
$this->widgetSchema['created_at']->getOption('to_date')->setOption('empty_values', array('year' => 'anno', 'month' => 'mese', 'day' => 'giorno'));

come si può capire facilmente dal codice, non solo abbiamo messo le etichette in Italiano, ma abbiamo anche invertito l’ordine di mese e anno, portandolo nella forma che ci è più consona.
Ovviamente le opzioni viste sopra si possono applicare anche ad un eventuale campo “updated_at”, o a qualsiasi altro campo di tipo data.

Symfony e Dreamhost

Utilizzare Symfony dalla shell con Dreamhost spesso porta a ricevere oscuri errori in console come il seguente:

~/dh$ php symfony

Parse error: syntax error, unexpected T_STATIC, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in /home/user/domain.com/data/symfony/bin/symfony.php on line 42

il problema dipende dal fatto che la console dell’hosting provider utilizza php4, anche se il vostro dominio funziona con php5.

Per risolverlo la soluzione più semplice è di richiamare staticamente l’interprete di php5 con il seguente percorso

~/dh$ /usr/local/php5/bin/php symfony

alternativamente è possibile crearsi un alias modificando il file .bash_profile del vostro utente aggiungendo la seguente riga:

alias php5='/usr/local/php5/bin/php'

e richiamando quindi symfony usando la più comoda sintassi:

~/dh$ php5 symfony

Svuotare la cache di Symfony da ogni directory del progetto

Emiliano ci suggerisce un tip utile se usate linux come piattaforma di sviluppo. Si tratta di un piccolo script che permette di svuotare la cache di Symfony da qualsiasi directory di un progetto.

Basta aprire /etc/profile ed inserire al suo interno

alias scc="cd \$(pwd | sed -e \"s#^\(/var/www/[^/]\+\).*#\1#\") && symfony cc ; cd -"

a questo punto basterà digitare da console scc e se si è in una sottodirectory di un progetto di symfony magicamente la cache si svuoterà (a patto di avere ovviamente i progetti di symfony in /var/www)!