*
* - applySort($au, $sortcol, $direction, $array_of_columns, $multisort) -- does not support multisort at present..
* - applyFilters($_REQUEST, $authUser, $roo) -- apply any query filters on data. and hide stuff not to be seen. (RETURN false to prevent default filters.)
- * - postListExtra($_REQUEST) : array(extra_name => data) - add extra column data on the results (like new messages etc.)
+ * - postListExtra($_REQUEST, $roo, $array_data) : array(extra_name => data) - 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, $request) // single fetch, add data..
* ... call $roo->jerr() on failure...
*
* BEFORE
- * - beforeDelete($dependants_array, $roo) Argument is an array of un-find/fetched dependant items.
+ * - beforeDelete($dependants_array, $roo, $request) Argument is an array of un-find/fetched dependant items.
* - jerr() will stop insert.. (Prefered)
* - return false for fail and set DO->err;
* - beforeUpdate($old, $request,$roo) - after update - jerr() will stop insert..
* - onInsert($request,$roo, $event) - after insert
* - onDelete($req, $roo) - after delete
* - onUpload($roo)
- *
-
- *
+ *
* - toEventString (for logging - this is generically prefixed to all database operations.)
*/
* lookup[key]=value single fetch based on a single key value lookup.
* multiple key/value can be used. eg. ontable+onid..
* _columns what to return.
+ *
+ * _no_count skip the default count query.
+ * use the number of records in the query result as the total
*
*
* JOINS:
* applyFilters($_REQUEST, $authUser, $roo)
* -- apply any query filters on data. and hide stuff not to be seen.
* -- can exit by calling $roo->jerr()
- * postListExtra($_REQUEST) : array(extra_name => data)
- * - add extra column data on the results (like new messages etc.)
+ * postListExtra($_REQUEST, $roo, $array_data) : array(extra_name => data)
+ * - add extra column to the jdata return key/value info.
* postListFilter($data, $authUser, $request) return $data
- * - add extra data to an object
+ * - modify the returned array of data (either add stuff to the data, or remove lines etc)
*
*
* toRooSingleArray($authUser, $request) : array
// sets map and countWhat
$this->loadMap($x, array(
- 'columns' => $_columns,
- 'distinct' => empty($_REQUEST['_distinct']) ? false: $_REQUEST['_distinct'],
- 'exclude' => empty($_REQUEST['_exclude_columns']) ? false: explode(',', $_REQUEST['_exclude_columns'])
- ));
+ 'columns' => $_columns,
+ 'distinct' => empty($_REQUEST['_distinct']) ? false: $_REQUEST['_distinct'],
+ 'exclude' => empty($_REQUEST['_exclude_columns']) ? false: explode(',', $_REQUEST['_exclude_columns'])
+ ));
$this->setFilters($x,$_REQUEST);
//print_r($x);
// build join if req.
//DB_DataObject::debugLevel(1);
- // var_dump($this->countWhat);
- $total = $x->count($this->countWhat);
+ // count with multiple joins and no conditions can be quite slow - so if there are no conditions - just remove the joins from the count.
+ $xx = clone($x);
+ $old_where = $x->whereAdd();
+ if (empty($old_where )) {
+ $xx->_join = '';
+ } else {
+ $x->whereAdd($old_where);
+ $xx=clone($x);
+
+ }
+ $total = false;
+ if (!isset($_REQUEST['_no_count'])) {
+ $total = $xx->count($this->countWhat);
+ }
+ if (isset($xx->_real_total)) { // this is used when we subquery the search.
+ $total = $xx->_real_total;
+ }
// sorting..
//
- //var_dump($total);exit;
+ // var_dump($total);exit;
$this->applySort($x);
$fake_limit = false;
- if (!empty($_REQUEST['_distinct']) && $total < 400) {
+ if (!empty($_REQUEST['_distinct']) && $total !== false && $total < 400) {
$fake_limit = true;
}
if (!empty($_REQUEST['query']['add_blank'])) {
$ret[] = array( 'id' => 0, 'name' => '----');
- $total+=1;
+ $total === false ? false : $total+1;
}
$rooar = method_exists($x, 'toRooArray');
$extra = false;
if (method_exists($queryObj ,'postListExtra')) {
- $extra = $queryObj->postListExtra($_REQUEST, $this);
+ $extra = $queryObj->postListExtra($_REQUEST, $this, $ret);
}
// filter results, and add any data that is needed...
if (method_exists($x,'postListFilter')) {
- $ret = $x->postListFilter($ret, $this->authUser, $_REQUEST);
+ $ret = $x->postListFilter($ret, $this->authUser, $_REQUEST, $this);
}
}
- //die("DONE?");
-
- //if ($x->tableName() == 'Documents_Tracking') {
- // $ret = $this->replaceSubject(&$ret, 'doc_id_subject');
- // }
-
if (!empty($_REQUEST['_requestMeta']) && count($ret)) {
$meta = $this->meta($x, $ret);
if ($meta) {
+ $extra = $extra ? $extra: array();
$extra['metaData'] = $meta;
}
}
// this make take some time...
$this->sessionState(0);
// echo "<PRE>"; print_r($ret);
- $this->jdata($ret, max(count($ret), $total), $extra );
+ $this->jdata($ret, max(count($ret), $total === false ? 0 : $total), $extra );
}
$rooar = method_exists($data, 'toRooArray');
while($data->fetch()) {
$x = $rooar ? $data->toRooArray($q) : $data->toArray();
-
-
+
if ($cols == '*') { /// did we get cols sent to us?
$cols = array_keys($x);
}
// 'fillBlank' => 'gray', // set
);
//die('here');
- if (method_exists($this->do, 'toSimpleExcelColumn')) {
+ if (!empty($this->do) && method_exists($this->do, 'toSimpleExcelColumn')) {
$add = $this->do->toSimpleExcelColumn($add);
}
* - return false for fail and set DO->err;
*
* beforeUpdate($old, $request,$roo)
- * - after update - jerr() will stop insert..
+ * - before update - jerr() will stop insert..
* beforeInsert($request,$roo)
* - before insert - jerr() will stop insert..
*
$ms ? json_decode($ms) : false
);
}
+
if ($ms !== false) {
return $this->multiSort($x);
}
-
+
if ($sorted === false) {
-
$cols = $x->tableColumns();
$excols = array_keys($this->cols);
if (method_exists($x, 'toRooArray')) {
$this->jok($x->toRooArray($req));
}
-
$this->jok($x->toArray());
function insert($x, $req, $with_perm_check = true)
{
- if (method_exists($x, 'setFromRoo')) {
+ if (method_exists($x, 'setFromRoo')) {
$res = $x->setFromRoo($req, $this);
if (is_string($res)) {
$this->jerr($res);
} else {
$x->setFrom($req);
}
-
+
if ( $with_perm_check && !$this->checkPerm($x,'A', $req)) {
- $this->jerr("PERMISSION DENIED (i)");
+ $this->jerr("PERMISSION DENIED {$x->tableName()}:checkPerm(A)");
}
$cols = $x->tableColumns();
}
$ev = $this->addEvent("ADD", $x);
if (method_exists($x, 'onInsert')) {
+
$x->onInsert($_REQUEST, $this, $ev);
}
if ($ev) {
$ev->audit($x);
}
-
+
// note setFrom might handle this before hand...!??!
if (!empty($_FILES) && method_exists($x, 'onUpload')) {
$x->onUpload($this, $_REQUEST);
$match_total = 0;
if ( $has_beforeDelete ) {
- if ($xx->beforeDelete($match_ar, $this) === false) {
+ if ($xx->beforeDelete($match_ar, $this, $_REQUEST) === false) {
$errs[] = "Delete failed ({$xx->id})\n".
(isset($xx->err) ? $xx->err : '');
continue;
$x->whereAdd("(on_id = $oid OR
on_id IN ( SELECT distinct(id) FROM Documents WHERE original = $o )
)");
- continue;
+ continue 2;
}
$x->on_id = $val;
// the aobve rule for !strlen non-joined cols should apply to joined ones.
if (!strlen($val)) {
- continue;
+ continue 2;
}
}
- continue;
+ continue 2;
}
}
if (!empty($q_filtered)) {