FMCorz.info
Le blog d'un geek qui n'en est pas un !

Mot-clé - cakephp

Fil des billets

samedi, août 27 2011

Condition dynamique sur un modèle associé

Lors d'une association telle que hasMany, il est parfois souhaitable de placer des conditions de recherche sur les données associées. Ceci n'est pas faisable directement.

Prenons par exemple un modèle Post ayant beaucoup de Commentaires. Nous souhaitons récupérer tous les Posts où Fred a posté un commentaire.

Avec le snippet suivant, nous allons utiliser un faux champ 'auteur_commentaire' dans nos conditions et dynamiquement faire le travail pour ne retourner que les résultats souhaités.

function beforeFind($query) {

	$auteur_commentaire = false;
	if (isset($query['conditions']['auteur_commentaire'])) {
		$supplier = $query['conditions']['auteur_commentaire'];
		unset($query['conditions']['auteur_commentaire']);
	} elseif (isset($query['conditions'][$this->alias . '.auteur_commentaire'])) {
		$supplier = $query['conditions'][$this->alias . '.auteur_commentaire'];
		unset($query['conditions'][$this->alias . '.auteur_commentaire']);
	}
	if ($auteur_commentaire) {
		$postIds = $this->Commentaire->find('list', array('conditions' => array('Commentaire.auteur' => $auteur_commentaire), 'fields' => array('id', 'post_id')));
		$query['conditions'][$this->alias . '.id'] = $postIds;
	}
	
	return $query;
}

Concrètement nous analysons si la condition auteur_commentaire existe. Si oui, récupérons tous les IDs de posts associés à cet auteur dans la table des commentaires. Ensuite nous rajoutons à notre recherche initiale la condition stipulant les IDs possibles pour les Post. Ceci fait en toute transparence dans votre modèle.

Attention toutefois qu'en terme de performance cela peut devenir une grosse requête lorsqu'il y a plusieurs dizaines de milliers de post associés.

vendredi, août 19 2011

Gestion des permissions Acl dans CakePHP 2.0

Mettre en place la gestion des Acl est déjà bien complexe, y gérer les permissions aussi. C'est pourquoi j'ai développé un plugin pour CakePHP 2.0 qui vous facilitera la tâche.

N'hésitez pas à me donner vos commentaires, remarques ou bugs découverts.

Les sources et instructions se trouvent sur le dépôt Github suivant :

Download ACL Manager pour CakePHP 2.0

jeudi, août 18 2011

Alias et VirtualFields dans CakePHP

Dans CakePHP 2.0 (beta à la date d'aujourd'hui), avoir des VirtualFields peut générer des erreurs lorsqu'un modèle change d'alias.

Pour remédier à ce problème, voici un petit bout de code à placer dans AppModel.

public function getVirtualField($field = null) {
	if (!empty($field) && $this->isVirtualField($field)) {
		if (strpos($field, '.') !== false) {
			list($model, $field) = explode('.', $field);
		}
		return str_replace('{alias}', $this->alias, $this->virtualFields[$field]);
	} else {
		return parent::getVirtualField($field);
	}
}

Ensuite, spécifiez vos virtualFields de la manière suivante :

var $virtualFields = array(
  'name' => "CONCAT({alias}.first_name, ' ', {alias}.last_name)"
);

Ce qui dynamiquement donnera ceci :

var $virtualFields = array(
  'name' => "CONCAT(User.first_name, ' ', User.last_name)"
);

Edit #1 : Gestion du . dans le nom du champ passé à la fonction.