Pman/Images.php
[Pman.Base] / Pman / Roo.php
index b4f87eb..46bcb61 100644 (file)
@@ -46,7 +46,7 @@ class Pman_Roo extends Pman
      * -- defaults to listing data. with args.
      * 
      * !colname=....                 => colname != ....
-     * colname[0]=... colname[1]=... => colname IN (.....)
+     * colname[0]=... colname[1]=... => colname IN (.....) ** only supports main table at present..
      * 
      * other opts:
      * _post      = simulate a post with debuggin on.
@@ -57,9 +57,9 @@ class Pman_Roo extends Pman
      * _distinct   = a distinct column lookup.
      * _requestMeta = default behaviour of Roo stores.. on first query..
      * 
-     * csvCols    = return data as csv
+     * csvCols[0] csvCols[1]....    = .... column titles for CSV output
      * 
-     * csvTitles  = return data as csv
+     * csvTitle[0], csvTitle[1] ....  = columns to use for CSV output
      *
      * sort        = sort column (',' comma delimited)
      * dir         = sort direction ?? in future comma delimited...
@@ -73,8 +73,11 @@ class Pman_Roo extends Pman
     function get($tab)
     {
          //  $this->jerr("Not authenticated", array('authFailure' => true));
-         //DB_DataObject::debuglevel(1);
+       //echo '<PRE>';print_R($_GET);  DB_DataObject::debuglevel(1);
         
+        $this->init(); // from pnan.
+        
+        HTML_FlexyFramework::get()->generateDataobjectsCache($this->isDev);
         // debugging...
         if (!empty($_GET['_post'])) {
             $_POST  = $_GET;
@@ -145,36 +148,23 @@ class Pman_Roo extends Pman
             $this->jok("Updated");
             
         }
-      // DB_DataObject::debugLevel(1);
+       //DB_DataObject::debugLevel(1);
         if (method_exists($x, 'checkPerm') && !$x->checkPerm('S', $this->authUser))  {
             $this->jerr("PERMISSION DENIED");
         }
-        $map = $this->loadMap($x, $_columns);
-        
-        $this->setFilters($x,$_REQUEST);
         
-         
+        // 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.
-        $countWhat = false;
-        if (!empty($_REQUEST['_distinct'])) {
-            $cols = $x->table();
-           // print_r($cols);
-          
-            if (isset($cols[$_REQUEST['_distinct']])) {
-                $countWhat = 'distinct ' . $_REQUEST['_distinct'];
-                $x->selectAdd();
-                $x->selectAdd('distinct('.$_REQUEST['_distinct'].')');
-                $_columns = array( $_REQUEST['_distinct'] );
-            } else {
-                $this->jerr('invalid distinct');
-            }
-             
-        }
-        $total = $x->count($countWhat);
+          //DB_DataObject::debugLevel(1);
+        $total = $x->count($this->countWhat);
         // sorting..
-      //   DB_DataObject::debugLevel(1);
-        
+      //   
+        //var_dump($total);exit;
         $this->applySort($x);
         
         
@@ -209,7 +199,7 @@ class Pman_Roo extends Pman
         if (!empty($_REQUEST['csvCols']) && !empty($_REQUEST['csvTitles']) ) {
             header('Content-type: text/csv');
             
-            header('Content-Disposition: attachment; filename="documentlist-export-'.date('Y-m-d') . '.csv"');
+            header('Content-Disposition: attachment; filename="list-export-'.date('Y-m-d') . '.csv"');
             //header('Content-type: text/plain');
             $fh = fopen('php://output', 'w');
             fputcsv($fh, $_REQUEST['csvTitles']);
@@ -269,12 +259,13 @@ class Pman_Roo extends Pman
      * @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';
         
         
         
@@ -555,7 +546,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;');
@@ -568,7 +559,9 @@ class Pman_Roo extends Pman
         $pk = $pk[0];
         
         $x->whereAdd($pk .'  IN ('. implode(',', $bits) .')');
-        $x->find();
+        if (!$x->find()) {
+            $this->jerr("Nothing found to delete");
+        }
         $errs = array();
         while ($x->fetch()) {
             $xx = clone($x);
@@ -577,9 +570,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.')');
                 }
             }
             
@@ -607,16 +603,16 @@ class Pman_Roo extends Pman
     
     
     var $cols = array();
-    function loadMap($do, $filter=false) 
+    function loadMap($do, $filter=false, $distinct = false
     {
         //DB_DataObject::debugLevel(1);
         $conf = array();
         
-        
         $this->init();
+        
         $mods = explode(',',$this->appModules);
         
-        $ff = HTML_FlexyFramework::geT();
+        $ff = HTML_FlexyFramework::get();
         //$db->databaseName();
         
         //$ff->DB_DataObject['ini_'. $db->database()];
@@ -657,21 +653,32 @@ class Pman_Roo extends Pman
         $xx = array_keys($tabdef);
         $do->selectAdd(); // we need thsi as normally it's only cleared by an empty selectAs call.
         
-        if ($filter) {
+        $selectAs = array(array(  $xx , '%s', false));
+        $this->countWhat = false;
+        $has_distinct = false;
+        if ($filter || $distinct) {
             $cols = array();
-         
+            //echo '<PRE>' ;print_r($filter);exit;
             foreach($xx as $c) {
-                if (in_array($c, $filter)) {
+                if ($distinct && $distinct == $c) {
+                    $has_distinct = 'DISTINCT( ' . $do->tableName() .'.'. $c .') as ' . $c;
+                    $this->countWhat =  'DISTINCT  ' . $do->tableName() .'.'. $c .'';
+                    continue;
+                }
+                if (!$filter || in_array($c, $filter)) {
                     $cols[] = $c;
                 }
             }
-            $do->selectAs($cols);
-        } else {
-            $do->selectAs($xx);
-        }
-        
+            
+            
+            $selectAs = empty($cols) ?  array() : array(array(  $cols , '%s', false)) ;
+            
+            
+            
+        } 
         
         $this->cols = array();
+        $this->colsJoinName =array();
         foreach($xx as $k) {
             $this->cols[$k] = $do->tableName(). '.' . $k;
         }
@@ -701,29 +708,51 @@ class Pman_Roo extends Pman
             $xx = array_keys($tabdef);
             
             
-            if ($filter) {
+            if ($filter || $distinct) {
                 $cols = array();
                 foreach($xx as $c) {
-                    
                     $tn = sprintf($ocl.'_%s', $c);
-                    if (in_array($tn, $filter)) {
+                  // echo '<PRE>'; var_dump($tn);
+                    if ($distinct && $tn == $distinct) {
+                        $has_distinct = 'DISTINCT( ' . 'join_'.$ocl.'_'.$col.'.'.$k .')  as ' . $tn ;
+                        $this->countWhat =  'DISTINCT  join_'.$ocl.'_'.$col.'.'.$k;
+                        continue;
+                    }
+                    
+                    
+                    if (!$filter || in_array($tn, $filter)) {
                         $cols[] = $c;
                     }
                 }
-                $do->selectAs($cols, $ocl.'_%s', 'join_'.$ocl.'_'. $col);
+                if (!empty($cols)) {
+                     $selectAs[] = array($cols, $ocl.'_%s', 'join_'.$ocl.'_'. $col);
+                }
+               
+                
             } else {
-                $do->selectAs($xx,  $ocl.'_%s', 'join_'.$ocl.'_'. $col);
+                $selectAs[] = array($xx, $ocl.'_%s', 'join_'.$ocl.'_'. $col);
+                
             }
              
             
             foreach($xx as $k) {
                 $this->cols[sprintf($ocl.'_%s', $k)] = $tab.'.'.$k;
+                $this->colsJname[sprintf($ocl.'_%s', $k)] = 'join_'.$ocl.'_'.$col.'.'.$k;
             }
             
             
         }
-        //DB_DataObject::debugLevel(1);
         
+        if ($has_distinct) {
+            $do->selectAdd($has_distinct);
+        }
+        //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($this->colsJname);exit;
+        foreach($selectAs as $ar) {
+            $do->selectAs($ar[0], $ar[1], $ar[2]);
+        }
         
         
     }
@@ -785,6 +814,7 @@ class Pman_Roo extends Pman
         
         foreach($q as $key=>$val) {
             
+            // value is an array..
             if (is_array($val) ) {
                 
                 if (!in_array( $key,  array_keys($this->cols))) {
@@ -799,6 +829,8 @@ class Pman_Roo extends Pman
                         $ar = array();
                         break;
                     }
+                    // FIXME: note this is not typesafe for anything other than mysql..
+                    
                     if (!is_numeric($v) || !is_long($v)) {
                         $quote = true;
                     }
@@ -806,7 +838,13 @@ class Pman_Roo extends Pman
                     
                 }
                 if (count($ar)) {
-                    $x->whereAddIn($key,$ar, $quote ? 'string' : 'int');
+                    
+                    
+                    $x->whereAddIn(
+                        isset($this->colsJname[$key]) ? 
+                            $this->colsJname[$key] :
+                            ($x->tableName(). '.'.$key),
+                        $ar, $quote ? 'string' : 'int');
                 }
                 
                 continue;
@@ -815,8 +853,13 @@ class Pman_Roo extends Pman
             
             
             if ($key[0] == '!' && in_array(substr($key, 1), array_keys($this->cols))) {
-                    
-                $x->whereAdd( $x->tableName() .'.' .substr($key, 1) . ' != ' .
+                
+                $key  = substr($key, 1) ;
+                
+                $x->whereAdd(   (
+                        isset($this->colsJname[$key]) ? 
+                            $this->colsJname[$key] :
+                            $x->tableName(). '.'.$key ) . ' != ' .
                     (is_numeric($val) ? $val : "'".  $x->escape($val) . "'")
                 );
                 continue;
@@ -827,7 +870,7 @@ class Pman_Roo extends Pman
             
             switch($key) {
                     
-                // Events and remarks
+                // Events and remarks -- fixme - move to events/remarsk...
                 case 'on_id':  // where TF is this used...
                     if (!empty($q['query']['original'])) {
                       //  DB_DataObject::debugLevel(1);
@@ -847,14 +890,31 @@ class Pman_Roo extends Pman
                         $q_filtered[$key] = $val;
                     }
                     
+                    // subjoined columns = check the values.
+                    // note this is not typesafe for anything other than mysql..
+                    
+                    if (isset($this->colsJname[$key])) {
+                        $quote = false;
+                        if (!is_numeric($val) || !is_long($val)) {
+                            $quote = true;
+                        }
+                        $x->whereAdd( "{$this->colsJname[$key]} = " . ($quote ? "'". $x->escape($val) ."'" : $val));
+                        
+                    }
+                    
+                    
                     continue;
             }
         }
+        
         $x->setFrom($q_filtered);
+        
+        
+        
        
         // nice generic -- let's get rid of it.. where is it used!!!!
         // used by: 
-        // Person / Group
+        // Person / Group / most of my queries noww...
         if (!empty($q['query']['name'])) {
             $x->whereAdd($x->tableName().".name LIKE '". $x->escape($q['query']['name']) . "%'");
         }