Skip to content

Commit ea1e7fa

Browse files
committed
Merge pull request #13 from ADmad/setorder
Allow passing records to setOrder() in multiple formats.
2 parents c5c4f0a + 54b5de8 commit ea1e7fa

File tree

2 files changed

+68
-18
lines changed

2 files changed

+68
-18
lines changed

src/Model/Behavior/SequenceBehavior.php

Lines changed: 33 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -261,35 +261,51 @@ public function beforeDelete(Event $event, Entity $entity)
261261
/**
262262
* Set order for list of records provided.
263263
*
264-
* @param array $data Data.
264+
* Records can be provided as array of entities or array of associative
265+
* arrays like `[['id' => 1], ['id' => 2]]` or array of primary key values
266+
* like `[1, 2]`.
267+
*
268+
* @param array|\Cake\Datasource\EntityInterface $records Records.
265269
*
266270
* @return bool
267271
*/
268-
public function setOrder($data)
272+
public function setOrder(array $records)
269273
{
270274
$config = $this->config();
271275
$table = $this->_table;
272276

273-
$order = $this->_config['start'];
274-
foreach ($data as $key => $record) {
275-
$data[$key][$this->_config['order']] = $order++;
276-
}
277-
278277
$table->removeBehavior('Sequence');
279278

280-
$return = $table->connection()->transactional(function ($connection) use ($table, $data) {
281-
$entities = $table->newEntities($data);
279+
$return = $table->connection()->transactional(
280+
function ($connection) use ($table, $records, $config) {
281+
$order = $this->_config['start'];
282+
$field = $this->_config['order'];
283+
284+
foreach ($records as $record) {
285+
if (is_scalar($record)) {
286+
$record = [$table->primaryKey() => $record];
287+
}
288+
289+
if (is_array($record)) {
290+
$entity = $table->newEntity();
291+
$record = $entity->set($record, ['guard' => false]);
292+
$record->isNew(false);
293+
}
282294

283-
foreach ($entities as $entity) {
284-
$entity->isNew(false);
285-
$r = $table->save($entity, ['atomic' => false, 'validate' => false]);
286-
if ($r === false) {
287-
return false;
295+
$record->set($field, $order++);
296+
297+
$r = $table->save(
298+
$record,
299+
['atomic' => false, 'checkRules' => false]
300+
);
301+
if ($r === false) {
302+
return false;
303+
}
288304
}
289-
}
290305

291-
return true;
292-
});
306+
return true;
307+
}
308+
);
293309

294310
$table->addBehavior('Sequence.Sequence', $config);
295311

tests/TestCase/Model/Behavior/SequenceBehaviorTest.php

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,16 @@
66
use Cake\ORM\TableRegistry;
77
use Cake\TestSuite\TestCase;
88

9+
class Item extends Entity
10+
{
11+
protected $_accessible = ['*' => true, 'id' => false];
12+
}
13+
914
class Items extends Table
1015
{
1116
public function initialize(array $config)
1217
{
18+
$this->entityClass('Sequence\Test\TestCase\Model\Behavior\Item');
1319
$this->addBehavior('Sequence.Sequence', ['start' => 0]);
1420
}
1521
}
@@ -38,7 +44,11 @@ public function initialize(array $config)
3844

3945
class SequenceTest extends TestCase
4046
{
41-
public $fixtures = ['plugin.Sequence.Items', 'plugin.Sequence.GroupedItems', 'plugin.Sequence.KeywordItems'];
47+
public $fixtures = [
48+
'plugin.Sequence.Items',
49+
'plugin.Sequence.GroupedItems',
50+
'plugin.Sequence.KeywordItems',
51+
];
4252

4353
/**
4454
* [testSave description].
@@ -242,6 +252,7 @@ public function testSetOrder()
242252
'className' => 'Sequence\Test\TestCase\Model\Behavior\Items',
243253
]);
244254

255+
// Array of arrays
245256
$result = $Items->setOrder([
246257
['id' => 4],
247258
['id' => 3],
@@ -252,6 +263,29 @@ public function testSetOrder()
252263
$this->assertTrue($result);
253264
$this->assertOrder([4, 3, 2, 1, 5], $Items);
254265

266+
// Array of ids
267+
$result = $Items->setOrder([5, 4, 2, 1, 3]);
268+
$this->assertTrue($result);
269+
$this->assertOrder([5, 4, 2, 1, 3], $Items);
270+
271+
// Array of entities
272+
$entities = $Items->newEntities(
273+
[
274+
['id' => 4],
275+
['id' => 3],
276+
['id' => 2],
277+
['id' => 1],
278+
['id' => 5],
279+
],
280+
['accessibleFields' => ['id' => true]]
281+
);
282+
foreach ($entities as &$entity) {
283+
$entity->isNew(false);
284+
}
285+
$result = $Items->setOrder($entities);
286+
$this->assertTrue($result);
287+
$this->assertOrder([4, 3, 2, 1, 5], $Items);
288+
255289
$GroupedItems = TableRegistry::get('GroupedItems', [
256290
'table' => 'grouped_items',
257291
'alias' => 'GroupedItems',

0 commit comments

Comments
 (0)