Skip to content

Commit 919e820

Browse files
committed
Some fixes
1 parent 2b515bd commit 919e820

File tree

3 files changed

+59
-63
lines changed

3 files changed

+59
-63
lines changed

README.md

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -770,11 +770,8 @@ The 'before' function allows modification of the request parameters and can (for
770770
'before'=>function(&$cmd, &$db, &$tab, &$id, &$in) {
771771
if ($cmd == 'delete') {
772772
$cmd = 'update'; // change command to update
773-
foreach($in as $k => $o) {
774-
$in[$k]->deleted = date('Y-m-d H:i:s', time());
775-
}
773+
$in->deleted = date('Y-m-d H:i:s', time());
776774
}
777-
778775
},
779776
'column_authorizer'=>function($cmd, $db ,$tab, $col) {
780777
return ( ! in_array($col, array('deleted')));

api.php

Lines changed: 53 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1134,21 +1134,32 @@ protected function parseGetParameterArray($get,$name,$characters) {
11341134
return $values;
11351135
}
11361136

1137-
protected function applyBeforeHandler(&$action,&$database,&$table,&$id,&$callback,&$input) {
1137+
protected function applyBeforeHandler(&$action,&$database,&$table,&$ids,&$callback,&$inputs) {
11381138
if (is_callable($callback,true)) {
1139-
$callback($action,$database,$table,$id,$input);
1139+
$max = max(count($ids),count($inputs));
1140+
for ($i=0;$i<$max;$i++) {
1141+
$id = isset($ids[$i])?$ids[$i]:false;
1142+
$input = isset($inputs[$i])?$inputs[$i]:false;
1143+
$callback($action,$database,$table,$id,$input);
1144+
}
11401145
}
11411146
}
11421147

1143-
protected function applyAfterHandler($parameters,$output) {
1148+
protected function applyAfterHandler($parameters,$outputs) {
11441149
$callback = $parameters['after'];
11451150
if (is_callable($callback,true)) {
11461151
$action = $parameters['action'];
11471152
$database = $parameters['database'];
11481153
$table = $parameters['tables'][0];
1149-
$id = $parameters['key'][0];
1150-
$input = $parameters['inputs'];
1151-
$callback($action,$database,$table,$id,$input,$output);
1154+
$ids = $parameters['key'][0];
1155+
$inputs = $parameters['inputs'];
1156+
$max = max(count($ids),count($inputs));
1157+
for ($i=0;$i<$max;$i++) {
1158+
$id = isset($ids[$i])?$ids[$i]:false;
1159+
$input = isset($inputs[$i])?$inputs[$i]:false;
1160+
$output = is_array($outputs)?$outputs[$i]:$outputs;
1161+
$callback($action,$database,$table,$id,$input,$output);
1162+
}
11521163
}
11531164
}
11541165

@@ -1299,7 +1310,7 @@ protected function processKeyParameter($key,$tables,$database) {
12991310
if ($key===false) return false;
13001311
$fields = $this->findPrimaryKeys($tables[0],$database);
13011312
if (count($fields)!=1) $this->exitWith404('1pk');
1302-
return array($key,$fields[0]);
1313+
return array(explode(',',$key),$fields[0]);
13031314
}
13041315

13051316
protected function processOrderingsParameter($orderings) {
@@ -1453,7 +1464,7 @@ protected function retrieveObject($key,$fields,$filters,$tables) {
14531464
$this->convertOutputs($sql,$params,$fields[$table]);
14541465
$sql .= ' FROM !';
14551466
$params[] = $table;
1456-
$this->addFilter($filters,$table,'and',$key[1],'eq',$key[0]);
1467+
$this->addFilter($filters,$table,'and',$key[1],'eq',$key[0][0]);
14571468
$this->addWhereFromFilters($filters[$table],$sql,$params);
14581469
$object = null;
14591470
if ($result = $this->db->query($sql,$params)) {
@@ -1465,10 +1476,10 @@ protected function retrieveObject($key,$fields,$filters,$tables) {
14651476

14661477
protected function retrieveObjects($key,$fields,$filters,$tables) {
14671478
$keyField = $key[1];
1468-
$keys = explode(',',$key[0]);
1479+
$keys = $key[0];
14691480
$rows = array();
14701481
foreach ($keys as $key) {
1471-
$result = $this->retrieveObject(array($key,$keyField),$fields,$filters,$tables);
1482+
$result = $this->retrieveObject(array(array($key),$keyField),$fields,$filters,$tables);
14721483
if ($result===null) {
14731484
return null;
14741485
}
@@ -1519,7 +1530,7 @@ protected function updateObject($key,$input,$filters,$tables) {
15191530
$params[] = $k;
15201531
$params[] = $v;
15211532
}
1522-
$this->addFilter($filters,$table,'and',$key[1],'eq',$key[0]);
1533+
$this->addFilter($filters,$table,'and',$key[1],'eq',$key[0][0]);
15231534
$this->addWhereFromFilters($filters[$table],$sql,$params);
15241535
$result = $this->db->query($sql,$params);
15251536
if (!$result) return null;
@@ -1529,14 +1540,14 @@ protected function updateObject($key,$input,$filters,$tables) {
15291540
protected function updateObjects($key,$inputs,$filters,$tables) {
15301541
if (!$inputs) return false;
15311542
$keyField = $key[1];
1532-
$keys = explode(',',$key[0]);
1543+
$keys = $key[0];
15331544
if (count($inputs)!=count($keys)) {
15341545
$this->exitWith404('subject');
15351546
}
15361547
$rows = array();
15371548
$this->db->beginTransaction();
15381549
foreach ($inputs as $i=>$input) {
1539-
$result = $this->updateObject(array($keys[$i],$keyField),$input,$filters,$tables);
1550+
$result = $this->updateObject(array(array($keys[$i]),$keyField),$input,$filters,$tables);
15401551
if ($result===null) {
15411552
$this->db->rollbackTransaction();
15421553
return null;
@@ -1551,7 +1562,7 @@ protected function deleteObject($key,$filters,$tables) {
15511562
$table = $tables[0];
15521563
$sql = 'DELETE FROM !';
15531564
$params = array($table);
1554-
$this->addFilter($filters,$table,'and',$key[1],'eq',$key[0]);
1565+
$this->addFilter($filters,$table,'and',$key[1],'eq',$key[0][0]);
15551566
$this->addWhereFromFilters($filters[$table],$sql,$params);
15561567
$result = $this->db->query($sql,$params);
15571568
if (!$result) return null;
@@ -1560,11 +1571,11 @@ protected function deleteObject($key,$filters,$tables) {
15601571

15611572
protected function deleteObjects($key,$filters,$tables) {
15621573
$keyField = $key[1];
1563-
$keys = explode(',',$key[0]);
1574+
$keys = $key[0];
15641575
$rows = array();
15651576
$this->db->beginTransaction();
15661577
foreach ($keys as $key) {
1567-
$result = $this->deleteObject(array($key,$keyField),$filters,$tables);
1578+
$result = $this->deleteObject(array(array($key),$keyField),$filters,$tables);
15681579
if ($result===null) {
15691580
$this->db->rollbackTransaction();
15701581
return null;
@@ -1595,7 +1606,7 @@ protected function incrementObject($key,$input,$filters,$tables,$fields) {
15951606
$params[] = $k;
15961607
}
15971608
}
1598-
$this->addFilter($filters,$table,'and',$key[1],'eq',$key[0]);
1609+
$this->addFilter($filters,$table,'and',$key[1],'eq',$key[0][0]);
15991610
$this->addWhereFromFilters($filters[$table],$sql,$params);
16001611
$result = $this->db->query($sql,$params);
16011612
if (!$result) return null;
@@ -1605,14 +1616,14 @@ protected function incrementObject($key,$input,$filters,$tables,$fields) {
16051616
protected function incrementObjects($key,$inputs,$filters,$tables,$fields) {
16061617
if (!$inputs) return false;
16071618
$keyField = $key[1];
1608-
$keys = explode(',',$key[0]);
1619+
$keys = $key[0];
16091620
if (count($inputs)!=count($keys)) {
16101621
$this->exitWith404('subject');
16111622
}
16121623
$rows = array();
16131624
$this->db->beginTransaction();
16141625
foreach ($inputs as $i=>$input) {
1615-
$result = $this->incrementObject(array($keys[$i],$keyField),$input,$filters,$tables,$fields);
1626+
$result = $this->incrementObject(array(array($keys[$i]),$keyField),$input,$filters,$tables,$fields);
16161627
if ($result===null) {
16171628
$this->db->rollbackTransaction();
16181629
return null;
@@ -1664,20 +1675,19 @@ protected function findRelations($tables,$database,$auto_include) {
16641675
}
16651676

16661677
protected function retrieveInputs($data) {
1667-
$input = (object)array();
1668-
if (strlen($data)>0) {
1669-
if ($data[0]=='{' || $data[0]=='[') {
1670-
$input = json_decode($data);
1671-
} else {
1672-
parse_str($data, $input);
1673-
foreach ($input as $key => $value) {
1674-
if (substr($key,-9)=='__is_null') {
1675-
$input[substr($key,0,-9)] = null;
1676-
unset($input[$key]);
1677-
}
1678+
if (strlen($data)==0) {
1679+
$input = false;
1680+
} else if ($data[0]=='{' || $data[0]=='[') {
1681+
$input = json_decode($data);
1682+
} else {
1683+
parse_str($data, $input);
1684+
foreach ($input as $key => $value) {
1685+
if (substr($key,-9)=='__is_null') {
1686+
$input[substr($key,0,-9)] = null;
1687+
unset($input[$key]);
16781688
}
1679-
$input = (object)$input;
16801689
}
1690+
$input = (object)$input;
16811691
}
16821692
return is_array($input)?$input:array($input);
16831693
}
@@ -1874,34 +1884,23 @@ protected function getParameters($settings) {
18741884
if ($column_authorizer) $this->applyColumnAuthorizer($column_authorizer,$action,$database,$fields);
18751885

18761886
// input
1877-
$multi = (strpos($key[0],',')!==false) || (strlen($post)?($post[0]=='['):false);
1878-
if ($before && $action == 'delete' && $multi) {
1879-
$inputs = array();
1880-
for($i=1; $i <= count(explode(',', $key[0])); $i++) {
1881-
$inputs[] = (object) array();
1882-
}
1883-
} else {
1884-
$inputs = $this->retrieveInputs($post);
1887+
$inputs = $this->retrieveInputs($post);
1888+
if ($before) {
1889+
$this->applyBeforeHandler($action,$database,$tables[0],$key[0],$before,$inputs);
18851890
}
1886-
$originalAction = $action;
1891+
18871892
foreach ($inputs as $k=>$context) {
1888-
//echo $k.' - ';
18891893
$input = $this->filterInputByFields($context,$fields[$tables[0]]);
18901894

18911895
if ($tenancy_function) $this->applyInputTenancy($tenancy_function,$action,$database,$tables[0],$input,$fields[$tables[0]]);
18921896
if ($input_sanitizer) $this->applyInputSanitizer($input_sanitizer,$action,$database,$tables[0],$input,$fields[$tables[0]]);
18931897
if ($input_validator) $this->applyInputValidator($input_validator,$action,$database,$tables[0],$input,$fields[$tables[0]],$context);
18941898

1895-
$this->convertInputs($input,$fields[$tables[0]]);
1896-
1897-
if ($before) {
1898-
$action = $originalAction;
1899-
$this->applyBeforeHandler($action,$database,$tables[0],$ids[$k],$before,$input);
1900-
}
1901-
1899+
$this->convertInputs($input,$fields[$tables[0]]);
19021900
$inputs[$k] = $input;
19031901
}
1904-
return compact('action','database','tables','key','page','filters','fields','orderings','transform','multi','inputs','collect','select','before','after');
1902+
1903+
return compact('action','database','tables','key','page','filters','fields','orderings','transform','inputs','collect','select','before','after');
19051904
}
19061905

19071906
protected function addWhereFromFilters($filters,&$sql,&$params) {
@@ -2049,7 +2048,7 @@ protected function listCommandInternal($parameters) {
20492048

20502049
protected function readCommand($parameters) {
20512050
extract($parameters);
2052-
if ($multi) $object = $this->retrieveObjects($key,$fields,$filters,$tables);
2051+
if (count($key[0])>1) $object = $this->retrieveObjects($key,$fields,$filters,$tables);
20532052
else $object = $this->retrieveObject($key,$fields,$filters,$tables);
20542053
if (!$object) $this->exitWith404('object');
20552054
$this->startOutput();
@@ -2060,27 +2059,27 @@ protected function readCommand($parameters) {
20602059
protected function createCommand($parameters) {
20612060
extract($parameters);
20622061
if (!$inputs || !$inputs[0]) $this->exitWith404('input');
2063-
if ($multi) return $this->createObjects($inputs,$tables);
2062+
if (count($inputs)>1) return $this->createObjects($inputs,$tables);
20642063
return $this->createObject($inputs[0],$tables);
20652064
}
20662065

20672066
protected function updateCommand($parameters) {
20682067
extract($parameters);
20692068
if (!$inputs || !$inputs[0]) $this->exitWith404('subject');
2070-
if ($multi) return $this->updateObjects($key,$inputs,$filters,$tables);
2069+
if (count($inputs)>1) return $this->updateObjects($key,$inputs,$filters,$tables);
20712070
return $this->updateObject($key,$inputs[0],$filters,$tables);
20722071
}
20732072

20742073
protected function deleteCommand($parameters) {
20752074
extract($parameters);
2076-
if ($multi) return $this->deleteObjects($key,$filters,$tables);
2075+
if (count($key[0])>1) return $this->deleteObjects($key,$filters,$tables);
20772076
return $this->deleteObject($key,$filters,$tables);
20782077
}
20792078

20802079
protected function incrementCommand($parameters) {
20812080
extract($parameters);
20822081
if (!$inputs || !$inputs[0]) $this->exitWith404('subject');
2083-
if ($multi) return $this->incrementObjects($key,$inputs,$filters,$tables,$fields);
2082+
if (count($inputs)>1) return $this->incrementObjects($key,$inputs,$filters,$tables,$fields);
20842083
return $this->incrementObject($key,$inputs[0],$filters,$tables,$fields);
20852084
}
20862085

tests/tests.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,13 @@ private function action($method,$url,$data='')
3434
'tenancy_function'=>function($action,$database,$table,$column) { return ($table=='users'&&$column=='id')?1:null; },
3535
'input_sanitizer'=>function($action,$database,$table,$column,$type,$value) { return is_string($value)?strip_tags($value):$value; },
3636
'input_validator'=>function($action,$database,$table,$column,$type,$value,$context) { return ($column=='category_id' && !is_numeric($value))?'must be numeric':true; },
37-
'before' => function (&$action,&$database,&$table,&$id,&$inputs) { if ($action=='create') foreach ($inputs as $input) if ($input) $input->created_at = '2013-12-11 10:09:08'; },
38-
'after' => function ($action,$database,$table,$id,$inputs,$output) { file_put_contents('log.txt',var_export(array($action,$database,$table,$id,$inputs,$output),true),FILE_APPEND); },
37+
'before'=>function(&$action,&$database,&$table,&$id,&$input) { if ($action=='create' && $input!==false) $input->created_at = '2013-12-11 10:09:08'; },
38+
'after'=>function($action,$database,$table,$id,$input,$output) { file_put_contents('log.txt',var_export(array($action,$database,$table,$id,$input,$output),true),FILE_APPEND); },
3939
// for tests
40-
'method' =>$method,
41-
'request' =>$url['path'],
40+
'method'=>$method,
41+
'request'=>$url['path'],
4242
'post'=>$data,
43-
'get' =>$get,
43+
'get'=>$get,
4444
));
4545
return $this;
4646
}

0 commit comments

Comments
 (0)