Question : comment vérifier, lors de la soumission d'un formulaire, qu'une valeur n'est pas déjà présente en base ?
Rappel : avec CakePHP, une règle existe déjà de base pour effectuer ce type de vérification :
'monchamp' => array(
'rule' => 'isUnique',
'message' => 'Nom déjà utilisé'
));
Solution : et maintenant, la solution que j'ai pondue (testée mais bon, on est pas à l'abri des erreurs alors si vous en voyez, hésitez pas à me le signaler).
require_once 'Zend/Validate/Abstract.php';
require_once 'Zend/Db/Table/Abstract.php';
class Fxc_Validate_Unique
extends Zend_Validate_Abstract
{
const ALREADY_EXISTS = 'alreadyExists';
protected $_modelName;
protected $_tableName;
protected $_fieldName;
protected $_rowPk;
protected $_messageVariables = array(
'table' => '_tableName',
'field' => '_fieldName'
);
protected $_messageTemplates = array(
self::ALREADY_EXISTS => "'%value%' already exists in: '%table%.%field%'",
);
/**
* Initialise les attributs
*
* @param string $modelName Nom du modèle
* @param string $fieldName Nom du champ
* @param array $rowPk Valeurs permettant d'identifier l'enregistrement en cours de modification
*/
public function __construct($modelName, $fieldName, Array $rowPk = array())
{
$this->_modelName = (string)$modelName;
$this->_fieldName = (string)$fieldName;
$this->_rowPk = $rowPk;
}
/**
* Vérifie que $this->_tableName.$this->_fieldName ne contient pas déjà la valeur $value
*
* @param string $value
* @return boolean
*/
public function isValid($value)
{
$this->_setValue((string)$value);
$table = new $this->_modelName(); // je suppose que ça plante ici si l'autoload n'est pas activé
$this->_tableName = $table->info(Zend_Db_Table_Abstract::NAME);
$tablePk = $table->info(Zend_Db_Table_Abstract::PRIMARY);
$select = $table->select()->where($this->_fieldName . ' = ?', $value);
// si la vérification concerne un enregistrement en cours de modification
if (array() !== $this->_rowPk) {
// on indique de ne pas prendre en compte cet enregistrement dans la recherche
foreach ($tablePk as $pk) {
if (isset($this->_rowPk[$pk])) {
$select->where($pk . ' != ?', $this->_rowPk[$pk]);
} else {
throw new Exception('Fxc_Validate_Unique: a primary key value is missing');
}
}
}
$row = $table->fetchRow($select);
if ($row === null) {
return true;
} else {
$this->_error(self::ALREADY_EXISTS);
return false;
}
}
}
On a pas accès aux autres données soumises via le formulaire donc il faut savoir en amont si on est en ajout ou en modif. Si on est en modif, passer au validateur les valeurs de clés primaires...
y a pas à dire, au niveau de la partie Modèle, CakePHP écrase très largement ZF (avis fondé sur d'autres expériences que ce simple exemple, je vous rassure)
Articles similaires
- XAware, l'intégration de données open source
- Quand un habitué de Prototype teste jQuery - part. 2 : suite et fin
- Quand un habitué de Prototype teste jQuery - part. 1 : un problème de taille
- Petit bug jQuery / TinyMCE
- Validateur W3C en local sous Mac OSX
- BOUML - qui a dit qu'UML n'était pas BO?
- Commentez vos fichiers source automatiquement grâce aux keywords Subversion
- TextMate - Afficher certains dossiers cachés
- CakePHP : sauts de ligne et maux de tête
- Diaporama automatique avec Lightbox



ouch !
ça donne pas envie de passer à ZF !
c'est le fan de CakePHP qui parle ;)