Pman/Images.php
[Pman.Base] / Pman / Roo.php
index 5842ba8..7597356 100644 (file)
@@ -16,12 +16,12 @@ require_once 'Pman.php';
  * - 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() // single fetch, add data..
+ * - toRooSingleArray($authUser) // single fetch, add data..
  * - toRooArray($request) /// toArray if you need to return different data.. for a list fetch.
  * 
  * 
  * - beforeDelete() -- return false for fail and set DO->err;
- * - onUpdate($old, $request,$roo) - after update
+ * - onUpdate($old, $request,$roo) - after update // return value ignored
  * - onInsert($request,$roo) - after insert
  * - onUpload($roo)
  * - setFromRoo($ar) - values from post (deal with dates etc.) - return true|error string.
@@ -45,6 +45,9 @@ class Pman_Roo extends Pman
      * GET method   Roo/TABLENAME.php 
      * -- defaults to listing data. with args.
      * 
+     * !colname=....                 => colname != ....
+     * colname[0]=... colname[1]=... => colname IN (.....) ** only supports main table at present..
+     * 
      * other opts:
      * _post      = simulate a post with debuggin on.
      * lookup     =  array( k=>v) single fetch based on a key/value pair
@@ -58,8 +61,8 @@ class Pman_Roo extends Pman
      * 
      * csvTitles  = return data as csv
      *
-     * sort        = sort column
-     * dir         = sort direction
+     * sort        = sort column (',' comma delimited)
+     * dir         = sort direction ?? in future comma delimited...
      * start       = limit start
      * limit       = limit number 
      * 
@@ -70,7 +73,7 @@ class Pman_Roo extends Pman
     function get($tab)
     {
          //  $this->jerr("Not authenticated", array('authFailure' => true));
-         //DB_DataObject::debuglevel(1);
+        // DB_DataObject::debuglevel(1);
         
         // debugging...
         if (!empty($_GET['_post'])) {
@@ -172,31 +175,7 @@ class Pman_Roo extends Pman
         // sorting..
       //   DB_DataObject::debugLevel(1);
         
-        $sort = empty($_REQUEST['sort']) ? '' : $_REQUEST['sort'];
-        $dir = (empty($_REQUEST['dir']) || strtoupper($_REQUEST['dir']) == 'ASC' ? 'ASC' : 'DESC');
-        
-        $sorted = false;
-        if (method_exists($x, 'applySort')) {
-            $sorted = $x->applySort($this->authUser, $sort, $dir, array_keys($this->cols));
-        }
-        if ($sorted === false) {
-            
-            $cols = $x->table();
-           // echo '<PRE>';print_r(array($sort, $this->cols));
-            // other sorts??? 
-           // $otherSorts = array('person_id_name');
-            
-            if (strlen($sort) && isset($cols[$sort]) ) {
-                $sort = $x->tableName() .'.'.$sort . ' ' . $dir ;
-                $x->orderBy($sort );
-            } else if (in_array($sort, array_keys($this->cols))) {
-                $sort = $sort . ' ' . $dir ;
-                $x->orderBy($sort );
-            }// else other formatas?
-            //if ( in_array($sort, $otherSorts)) {
-            //    $x->orderBy($sort . ' ' . $dir);
-            ////}
-        }
+        $this->applySort($x);
         
         
  
@@ -280,6 +259,49 @@ class Pman_Roo extends Pman
         $this->jdata($ret,$total, $extra );
 
     
+    }
+    /**
+     * applySort
+     * 
+     * apply REQUEST[sort] and [dir]
+     * sort may be an array of columsn..
+     * 
+     * @arg   DB_DataObject $x
+     * 
+     */
+    function applySort($x)
+    {
+        
+       // Db_DataObject::debugLevel(1);
+        $sort = empty($_REQUEST['sort']) ? '' : $_REQUEST['sort'];
+        $dir = (empty($_REQUEST['dir']) || strtoupper($_REQUEST['dir']) == 'ASC' ? 'ASC' : 'DESC');
+        
+        
+        
+        $sorted = false;
+        if (method_exists($x, 'applySort')) {
+            $sorted = $x->applySort($this->authUser, $sort, $dir, array_keys($this->cols));
+        }
+        if ($sorted === false) {
+            
+            $cols = $x->table();
+            $sort_ar = explode(',', $sort);
+            $sort_str = array();
+          
+            foreach($sort_ar as $sort) {
+                
+                if (strlen($sort) && isset($cols[$sort]) ) {
+                    $sort_str[] =  $x->tableName() .'.'.$sort . ' ' . $dir ;
+                    
+                } else if (in_array($sort, array_keys($this->cols))) {
+                    $sort_str[] = $sort . ' ' . $dir ;
+                }
+            }
+             
+            if ($sort_str) {
+                $x->orderBy(implode(', ', $sort_str ));
+            }
+        }
     }
      /**
      * POST method   Roo/TABLENAME.php 
@@ -302,6 +324,7 @@ class Pman_Roo extends Pman
         if (!empty($_REQUEST['_get'])) {
             return $this->get($tab);
         }
+      
         $_columns = !empty($_REQUEST['_columns']) ? explode(',', $_REQUEST['_columns']) : false;
         
         $tab = str_replace('/', '',$tab); // basic protection??
@@ -314,6 +337,14 @@ class Pman_Roo extends Pman
         if (empty($keys) ) {
             $this->jerr('no key');
         }
+        
+          // delete should be here...
+        if (isset($_REQUEST['_delete'])) {
+            // do we really delete stuff!?!?!?
+            return $this->delete($x,$_REQUEST);
+        } 
+         
+        
         $old = false;
         
         if (!empty($_REQUEST['_ids'])) {
@@ -338,6 +369,11 @@ class Pman_Roo extends Pman
             }
             $this->jok($this->update($x, $_REQUEST));
         } else {
+            
+            if (empty($_POST)) {
+                $this->jerr("No data recieved for inserting");
+            }
+            
             $this->jok($this->insert($x, $_REQUEST));
             
         }
@@ -414,14 +450,17 @@ class Pman_Roo extends Pman
         }
         
         $r = DB_DataObject::factory($x->tableName());
-        $r->id = $x->id;
+          $pk = $x->keys();
+        // let's assume it has a key!!!
+        $pk = $pk[0];
+        $r->$pk = $x->$pk;
         $this->loadMap($r, $_columns);
         $r->limit(1);
         $r->find(true);
         
         $rooar = method_exists($r, 'toRooArray');
         //print_r(var_dump($rooar)); exit;
-        return $rooar  ? $r->toRooArray() : $r->toArray();
+        return $rooar  ? $r->toRooArray($_REQUEST) : $r->toArray();
     }
     
     
@@ -478,20 +517,25 @@ class Pman_Roo extends Pman
         }
         
         $r = DB_DataObject::factory($x->tableName());
-        $r->id = $x->id;
+        $pk = $x->keys();
+        // let's assume it has a key!!!
+        $pk = $pk[0];
+        $r->$pk = $x->$pk;
         $this->loadMap($r, $_columns);
         $r->limit(1);
         $r->find(true);
         $rooar = method_exists($r, 'toRooArray');
         //print_r(var_dump($rooar)); exit;
-        return $rooar  ? $r->toRooArray() : $r->toArray();
+        return $rooar  ? $r->toRooArray($_REQUEST) : $r->toArray();
     }
     
     function delete($x, $req)
     {
         // do we really delete stuff!?!?!?
-       
-       
+        if (empty($req['_delete'])) {
+            $this->jerr("Delete Requested with no value");
+            
+        }
         // build a list of tables to queriy for dependant data..
         $map = $x->links();
         
@@ -511,7 +555,7 @@ class Pman_Roo extends Pman
         // collect tables
         
        // echo '<PRE>';print_r($affects);exit;
-        //DB_Dataobject::debugLevel(1);
+       //DB_Dataobject::debugLevel(1);
        
         
         $clean = create_function('$v', 'return (int)$v;');
@@ -519,9 +563,14 @@ class Pman_Roo extends Pman
         $bits = array_map($clean, explode(',', $req['_delete']));
         
        // print_r($bits);exit;
+         $pk = $x->keys();
+        // let's assume it has a key!!!
+        $pk = $pk[0];
         
-        $x->whereAdd('id IN ('. implode(',', $bits) .')');
-        $x->find();
+        $x->whereAdd($pk .'  IN ('. implode(',', $bits) .')');
+        if (!$x->find()) {
+            $this->jerr("Nothing found to delete");
+        }
         $errs = array();
         while ($x->fetch()) {
             $xx = clone($x);
@@ -530,9 +579,12 @@ class Pman_Roo extends Pman
             foreach($affects as $k=> $true) {
                 $ka = explode('.', $k);
                 $chk = DB_DataObject::factory($ka[0]);
-                $chk->{$ka[1]} =  $xx->id;
+                if (!is_a($chk,'DB_DataObject')) {
+                    $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');
+                    $this->jerr('Delete Dependant records first ('. $ka[0]. ':' . $ka[1] .'='.$xx->$pk.')');
                 }
             }
             
@@ -686,14 +738,42 @@ class Pman_Roo extends Pman
      */
     function meta($x, $data)
     {
+        // this is not going to work on queries where the data does not match the database def..
+        // for unknown columns we send them as stirngs..
+        $lost = 0;
+        $cols  = array_keys($data[0]);
+     
+        
+        
         
         //echo '<PRE>';print_r($this->cols); exit;
         $options = &PEAR::getStaticProperty('DB_DataObject','options');
-         
-        echo '<PRE>';print_r(($options["ini_{$x->_database}"] );exit;
+        $reader = $options["ini_{$x->_database}"] .'.reader';
+        if (!file_exists( $reader )) {
+            return;
+        }
         
-        file_put_contents($options["ini_{$x->_database}"] . '.reader', serialize($out));
-         
+        $rdata = unserialize(file_get_contents($reader));
+        
+       // echo '<PRE>';print_r($rdata);exit;
+        
+        $meta = array();
+        foreach($cols as $c ) {
+            if (!isset($this->cols[$c]) || !isset($rdata[$this->cols[$c]]) || !is_array($rdata[$this->cols[$c]])) {
+                $meta[] = $c;
+                continue;    
+            }
+            $add = $rdata[$this->cols[$c]];
+            $add['name'] = $c;
+            $meta[] = $add;
+        }
+        return array(
+            'totalProperty' =>  'total',
+            'successProperty' => 'success',
+            'root' => 'data',
+            'id' => 'id',
+            'fields' => $meta
+        );
          
         
     }
@@ -710,9 +790,35 @@ class Pman_Roo extends Pman
         
         foreach($q as $key=>$val) {
             
-            if (is_array($val)) {
+            if (is_array($val) ) {
+                
+                if (!in_array( $key,  array_keys($this->cols))) {
+                    continue;
+                }
+                
+                // support a[0] a[1] ..... => whereAddIn(
+                $ar = array();
+                $quote = false;
+                foreach($val as $k=>$v) {
+                    if (!is_numeric($k)) {
+                        $ar = array();
+                        break;
+                    }
+                    if (!is_numeric($v) || !is_long($v)) {
+                        $quote = true;
+                    }
+                    $ar[] = $v;
+                    
+                }
+                if (count($ar)) {
+                    $x->whereAddIn($x->tableName(). '.'.$key,$ar, $quote ? 'string' : 'int');
+                }
+                
                 continue;
             }
+            
+            
+            
             if ($key[0] == '!' && in_array(substr($key, 1), array_keys($this->cols))) {
                     
                 $x->whereAdd( $x->tableName() .'.' .substr($key, 1) . ' != ' .