* - postListExtra - add extra column data on the results (like new messages etc.)
* -postListFilter($data, $authUser, $request) return $data - add extra data to an object
*
- * - toRooSingleArray($authUser) // single fetch, add data..
+ * - toRooSingleArray($authUser, $request) // single fetch, add data..
* - toRooArray($request) /// toArray if you need to return different data.. for a list fetch.
*
*
* - onUpload($roo)
* - setFromRoo($ar) - values from post (deal with dates etc.) - return true|error string.
*
- * - toEventString (for logging)
+ * - toEventString (for logging - this is generically prefixed to all database operations.)
*/
class Pman_Roo extends Pman
*
* csvCols[0] csvCols[1].... = .... column titles for CSV output
*
- * csvTitle[0], csvTitle[1] .... = columns to use for CSV output
+ * csvTitles[0], csvTitles[1] .... = columns to use for CSV output
*
* sort = sort column (',' comma delimited)
* dir = sort direction ?? in future comma delimited...
function get($tab)
{
// $this->jerr("Not authenticated", array('authFailure' => true));
- //echo '<PRE>';print_R($_GET); DB_DataObject::debuglevel(1);
+ //echo '<PRE>';print_R($_GET);
+ // DB_DataObject::debuglevel(1);
$this->init(); // from pnan.
$this->jerr("PERMISSION DENIED");
}
- $this->jok(method_exists($x, 'toRooSingleArray') ? $x->toRooSingleArray($this->authUser) : $x->toArray());
+ $this->jok(method_exists($x, 'toRooSingleArray') ? $x->toRooSingleArray($this->authUser, $_REQUEST) : $x->toArray());
}
if (isset($_REQUEST['_delete'])) {
$this->jerr("PERMISSION DENIED");
}
+ // DB_DataObject::debuglevel(1);
// sets map and countWhat
$this->loadMap($x, $_columns, empty($_REQUEST['_distinct']) ? false: $_REQUEST['_distinct']);
$this->setFilters($x,$_REQUEST);
-
-
-
+
+ //print_r($x);
// build join if req.
-
+ //DB_DataObject::debugLevel(1);
$total = $x->count($this->countWhat);
// sorting..
- // DB_DataObject::debugLevel(1);
-
+ //
+ //var_dump($total);exit;
$this->applySort($x);
* @arg DB_DataObject $x
*
*/
- function applySort($x)
+ function applySort($x, $sort = '', $dir ='')
{
// Db_DataObject::debugLevel(1);
- $sort = empty($_REQUEST['sort']) ? '' : $_REQUEST['sort'];
- $dir = (empty($_REQUEST['dir']) || strtoupper($_REQUEST['dir']) == 'ASC' ? 'ASC' : 'DESC');
+ $sort = empty($_REQUEST['sort']) ? $sort : $_REQUEST['sort'];
+ $dir = empty($_REQUEST['dir']) ? $dir : $_REQUEST['dir'];
+ $dir = $dir == 'ASC' ? 'ASC' : 'DESC';
if (method_exists($x, 'onInsert')) {
$x->onInsert($_REQUEST, $this);
}
- $this->addEvent("ADD", $x, $x->toEventString());
+ $this->addEvent("ADD", $x);
// note setFrom might handle this before hand...!??!
if (!empty($_FILES) && method_exists($x, 'onUpload')) {
$this->jerr("PERMISSION DENIED");
}
+ // check any locks..
+ // only done if we recieve a lock_id.
+ // we are very trusing here.. that someone has not messed around with locks..
+ // the object might want to check in their checkPerm - if locking is essential..
+
+ $lock = DB_DataObjecT::factory('Core_locking');
+ if (is_a($lock,'DB_DataObject')) {
+
+ $lock->on_id = $x->id;
+ $lock->on_table= $x->tableName();
+ if (!empty($_REQUEST['_lock_id'])) {
+ $lock->whereAdd('id != ' . ((int)$_REQUEST['_lock_id']));
+ }
+ $lock->limit(1);
+ if ($lock->find(true)) {
+ // it's locked by someone else..
+ $p = $lock->person();
+ $this->jerr("Your lock is invalid, This record is locked by " . $p->name . " at " .$lock->created);
+ }
+ // check the users lock.. - no point.. ??? - if there are no other locks and it's not the users, then they can
+ // edit it anyways...
+
+ }
+
+
+
+
+
+
$_columns = !empty($req['_columns']) ? explode(',', $req['_columns']) : false;
} else {
$x->setFrom($req);
}
- $this->addEvent("EDIT", $x, $x->toEventString());
+ $this->addEvent("EDIT", $x);
//print_r($x);
//print_r($old);
while ($x->fetch()) {
$xx = clone($x);
+
+ // perms first.
+ if (method_exists($x, 'checkPerm') && !$x->checkPerm('D', $this->authUser)) {
+ $this->jerr("PERMISSION DENIED");
+ }
+
+ // before delte = allows us to trash dependancies if needed..
+ if ( method_exists($xx, 'beforeDelete') && ($xx->beforeDelete() === false)) {
+ $errs[] = "Delete failed ({$xx->id})\n". (isset($xx->err) ? $xx->err : '');
+ continue;
+ }
+
+ // now check deps.
+
foreach($affects as $k=> $true) {
$ka = explode('.', $k);
$chk = DB_DataObject::factory($ka[0]);
$this->jerr('Unable to load referenced table, check the links config: ' .$ka[0]);
}
$chk->{$ka[1]} = $xx->$pk;
- if ($chk->count()) {
- $this->jerr('Delete Dependant records first ('. $ka[0]. ':' . $ka[1] .'='.$xx->$pk.')');
+ $matches = $chk->count();
+ if ($matches) {
+ $chk->limit(1);
+ $o = $chk->fetchAll();
+ $desc = $ka[0]. ':' . $ka[1] .'='.$xx->$pk;
+ if (method_exists($chk, 'toEventString')) {
+ $desc = $ka[0] . ' : ' . $o[0]->toEventString();
+ }
+
+ $this->jerr("Delete Dependant records ($matches found), first is ( $desc )");
}
}
+ // finally log it..
+ $this->addEvent("DELETE", $x);
-
- if (method_exists($x, 'checkPerm') && !$x->checkPerm('D', $this->authUser)) {
- $this->jerr("PERMISSION DENIED");
- }
-
- $this->addEvent("DELETE", $x, $x->toEventString());
- if ( method_exists($xx, 'beforeDelete') && ($xx->beforeDelete() === false)) {
- $errs[] = "Delete failed ({$xx->id})\n". (isset($xx->err) ? $xx->err : '');
- continue;
- }
$xx->delete();
}
if ($errs) {
function loadMap($do, $filter=false, $distinct = false)
{
//DB_DataObject::debugLevel(1);
+
+ $this->countWhat = false;
+
$conf = array();
$this->init();
//$ff->DB_DataObject['ini_'. $db->database()];
//echo '<PRE>';print_r($do->links());exit;
//var_dump($mods);
-
+ /*
if (in_array('Builder', $mods) ) {
foreach(in_array('Builder', $mods) ? scandir($this->rootDir.'/Pman') : $mods as $m) {
$map = $conf[$do->tableName()];
}
} else {
+ */
$map = $do->links();
- }
+ //}
$do->selectAdd(); // we need thsi as normally it's only cleared by an empty selectAs call.
$selectAs = array(array( $xx , '%s', false));
- $this->countWhat = false;
+
$has_distinct = false;
if ($filter || $distinct) {
$cols = array();
//DB_DataObject::debugLevel(1);
// we do select as after everything else as we need to plop distinct at the beginning??
/// well I assume..
- // echo '<PRE>';print_r($selectAs );exit;
+ // echo '<PRE>';print_r($this->colsJname);exit;
foreach($selectAs as $ar) {
$do->selectAs($ar[0], $ar[1], $ar[2]);
}
$x->whereAddIn(
- isset($this->colsJoinName[$key]) ?
- $this->colsJoinName[$key] :
- $x->tableName(). '.'.$key,
+ isset($this->colsJname[$key]) ?
+ $this->colsJname[$key] :
+ ($x->tableName(). '.'.$key),
$ar, $quote ? 'string' : 'int');
}
$key = substr($key, 1) ;
$x->whereAdd( (
- isset($this->colsJoinName[$key]) ?
- $this->colsJoinName[$key] :
+ isset($this->colsJname[$key]) ?
+ $this->colsJname[$key] :
$x->tableName(). '.'.$key ) . ' != ' .
(is_numeric($val) ? $val : "'". $x->escape($val) . "'")
);