Podpowiedź otrzymałem na php.pl:
Kod:
public function configure()
{
// (...)
$this->validatorSchema->setPostValidator(
new sfValidatorCallback(array(
'callback' => array($this, 'checkUniqueness'),
'arguments' => array(
'model' => 'ProduktPartner',
'multiple_column' => 'jezyki_logo',
'columns' => array('partner_logo', 'seria_logo', 'jezyki_logo')
))));
}
public function checkUniqueness($validator, $values, $aArguments)
{
//Dla każdej wartości z kolumny multiple_column, która może mieć wiele wartości sprawdza istnienie obiektu
foreach ($values[$aArguments['multiple_column']] as $one_of_many)
{
$criteria = new Criteria();
//Generuje kryteria oddzielnie dla każdej wartości multiple_column
foreach ($aArguments['columns'] as $column)
{
$colName = call_user_func(array(constant($aArguments['model'].'::PEER'), 'translateFieldName'), $column, BasePeer::TYPE_FIELDNAME, BasePeer::TYPE_COLNAME);
if($column != $aArguments['multiple_column'])
$criteria->add($colName, $values[$column]);
else
$criteria->add($colName, $one_of_many);
}
//Sprawdza w bazie istnienie takiego obiektu
$object = call_user_func(array(constant($aArguments['model'].'::PEER'), 'doSelectOne'), $criteria);
//Jeśli istnieje wyrzuca wyjątek
if(is_object($object))
{
$error = new sfValidatorError($validator, sprintf('An object with the same %s "%s" already exist.', $aArguments['multiple_column'], $one_of_many));
throw new sfValidatorErrorSchema($validator, array('' => $error));
}
}
return $values; // Jeśli wyjątek nie został rzucony to skrypt zwraca tablicę z przesłanymi wartościami
}