Skip to content

Instantly share code, notes, and snippets.

@morshedalam
Forked from eberfreitas/sluggable.php
Created February 4, 2014 20:21
Show Gist options
  • Save morshedalam/8811557 to your computer and use it in GitHub Desktop.
Save morshedalam/8811557 to your computer and use it in GitHub Desktop.
<?php
App::import('Inflector');
class SluggableBehavior extends ModelBehavior
{
private $_settings = array();
function setup(&$model, $settings = array())
{
$default = array(
'fields' => 'title',
'scope' => false,
'conditions' => false,
'slug_field' => 'slug',
'separator' => '-',
'overwrite' => false,
'length' => 256,
'lower' => true
);
$this->_settings[$model->alias] = (!empty($settings)) ? $settings + $default : $default;
}
function beforeSave(&$model)
{
$settings = $this->_settings[$model->alias];
$fields = (array)$settings['fields'];
$scope = (array)$settings['scope'];
$conditions = !empty($settings['conditions']) ? (array)$settings['conditions'] : array();
$slug_field = $settings['slug_field'];
$hasFields = true;
foreach ($fields as $field) {
if (!$model->hasField($field)) {
$hasFields = false;
}
if (!isset($model->data[$model->alias][$field])) {
$hasFields = false;
}
}
if ($hasFields && $model->hasField($slug_field) && ($settings['overwrite'] || empty($model->id))) {
$toSlug = array();
foreach ($fields as $field) {
$toSlug[] = $model->data[$model->alias][$field];
}
$toSlug = join(' ', $toSlug);
$slug = Inflector::slug($toSlug, $settings['separator']);
if ($settings['lower']) {
$slug = strtolower($slug);
}
if (strlen($slug) > $settings['length']) {
$slug = substr($slug, 0, $settings['length']);
}
$conditions[$model->alias . '.' . $slug_field . ' LIKE'] = $slug . '%';
if (!empty($model->id)) {
$conditions[$model->alias . '.' . $model->primaryKey . ' !='] = $model->id;
}
if (!empty($scope)) {
foreach ($scope as $s) {
if (isset($model->data[$model->alias][$s]) && !empty($model->data[$model->alias][$s])) {
$conditions[$model->alias . '.' . $s] = $model->data[$model->alias][$s];
}
}
}
$sameUrls = $model->find('all', array(
'recursive' => -1,
'conditions' => $conditions
));
$sameUrls = (!empty($sameUrls)) ?
Set::extract($sameUrls, '{n}.' . $model->alias . '.' . $slug_field) :
null;
if ($sameUrls) {
if (in_array($slug, $sameUrls)) {
$slug_prefix = $slug;
$index = 1;
while ($index > 0) {
if (!in_array($slug_prefix . $settings['separator'] . $index, $sameUrls)) {
$slug = $slug_prefix . $settings['separator'] . $index;
$index = -1;
}
$index++;
}
}
}
if (!empty($model->whitelist) && !in_array($slug_field, $model->whitelist)) {
$model->whitelist[] = $slug_field;
}
$model->data[$model->alias][$slug_field] = $slug;
}
return parent::beforeSave($model);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment