Browse Source

enhance Slugged Behavior (from Sluggable Behavior)

euromark 13 years ago
parent
commit
3636849c59

+ 19 - 4
Model/Behavior/SluggedBehavior.php

@@ -81,7 +81,9 @@ class SluggedBehavior extends ModelBehavior {
 		),
 		'run' => 'beforeValidate',
 		'language' => null,
-		'encoding' => null
+		'encoding' => null,
+		'trigger' => false,
+		'scope' => array()
 	);
 
 /**
@@ -144,6 +146,11 @@ class SluggedBehavior extends ModelBehavior {
 		if ($run !== 'beforeValidate') {
 			return true;
 		}
+		if (is_string($this->settings[$Model->alias]['trigger'])) {
+			if (!$Model->{$this->settings[$Model->alias]['trigger']}) {
+				return true;
+			}
+		}
 		return $this->generateSlug($Model);
 	}
 
@@ -159,6 +166,11 @@ class SluggedBehavior extends ModelBehavior {
 		if ($run !== 'beforeSave') {
 			return true;
 		}
+		if (is_string($this->settings[$Model->alias]['trigger'])) {
+			if (!$Model->{$this->settings[$Model->alias]['trigger']}) {
+				return true;
+			}
+		}
 		return $this->generateSlug($Model);
 	}
 
@@ -221,6 +233,7 @@ class SluggedBehavior extends ModelBehavior {
 			}
 			if ($unique) {
 				$conditions = array($Model->alias . '.' . $slugField => $slug);
+				$conditions = array_merge($conditions, $this->settings[$Model->alias]['scope']);
 				if ($Model->id) {
 					$conditions['NOT'][$Model->alias . '.' . $Model->primaryKey] = $Model->id;
 				}
@@ -439,8 +452,10 @@ class SluggedBehavior extends ModelBehavior {
 			}
 			$id = $Model->id;
 		}
-		return current($Model->find('list', array('conditions' => array(
-			$Model->alias . '.' . $Model->primaryKey => $id))));
+		$conditions = array_merge(array(
+			$Model->alias . '.' . $Model->primaryKey => $id),
+			$this->settings[$Model->alias]['scope']);
+		return current($Model->find('list', array('conditions' => $conditions)));
 	}
 
 /**
@@ -466,7 +481,7 @@ class SluggedBehavior extends ModelBehavior {
 			'limit' => 100,
 			'fields' => array_merge(array($Model->primaryKey, $slugField), $label),
 			'order' => $Model->displayField . ' ASC',
-			'conditions' => array(),
+			'conditions' => $scope,
 			'recursive' => $recursive,
 		);
 		$params = array_merge($defaults, $params);

+ 58 - 0
Test/Case/Model/Behavior/SluggedBehaviorTest.php

@@ -124,6 +124,64 @@ class SluggedTest extends CakeTestCase {
 		$this->Model = new MessageSlugged();
 	}
 
+/**
+ * Test slug generation/update based on trigger
+ *
+ * @access public
+ * @return void
+ */
+	public function testSlugGenerationBasedOnTrigger() {
+		$this->Model->Behaviors->detach('Slugged');
+		$this->Model->Behaviors->attach('Tools.Slugged', array(
+			'trigger' => 'generateSlug'));
+
+		$this->Model->generateSlug = false;
+		$this->Model->create(array('name' => 'Some Article 25271'));
+		$result = $this->Model->save();
+
+		$result[$this->Model->alias]['id'] = $this->Model->id;
+		$this->assertTrue(empty($result[$this->Model->alias]['slug']));
+		$this->Model->generateSlug = true;
+		$result = $this->Model->save($result);
+		$this->assertEqual($result[$this->Model->alias]['slug'], 'Some-Article-25271');
+	}
+
+/**
+ * Test slug generation/update based on trigger
+ *
+ * @access public
+ * @return void
+ */
+	public function testSlugGenerationWithScope() {
+		$this->Model->Behaviors->detach('Slugged');
+		$this->Model->Behaviors->attach('Tools.Slugged', array('unique' => true));
+
+		$data = array('name' => 'Some Article 12345', 'section' => 0);
+
+		$this->Model->create();
+		$result = $this->Model->save($data);
+		$this->assertTrue((bool)$result);
+		$this->assertEqual($result[$this->Model->alias]['slug'], 'Some-Article-12345');
+
+		$this->Model->create();
+		$result = $this->Model->save($data);
+		$this->assertTrue((bool)$result);
+		$this->assertEqual($result[$this->Model->alias]['slug'], 'Some-Article-12345-1');
+
+		$this->Model->Behaviors->detach('Slugged');
+		$this->Model->Behaviors->attach('Tools.Slugged', array('unique' => true, 'scope' => array('section' => 1)));
+
+		$data = array('name' => 'Some Article 12345', 'section' => 1);
+
+		$this->Model->create();
+		$result = $this->Model->save($data);
+		$this->assertTrue((bool)$result);
+		$this->assertEqual($result[$this->Model->alias]['slug'], 'Some-Article-12345');
+	}
+
+/**
+ * test remove stop words
+ */
 	public function testRemoveStopWords() {
 		$array = $this->Model->removeStopWords('My name is Michael Paine, and I am a nosey neighbour');
 		$expected = array(

+ 1 - 1
Test/Case/Model/Behavior/TypographicBehaviorTest.php

@@ -111,7 +111,7 @@ class TypographicBehaviorTest extends MyCakeTestCase {
 		$this->Model->Behaviors->detach('Typographic');
 		for ($i = 0; $i < 202; $i++) {
 			$data = array(
-				'title '.$i,
+				'title' => 'title '.$i,
 				'body' => 'unclean `content` to «correct»',
 			);
 			$this->Model->create();

+ 6 - 6
Test/Fixture/LanguageFixture.php

@@ -35,14 +35,14 @@ class LanguageFixture extends CakeTestFixture {
  */
 	public $records = array(
 		array(
-			'id' => '1',
-			'name' => 'Afrikaans',
-			'ori_name' => 'Afrikaans',
-			'code' => 'af',
+			'id' => '25',
+			'name' => 'Deutsch',
+			'ori_name' => 'German',
+			'code' => 'de',
 			'iso3' => '',
 			'iso2' => '',
-			'locale' => 'afr',
-			'locale_fallback' => 'afr',
+			'locale' => 'de_DE',
+			'locale_fallback' => 'deu',
 			'status' => '0',
 			'sort' => '0',
 			'modified' => '2011-07-17 15:23:08'