Browse Source

Fixes #13728: Fixed the bug when `yii\behaviors\SluggableBehavior` wasn't preserving immutable slug values

tags/2.0.12
Nikolay Oleynikov 8 years ago committed by Alexander Makarov
parent
commit
d0ce165ba6
  1. 1
      framework/CHANGELOG.md
  2. 22
      framework/behaviors/SluggableBehavior.php
  3. 38
      tests/framework/behaviors/SluggableBehaviorTest.php

1
framework/CHANGELOG.md

@ -46,6 +46,7 @@ Yii Framework 2 Change Log
- Bug #13670: Fixed alias option from console when it includes `-` or `_` in option name (pana1990) - Bug #13670: Fixed alias option from console when it includes `-` or `_` in option name (pana1990)
- Enh: Added `yii\di\Instance::__set_state()` method to restore object after serialization using `var_export()` function (silvefire) - Enh: Added `yii\di\Instance::__set_state()` method to restore object after serialization using `var_export()` function (silvefire)
- Enh #13695: `\yii\web\Response::setStatusCode()` method now returns the Response object itself (kyle-mccarthy) - Enh #13695: `\yii\web\Response::setStatusCode()` method now returns the Response object itself (kyle-mccarthy)
- Bug #13728: Fixed the bug when `yii\behaviors\SluggableBehavior` wasn't preserving immutable slug values (Kolyunya)
- Bug #13707: Fixed `\yii\web\ErrorHandler` and `\yii\web\ErrorAction` not setting correct response code to response object before rendering error view (samdark) - Bug #13707: Fixed `\yii\web\ErrorHandler` and `\yii\web\ErrorAction` not setting correct response code to response object before rendering error view (samdark)
- Enh #13698: `yii\grid\DataColumn` filter is automatically generated as dropdown list in case of `format` set to `boolean` (bizley) - Enh #13698: `yii\grid\DataColumn` filter is automatically generated as dropdown list in case of `format` set to `boolean` (bizley)
- Enh #13254: Core validators no longer require Yii::$app to be set (sammousa) - Enh #13254: Core validators no longer require Yii::$app to be set (sammousa)

22
framework/behaviors/SluggableBehavior.php

@ -138,17 +138,17 @@ class SluggableBehavior extends AttributeBehavior
*/ */
protected function getValue($event) protected function getValue($event)
{ {
if ($this->attribute !== null) { if (!$this->isNewSlugNeeded()) {
if ($this->isNewSlugNeeded()) { return $this->owner->{$this->slugAttribute};
$slugParts = []; }
foreach ((array) $this->attribute as $attribute) {
$slugParts[] = ArrayHelper::getValue($this->owner, $attribute);
}
$slug = $this->generateSlug($slugParts); if ($this->attribute !== null) {
} else { $slugParts = [];
return $this->owner->{$this->slugAttribute}; foreach ((array) $this->attribute as $attribute) {
$slugParts[] = ArrayHelper::getValue($this->owner, $attribute);
} }
$slug = $this->generateSlug($slugParts);
} else { } else {
$slug = parent::getValue($event); $slug = parent::getValue($event);
} }
@ -173,6 +173,10 @@ class SluggableBehavior extends AttributeBehavior
return false; return false;
} }
if ($this->attribute === null) {
return true;
}
foreach ((array)$this->attribute as $attribute) { foreach ((array)$this->attribute as $attribute) {
if ($this->owner->isAttributeChanged($attribute)) { if ($this->owner->isAttributeChanged($attribute)) {
return true; return true;

38
tests/framework/behaviors/SluggableBehaviorTest.php

@ -168,6 +168,44 @@ class SluggableBehaviorTest extends TestCase
$model->save(); $model->save();
$this->assertEquals('test-name', $model->slug); $this->assertEquals('test-name', $model->slug);
} }
/**
* @depends testSlug
*/
public function testImmutableByAttribute()
{
$model = new ActiveRecordSluggable();
$model->getSluggable()->immutable = true;
$model->name = 'test name';
$model->validate();
$this->assertEquals('test-name', $model->slug);
$model->name = 'another name';
$model->validate();
$this->assertEquals('test-name', $model->slug);
}
/**
* @depends testSlug
*/
public function testImmutableByCallback()
{
$model = new ActiveRecordSluggable();
$model->getSluggable()->immutable = true;
$model->getSluggable()->attribute = null;
$model->getSluggable()->value = function () use ($model) {
return $model->name;
};
$model->name = 'test name';
$model->validate();
$this->assertEquals('test name', $model->slug);
$model->name = 'another name';
$model->validate();
$this->assertEquals('test name', $model->slug);
}
} }
/** /**

Loading…
Cancel
Save