{
if ($record->getTable()->getOption('inheritanceMap')) {
$parentTable = $record->getTable()->getOption('parents');
$i = 0;
$reflectionClass = new ReflectionClass($parentTable[$i]);
while ($reflectionClass->isAbstract()) {
$i++;
$reflectionClass = new ReflectionClass($parentTable[$i]);
}
} else {
$table = $record->getTable();
}
$name = $table->getFieldName($this->_options['name']);
$proposal = call_user_func_array($this->_options['builder'], array($slugFromFields, $record));
$slug = $proposal;
$whereString = 'r.' . $name . ' LIKE ?';
$whereParams = array($proposal.'%');
if ($record->exists()) {
$identifier = $record->identifier();
$whereString .= ' AND r.' . implode(' != ? AND r.', $table->getIdentifierColumnNames()) . ' != ?';
$whereParams = array_merge($whereParams, array_values($identifier));
}
foreach ($this->_options['uniqueBy'] as $uniqueBy) {
if (is_null($record->$uniqueBy)) {
$whereString .= ' AND r.'.$uniqueBy.' IS NULL';
} else {
$whereString .= ' AND r.'.$uniqueBy.' = ?';
$value = $record->$uniqueBy;
$value = current((array) $value->identifier());
}
$whereParams[] = $value;
}
}
$originalIndexBy = $table->getBoundQueryPart('indexBy');
$table->bindQueryPart('indexBy', null);
$query = $table->createQuery('r')
->select('r.' . $name)
->where($whereString , $whereParams)
if ($table->hasTemplate('Doctrine_Template_SoftDelete')) {
$softDelete = $table->getTemplate('Doctrine_Template_SoftDelete');
if ($softDelete->getOption('type') == 'boolean') {
$conn = $query->getConnection();
$query->addWhere(
'(r.' . $softDelete->getOption('name') . ' = ' . $conn->convertBooleans(true) .
' OR r.' . $softDelete->getOption('name') . ' = ' . $conn->convertBooleans(false) . ')'
);
} else {
$query->addWhere('(r.' . $softDelete->getOption('name') . ' IS NOT NULL OR r.' . $softDelete->getOption('name') . ' IS NULL)');
}
}
$similarSlugResult = $query->execute();
$query->free();
$table->bindQueryPart('indexBy', $originalIndexBy);
$similarSlugs = array();
foreach ($similarSlugResult as $key => $value) {
$similarSlugs[$key] = strtolower($value[$name]);
}
$i = 1;
while (in_array(strtolower($slug), $similarSlugs)) {
$slug = call_user_func_array($this->_options['builder'], array($proposal.'-'.$i, $record));
$i++;
}
$length = $table->getFieldLength($this->_options['name']);
if (strlen($slug) > $length) {
$slug = substr($slug, 0, $length - (strlen($i) + 1));
}
return $slug;
}