1. <?php
  2. class Sluggable extends DataExtension {
  3. private static $db = array (
  4. 'Slug' => 'Varchar(255)'
  5. );
  6. private static $indexes = array (
  7. 'Slug' => true
  8. );
  9. public static function create_slug($obj, $field) {
  10. if(!isset($_REQUEST[$field])) {
  11. $title = $obj->$field;
  12. }
  13. else {
  14. $title = $_REQUEST[$field];
  15. }
  16. $slug = singleton('SiteTree')->generateURLSegment($title);
  17. $original_slug = $slug;
  18. $i = 0;
  19. $class = $obj->class;
  20. if(!Object::has_extension($class, "Sluggable")) {
  21. while($parent = get_parent_class($obj)) {
  22. if(Object::has_extension($parent,"Sluggable")) {
  23. $class = $parent;
  24. break;
  25. }
  26. else {
  27. $obj = singleton($parent);
  28. }
  29. }
  30. }
  31. while($t = DataList::create($class)
  32. ->filter(array("Slug" => "$slug"))
  33. ->exclude(array("{$class}.ID" => $obj->ID))
  34. ->first()) {
  35. $i++;
  36. $slug = $original_slug."-{$i}";
  37. }
  38. $obj->Slug = $slug;
  39. }
  40. public static function get_by_slug($class, $slug) {
  41. return DataList::create($class)->filter("Slug",$slug)->first();
  42. }
  43. public function onBeforeWrite() {
  44. $f = $this->owner->config()->slug_field;
  45. $field = $f ? $f : "Title";
  46. self::create_slug($this->owner, $field);
  47. }
  48. }