/**
* Add fallback query criteria to $criteria
*
* @param Criteria $criteria
* @param array $options
* @return QubitQuery array of objects
*/
public static function addFallbackCriteria($criteria, $fallbackClassName, $options = array())
{
if (isset($options['culture'])) {
$culture = $options['culture'];
} else {
$culture = sfContext::getInstance()->user->getCulture();
}
// Expose class constants so we can call them using a dynamic class name
$fallbackClass = new ReflectionClass($fallbackClassName);
$fallbackClassI18n = new ReflectionClass("{$fallbackClassName}I18n");
// Add fallback columns (calculated)
$criteria = self::addFallbackColumns($criteria, $fallbackClassI18n->getName());
// Get i18n "CULTURE" column name, with "<tablename>." stripped off the front
$cultureColName = str_replace($fallbackClassI18n->getConstant('TABLE_NAME') . '.', '', $fallbackClassI18n->getConstant('CULTURE'));
// Build join strings
$currentJoinString = 'current.id AND current.' . $cultureColName . ' = \'' . $culture . '\'';
$sourceJoinString = 'source.id AND source.' . $cultureColName . ' = ' . $fallbackClass->getConstant('SOURCE_CULTURE');
$sourceJoinString .= ' AND source.' . $cultureColName . ' <> \'' . $culture . '\'';
// Build fancy criteria to get fallback values
$criteria->addAlias('current', $fallbackClassI18n->getConstant('TABLE_NAME'));
$criteria->addAlias('source', $fallbackClassI18n->getConstant('TABLE_NAME'));
$criteria->addJoin(array($fallbackClass->getConstant('ID'), 'current.' . $cultureColName), array('current.id', '\'' . $culture . '\''), Criteria::LEFT_JOIN);
$criteria->addJoin(array($fallbackClass->getConstant('ID'), 'source.' . $cultureColName), array('source.id', $fallbackClass->getConstant('SOURCE_CULTURE') . ' AND source.' . $cultureColName . ' <> \'' . $culture . '\''), Criteria::LEFT_JOIN);
return $criteria;
}