Loading rico1 and rico3 files
[infodrom/rico3] / plugins / php / ricoLiveGridForms.php
1 <?php\r
2 //**********************************\r
3 // Rico: GENERIC TABLE/VIEW EDITOR\r
4 //  By Matt Brown\r
5 //**********************************\r
6 \r
7 class TableEditTable {\r
8   var $TblName;\r
9   var $alias;\r
10   var $arFields;\r
11   var $arData;\r
12   var $arColInfo;\r
13 }\r
14 \r
15 class TableEditClass {\r
16 \r
17   // public properties\r
18   var $action;\r
19   var $TableFilter;\r
20   var $options;\r
21   var $AutoInit;\r
22   var $CurrentField;\r
23   var $LookupField;\r
24   var $SvrOnly;\r
25   var $gridID;\r
26   var $formVar;\r
27   var $gridVar;\r
28   var $bufferVar;\r
29   var $optionsVar;\r
30   var $DefaultSort;\r
31   var $convertCharSet; // set to true if database is ISO-8859-1 encoded, false if UTF-8\r
32   var $sessions;\r
33 \r
34   // private properties\r
35   var $Panels=array();\r
36   var $objDB;\r
37   var $CurrentPanel;\r
38   var $xhtmlcloser;\r
39   var $ErrorFlag;\r
40   var $ErrorMsg;\r
41   var $MainTbl;\r
42   var $Tables=array();\r
43   var $TableCnt;\r
44   var $Fields=array();\r
45   var $FieldCnt;\r
46   var $oParseMain;\r
47 \r
48   //*************************************************************************************\r
49   // Class Constructor\r
50   //*************************************************************************************\r
51   function TableEditClass() {\r
52     if (is_object($GLOBALS['oDB'])) {\r
53       $this->objDB=&$GLOBALS['oDB'];    // use oDB global as database connection, if it exists\r
54     }\r
55     $this->options=array();\r
56     $this->options["TableSelectNew"]="___new___";\r
57     $this->options["TableSelectNone"]="";\r
58     $this->options["canAdd"]=true;\r
59     $this->options["canEdit"]=true;\r
60     $this->options["canDelete"]=true;\r
61     $this->options["ConfirmDelete"]=true;\r
62     $this->options["ConfirmDeleteCol"]=-1;\r
63     $this->options["DebugFlag"]=isset($_GET["debug"]);\r
64     $this->options["prefetchBuffer"]=true;\r
65     $this->options["PanelNamesOnTabHdr"]=true;\r
66     $this->options["highlightElem"]="menuRow";\r
67 \r
68     $this->SvrOnly=array();\r
69     $this->SvrOnly["DropDownSelect"]=1;\r
70     $this->SvrOnly["SelectSql"]=1;\r
71     $this->SvrOnly["SelectFilter"]=1;\r
72     $this->SvrOnly["Formula"]=1;\r
73     $this->SvrOnly["TableIdx"]=1;\r
74     $this->SvrOnly["AddQuotes"]=1;\r
75     $this->SvrOnly["FilterFlag"]=1;\r
76     $this->SvrOnly["XMLprovider"]=1;\r
77 \r
78     $this->xhtmlcloser=">";\r
79     $this->FieldCnt=-1;\r
80     $this->CurrentPanel=-1;\r
81     $this->TableCnt=-1;\r
82     $this->AutoInit=true;\r
83     $this->formView=true;\r
84     $this->sessions=isset($_SESSION);\r
85     $this->ErrorFlag=false;\r
86     $this->ErrorMsg="";\r
87     $this->convertCharSet=false;\r
88     $this->oParseMain= new sqlParse();\r
89     $this->oParseMain->Init();\r
90   }\r
91 \r
92   // -------------------------------------------------------------\r
93   // Class Destructor (only called if php5)\r
94   // -------------------------------------------------------------\r
95   function __destruct() {\r
96     for ($i=0; $i<count($this->Fields); $i++) {\r
97       $this->Fields[$i]=NULL;\r
98     }\r
99     $this->options=NULL;\r
100     $this->SvrOnly=NULL;\r
101   }\r
102 \r
103   // returns field number if successful, false if error\r
104   function AddEntryField($ColumnName, $Heading, $EntryTypeCode, $DefaultValue) {\r
105     if (!in_array($EntryTypeCode, array("S", "N", "R", "H", "D", "DT", "I", "F", "B", "T", "TA", "SL", "RL", "CL", "tinyMCE"))) {\r
106       $this->TableEditError("invalid EntryTypeCode in TableEditClass");\r
107       return false;\r
108     }\r
109     $this->IncrCurrentField();\r
110     $this->CurrentField["ColName"]=$ColumnName;\r
111     $this->CurrentField["Hdg"]=$Heading;\r
112     $this->CurrentField["EntryType"]=$EntryTypeCode;\r
113     $this->CurrentField["ColData"]=$DefaultValue;\r
114     switch ($EntryTypeCode) {\r
115 \r
116       case "D":\r
117         $this->CurrentField["type"]="date";\r
118         break;\r
119 \r
120       case "DT":\r
121         $this->CurrentField["type"]="datetime";\r
122         break;\r
123 \r
124       case "TA":\r
125       case "tinyMCE":\r
126         $this->CurrentField["TxtAreaRows"]=4;\r
127         $this->CurrentField["TxtAreaCols"]=80;\r
128         break;\r
129 \r
130       case "R":\r
131       case "RL":\r
132         $this->CurrentField["RadioBreak"]="<br".$this->xhtmlcloser;\r
133         break;\r
134 \r
135       case "H":\r
136         $this->CurrentField["visible"]=false;\r
137         break;\r
138     }\r
139     $s=$this->Tables[$this->MainTbl]->alias.".".$ColumnName;\r
140     if (in_array($EntryTypeCode, array("B", "T", "TA", "tinyMCE"))) $s="rtrim(" . $s . ")";\r
141     $this->oParseMain->AddColumn($s, "rico_col".$this->FieldCnt);\r
142     return $this->FieldCnt;\r
143   }\r
144 \r
145   // returns field number if successful, false if error\r
146   function AddEntryFieldW($ColumnName, $Heading, $EntryTypeCode, $DefaultValue, $Width) {\r
147     $retval=$this->AddEntryField($ColumnName, $Heading, $EntryTypeCode, $DefaultValue);\r
148     if ($retval!==false) $this->CurrentField["width"]=$Width;\r
149     return $retval;\r
150   }\r
151   \r
152   // $DescColName is optional - pass empty if not used\r
153   function AddLookupField($CodeColName,$DescColName,$CodeHdg,$DisplayHdg,$EntryTypeCode,$DefaultValue,$sql) {\r
154     $retval=$this->AddEntryField($CodeColName,$CodeHdg,$EntryTypeCode,$DefaultValue);\r
155     $this->CurrentField["visible"]=false;\r
156     $this->CurrentField["SelectSql"]=$sql;\r
157     if (!empty($DescColName)) $this->CurrentField["DescriptionField"]=$this->ExtFieldId($this->FieldCnt+1);\r
158     $this->LookupField=&$this->Fields[$this->FieldCnt];\r
159     $oParseLookup= new sqlParse();\r
160     $alias="t" . $this->FieldCnt;\r
161     $oParseLookup->ParseSelect($sql);\r
162     if (count($oParseLookup->arSelList) == 2) {\r
163       $codeField=$oParseLookup->arSelList[0];\r
164       $descField=$oParseLookup->arSelList[1];\r
165       $s="left join ".$oParseLookup->FromClause." ".$alias." on t.".$CodeColName."=".$alias.".".str_replace("%alias%","",str_replace("%aliasmain%","",$codeField));\r
166       if (!empty($oParseLookup->WhereClause)) $s.=" and " . str_replace("%alias%",$alias.".",$oParseLookup->WhereClause);\r
167       $this->oParseMain->AddJoin($s);\r
168       $this->IncrCurrentField();\r
169       $this->CurrentField["ColName"]="Lookup_".$this->FieldCnt;\r
170       $this->CurrentField["Hdg"]=$DisplayHdg;\r
171       if (!empty($DescColName)) {\r
172         $descField=$this->Tables[$this->MainTbl]->alias & "." & $DescColName;\r
173         $this->CurrentField["ColName"]=$DescColName;\r
174         $this->CurrentField["FormView"]="hidden";\r
175         $this->CurrentField["EntryType"]="T";\r
176       } else if (preg_match("/^\\w+$/",$descField)) {\r
177         $descField=$alias.".".$descField;\r
178       } else {\r
179         $descField=str_replace("%alias%",$alias . ".",str_replace("%aliasmain%","t.",$descField));\r
180       }\r
181       $this->oParseMain->AddColumn($descField, "rico_col".$this->FieldCnt);\r
182     }\r
183     else {\r
184       $this->TableEditError("Invalid lookup query (".$sql.")");\r
185     }\r
186   }\r
187 \r
188   // returns field number if successful, false if error\r
189   function AddCalculatedField($ColumnFormula, $Heading) {\r
190     $this->IncrCurrentField();\r
191     if (substr($ColumnFormula,0,1) != "(") {\r
192       $ColumnFormula="(".$ColumnFormula.")";\r
193     }\r
194     $this->CurrentField["ColName"]="Calc_".$this->FieldCnt;\r
195     $this->CurrentField["Hdg"]=$Heading;\r
196     $this->oParseMain->AddColumn($ColumnFormula, "rico_col".$this->FieldCnt);\r
197     return $this->FieldCnt;\r
198   }\r
199 \r
200   function AddPanel($PanelHeading) {\r
201     $this->CurrentPanel++;\r
202     $this->Panels[$this->CurrentPanel]=$PanelHeading;\r
203   }\r
204 \r
205   function DefineAltTable($AltTabName, $arFieldList, $arFieldData) {\r
206     $this->TableCnt++;\r
207     $this->Tables[$this->TableCnt]= new TableEditTable();\r
208     $_withval=$this->Tables[$this->TableCnt];\r
209     $_withval->TblName=$AltTabName;\r
210     $_withval->alias="a" . $this->TableCnt;\r
211     $_withval->arFields=$arFieldList;\r
212     $_withval->arData=$arFieldData;\r
213     if (count($_withval->arFields) != count($_withval->arData)) {\r
214       $this->TableEditError("# of fields does not match # of data entries supplied for table ".$AltTabName);\r
215       return false;\r
216     }\r
217     return $this->TableCnt;\r
218   }\r
219 \r
220   function IncrCurrentField() {\r
221     $this->FieldCnt++;\r
222     $this->Fields[$this->FieldCnt]= array();\r
223     $this->CurrentField= &$this->Fields[$this->FieldCnt];\r
224     $this->CurrentField["panelIdx"]=($this->CurrentPanel >= 0) ? $this->CurrentPanel : 0;\r
225     $this->CurrentField["AddQuotes"]=true;\r
226     $this->CurrentField["ReadOnly"]=false;\r
227     $this->CurrentField["TableIdx"]=$this->MainTbl;\r
228   }\r
229 \r
230   function SetTableName($s) {\r
231     $this->TableCnt++;\r
232     $this->MainTbl=$this->TableCnt;\r
233     $this->Tables[$this->TableCnt]= new TableEditTable();\r
234     $this->Tables[$this->MainTbl]->TblName=$s;\r
235     $this->Tables[$this->MainTbl]->alias="t";\r
236     $this->oParseMain->FromClause=$s." t";\r
237     $this->gridID=strtolower(str_replace(" ","_",str_replace(".","_",$s)));\r
238     $this->formVar=$this->gridID . "['edit']";\r
239     $this->gridVar=$this->gridID . "['grid']";\r
240     $this->bufferVar=$this->gridID . "['buffer']";\r
241     $this->optionsVar=$this->gridID . "['options']";\r
242     $actionparm="_action_".$this->gridID;\r
243     $this->action=isset($_REQUEST[$actionparm]) ? trim($_REQUEST[$actionparm]) : "";\r
244     $this->action=($this->action == "") ? "table" : strtolower($this->action);\r
245   }\r
246 \r
247   function AddSort($field,$direction) {\r
248     if (!empty($this->DefaultSort)) $this->DefaultSort.=",";\r
249     $this->DefaultSort.=$field . " " . $direction;\r
250   }\r
251 \r
252   function SortCurrent($direction) {\r
253     if (array_key_exists("Formula",$this->CurrentField))\r
254       $this->AddSort($this->CurrentField["Formula"],$direction);\r
255     elseif (array_key_exists("ColName",$this->CurrentField))\r
256       $this->AddSort($this->Tables[$this->CurrentField["TableIdx"]]->alias . "." . $this->CurrentField["ColName"],$direction);\r
257     $this->options["sortCol"]=$this->FieldCnt;\r
258     $this->options["sortDir"]=$direction;\r
259   }\r
260 \r
261   function SortAsc() {\r
262     $this->SortCurrent("ASC");\r
263   }\r
264 \r
265   function SortDesc() {\r
266     $this->SortCurrent("DESC");\r
267   }\r
268 \r
269   function ConfirmDeleteColumn() {\r
270     $this->options["ConfirmDeleteCol"]=$this->FieldCnt;\r
271   }\r
272 \r
273   function genXHTML() {\r
274     $this->xhtmlcloser=" />";\r
275   }\r
276 \r
277   function SetDbConn(&$dbcls) {\r
278     $this->objDB=&$dbcls;\r
279   }\r
280 \r
281   //*************************************************************************************\r
282   // Take appropriate action\r
283   //*************************************************************************************\r
284   function DisplayPage() {\r
285     if (count($this->Fields) == 0) {\r
286       return;\r
287     }\r
288     if (!$this->ErrorFlag) {\r
289       $this->GetColumnInfo();\r
290     }\r
291     if (!$this->ErrorFlag) {\r
292       switch ($this->action) {\r
293 \r
294         case "del":\r
295           if ($this->options["canDelete"]) {\r
296             $this->TableDeleteRecord();\r
297           }\r
298           break;\r
299 \r
300         case "ins":\r
301           if ($this->options["canAdd"]) {\r
302             $this->TableInsertRecord();\r
303           }\r
304           break;\r
305 \r
306         case "upd":\r
307           if ($this->options["canEdit"]) {\r
308             $this->TableUpdateRecord();\r
309           }\r
310           break;\r
311 \r
312         default:\r
313           if ($this->sessions) $_SESSION[$this->gridID]=$this->SqlSelectData();\r
314           $this->TableDisplay();\r
315           break;\r
316       }\r
317     }\r
318     if ($this->ErrorFlag) {\r
319       echo "\n<p style='color:red;'><span style='text-decoration:underline;'>ERROR ENCOUNTERED</span><br".$this->xhtmlcloser.$this->ErrorMsg;\r
320     }\r
321   }\r
322 \r
323   // if AltTable has a multi-column key, then add those additional constraints\r
324   function AltTableKeyWhereClause($AltTabIdx) {\r
325     for ($i=0; $i<count($this->Tables[$AltTabIdx]->arFields); $i++) {\r
326       if ($this->Tables[$AltTabIdx]->arColInfo[$i]->IsPKey) {\r
327         $w.=" and ".$this->Tables[$AltTabIdx]->arFields[$i]."=".$this->Tables[$AltTabIdx]->arData[$i];\r
328       }\r
329     }\r
330     return $w;\r
331   }\r
332 \r
333   function AltTableJoinClause($alias) {\r
334     for ($i=0; $i<count($this->Fields); $i++) {\r
335       if ($this->Fields[$i]["TableIdx"] == $this->MainTbl && !$this->IsCalculatedField($i)) {\r
336         if ($this->Fields[$i]["ColInfo"]->IsPKey) {\r
337           $this->objDB->AddCondition($w, $this->Fields[$i]["ColName"]."=".$alias.".".$this->Fields[$i]["ColName"]);\r
338         }\r
339       }\r
340     }\r
341     return $w;\r
342   }\r
343 \r
344   // form where clause based on table's primary key\r
345   function TableKeyWhereClause() {\r
346     for ($i=0; $i<count($this->Fields); $i++) {\r
347       if ($this->Fields[$i]["TableIdx"] == $this->MainTbl && !$this->IsCalculatedField($i)) {\r
348         if ($this->Fields[$i]["ColInfo"]->IsPKey) {\r
349           $this->objDB->AddCondition($w, $this->Fields[$i]["ColName"]."=".$this->FormatValue($_POST["_k".$i],$i));\r
350         }\r
351       }\r
352     }\r
353     if (empty($w)) {\r
354       $this->TableEditError("no key value");\r
355     }\r
356     else {\r
357       return " WHERE ".$w;\r
358     }\r
359   }\r
360 \r
361   // name used external to this script\r
362   function ExtFieldId($i) {\r
363     return $this->gridID."_".$i;\r
364   }\r
365 \r
366   function IsCalculatedField($i) {\r
367     return array_key_exists("Formula",$this->Fields[$i]);\r
368   }\r
369 \r
370   //*************************************************************************************\r
371   // Retrieves column info from database for main table and any alternate tables\r
372   //*************************************************************************************\r
373   function GetColumnInfo() {\r
374     $Columns=array();\r
375     $dicColIdx=array();\r
376     for ($FieldNum=0; $FieldNum<count($this->Fields); $FieldNum++) {\r
377       $dicColIdx[$this->Fields[$FieldNum]["TableIdx"].".".strtoupper($this->Fields[$FieldNum]["ColName"])]= $FieldNum;\r
378       if ($this->options["canEdit"] == false && $this->options["canAdd"] == false) {\r
379         $this->Fields[$FieldNum]["ReadOnly"]=true;\r
380       }\r
381     }\r
382     //print_r($dicColIdx);\r
383     for ($i=0; $i<=$this->TableCnt; $i++) {\r
384       $Columns=$this->objDB->GetColumnInfo($this->Tables[$i]->TblName);\r
385       if (!is_array($Columns)) {\r
386         $this->TableEditError("unable to retrieve column info for ".$this->Tables[$i]->TblName."<br>".$this->objDB->LastErrorMsg);\r
387         return;\r
388       }\r
389       //print_r($Columns);\r
390       for ($c=0; $c < count($Columns); $c++) {\r
391         $colname=strtoupper($Columns[$c]->ColName);\r
392         if (array_key_exists($i.".".$colname,$dicColIdx)) {\r
393           $FieldNum=$dicColIdx[$i.".".$colname];\r
394           $this->Fields[$FieldNum]["ColInfo"]=$Columns[$c];\r
395         }\r
396         elseif ($i != $this->MainTbl) {\r
397           for ($j=0; $j < count($this->Tables[$i]->arFields); $j++) {\r
398             if ($colname == $this->Tables[$i]->arFields[$j]) {\r
399               $this->Tables[$i]->arColInfo[$j]=$Columns[$c];\r
400             }\r
401           }\r
402         }\r
403         elseif ($Columns[$c]->IsPKey) {\r
404           $this->TableEditError("primary key field is not defined (".$this->Tables[$i]->TblName.".".$colname.")");\r
405           $dicColIdx=NULL;\r
406           return;\r
407         }\r
408       }\r
409     }\r
410     $dicColIdx=NULL;\r
411   }\r
412 \r
413   function TableUpdateDatabase($sqltext, $actiontxt) {\r
414     if ($this->ErrorFlag) {\r
415       return;\r
416     }\r
417     $cnt=$this->objDB->RunActionQueryReturnMsg($sqltext, $errmsg);\r
418     if ($this->options["DebugFlag"])\r
419       echo "<p class='debug'>".$sqltext."<br".$this->xhtmlcloser."Records affected: ".$cnt;\r
420     if (!empty($errmsg))\r
421       $this->TableEditError("unable to update database!<br".$this->xhtmlcloser.$errmsg);\r
422     else if ($cnt == 1)\r
423       echo "<p class='ricoFormResponse ".$actiontxt."Successfully'></p>";\r
424     else\r
425       $this->TableEditError("no data changed - update skipped");\r
426   }\r
427 \r
428   function FormatValue($v, $idx) {\r
429     $fld=$this->Fields[$idx];\r
430     $addquotes=$fld["AddQuotes"];\r
431     if (substr($fld["EntryType"],0,1) == "D") {\r
432       if ($v == "") {\r
433         $addquotes=false;\r
434         $v="NULL";\r
435       }\r
436     }\r
437     elseif ($fld["EntryType"] == "I" || $fld["EntryType"] == "F") {\r
438       $addquotes=false;\r
439       if ($v == "" || !is_numeric($v)) {\r
440         $v="NULL";\r
441       }\r
442     }\r
443     elseif ($fld["EntryType"] == "N" && $v == $this->options["TableSelectNew"]) {\r
444       $v=trim($_POST["textnew__".$this->ExtFieldId($idx)]);\r
445     }\r
446     elseif (strpos("SNR",substr($fld["EntryType"],0,1)) !== false && $v == $this->options["TableSelectNone"]) {\r
447       $addquotes=false;\r
448       $v="NULL";\r
449     }\r
450     if ($addquotes) $v=$this->objDB->addQuotes($v);\r
451     return $v;\r
452   }\r
453 \r
454   function FormatFormValue($idx) {\r
455     if (!array_key_exists("EntryType",$this->Fields[$idx])) return "";\r
456     $fldname=$this->ExtFieldId($idx);\r
457     if ($this->Fields[$idx]["EntryType"] == "H" || (array_key_exists("FormView",$this->Fields[$idx]) && $this->Fields[$idx]["FormView"] == "exclude"))\r
458       $v=$this->Fields[$idx]["ColData"];\r
459     elseif (isset($_POST[$fldname])) {\r
460       $v=$_POST[$fldname];\r
461       if (get_magic_quotes_gpc()) $v=stripslashes($v);\r
462       $v=($this->convertCharSet) ? utf8_decode($v) : urldecode($v);\r
463       $v=trim($v);\r
464     }\r
465     return $this->FormatValue($v, $idx);\r
466   }\r
467 \r
468   //*************************************************************************************\r
469   // Deletes the specified record\r
470   //*************************************************************************************\r
471   function TableDeleteRecord() {\r
472     $this->TableUpdateDatabase("DELETE FROM ".$this->Tables[$this->MainTbl]->TblName.$this->TableKeyWhereClause(), "deleted");\r
473   }\r
474 \r
475   function UpdateRecord($sqltext) {\r
476     $this->objDB->RunActionQueryReturnMsg($sqltext, $errmsg);\r
477     if (!empty($errmsg)) {\r
478       $errmsg="unable to update database!<br".$this->xhtmlcloser.$errmsg;\r
479       if ($this->options["DebugFlag"]) {\r
480         $errmsg.="<p>SQL: ".$sqltext;\r
481       }\r
482       $this->TableEditError($errmsg);\r
483     }\r
484     elseif ($this->options["DebugFlag"]) {\r
485       echo "<BR class='debug'>".$sqltext;\r
486     }\r
487   }\r
488 \r
489   function UpdateAltTableRecords($i) {\r
490     if ($this->ErrorFlag) {\r
491       return;\r
492     }\r
493     // delete existing record\r
494     $sqltext="delete from ".$this->Tables[$i]->TblName;\r
495     $sqltext.=$this->TableKeyWhereClause();\r
496     $sqltext.=$this->AltTableKeyWhereClause($i);\r
497     $this->UpdateRecord($sqltext);\r
498     // insert new record\r
499     $colnames="";\r
500     $coldata="";\r
501     for ($j=0; $j<count($this->Fields); $j++) {\r
502       if (!array_key_exists("ColInfo",$this->Fields[$j])) continue;\r
503       if ($this->Fields[$j]["TableIdx"] == $i || $this->Fields[$j]["ColInfo"]->IsPKey) {\r
504         $colnames.=",".$this->Fields[$j]["ColName"];\r
505         $coldata.=",".$this->FormatValue(trim($_POST[$this->ExtFieldId($j)]), $j);\r
506       }\r
507     }\r
508     for ($j=0; $j<count($this->Tables[$i]->arFields); $j++) {\r
509       $c=$this->Tables[$i]->arFields[$j];\r
510       $colnames.=",".$c;\r
511       $coldata.=",".$this->Tables[$i]->arData[$j];\r
512     }\r
513     $sqltext="insert into ".$this->Tables[$i]->TblName." (".substr($colnames,1).") values (".substr($coldata,1).")";\r
514     $this->UpdateRecord($sqltext);\r
515   }\r
516 \r
517   //*************************************************************************************\r
518   // Updates an existing record in the db\r
519   //*************************************************************************************\r
520   function TableUpdateRecord() {\r
521     for ($i=0; $i<=$this->TableCnt; $i++) {\r
522       if ($i != $this->MainTbl) {\r
523         $this->UpdateAltTableRecords($i);\r
524       }\r
525     }\r
526     for ($i=0,$sqltext=''; $i<count($this->Fields); $i++) {\r
527       if (!$this->IsCalculatedField($i)) {\r
528         if ($this->Fields[$i]["TableIdx"] == $this->MainTbl && $this->Fields[$i]["ColInfo"]->Writeable && !array_key_exists("InsertOnly",$this->Fields[$i])) {\r
529           $sqltext.=",".$this->Fields[$i]["ColName"]."=".$this->FormatFormValue($i);\r
530         }\r
531       }\r
532     }\r
533     $sqltext="UPDATE ".$this->Tables[$this->MainTbl]->TblName." SET ".substr($sqltext,1);\r
534     $sqltext.=$this->TableKeyWhereClause();\r
535     $this->TableUpdateDatabase($sqltext, "updated");\r
536   }\r
537   //*************************************************************************************\r
538   // Inserts a new record into the db\r
539   //*************************************************************************************\r
540 \r
541   function TableInsertRecord() {\r
542     $keyCnt=0;\r
543     $sqlcol="";\r
544     $sqlval="";\r
545     for ($i=0; $i<count($this->Fields); $i++) {\r
546       if (!$this->IsCalculatedField($i) && $this->Fields[$i]["TableIdx"] == $this->MainTbl && !array_key_exists("UpdateOnly",$this->Fields[$i])) {\r
547         if ($this->Fields[$i]["ColInfo"]->IsPKey) {\r
548           $keyCnt++;\r
549           $keyIdx=$i;\r
550         }\r
551         if ($this->Fields[$i]["ColInfo"]->Writeable) {\r
552           $sqlcol.=",".$this->Fields[$i]["ColName"];\r
553           $sqlval.=",".$this->FormatFormValue($i);\r
554         }\r
555       }\r
556     }\r
557     $sqltext="insert into ".$this->Tables[$this->MainTbl]->TblName." (".substr($sqlcol,1).") values (".substr($sqlval,1).")";\r
558     $this->TableUpdateDatabase($sqltext, "added");\r
559   }\r
560 \r
561   function TableEditError($msg) {\r
562     $this->ErrorFlag=true;\r
563     $this->ErrorMsg=$msg;\r
564   }\r
565   \r
566   //*************************************************************************************\r
567   // Do post-processing on sql query\r
568   //*************************************************************************************\r
569   function FinishQuery() {\r
570     $oParseLookup= new sqlParse();\r
571     $this->oParseMain->AddWhereCondition($this->TableFilter);\r
572     for ($i=0; $i<count($this->Fields); $i++) {\r
573 \r
574       if (array_key_exists("FilterFlag",$this->Fields[$i])) {\r
575         // add any column filters to where clause\r
576         $this->oParseMain->AddWhereCondition($this->Tables[$this->Fields[$i]["TableIdx"]]->alias.".".$this->Fields[$i]["ColName"]."='".$this->Fields[$i]["ColData"]."'");\r
577       }\r
578 \r
579       if (array_key_exists("EntryType",$this->Fields[$i])) {\r
580         if (strpos("CSNR",substr($this->Fields[$i]["EntryType"],0,1)) !== false) {\r
581           if (array_key_exists("SelectSql",$this->Fields[$i])) {\r
582             $s=$this->Fields[$i]["SelectSql"];\r
583             if (array_key_exists("SelectFilter",$this->Fields[$i])) {\r
584               $oParseLookup->ParseSelect($s);\r
585               $oParseLookup->AddWhereCondition($this->Fields[$i]["SelectFilter"]);\r
586               $s=$oParseLookup->UnparseSelect();\r
587             }\r
588             $this->Fields[$i]["DropDownSelect"]=str_replace("%alias%","",str_replace("%aliasmain%","",$s));\r
589           }\r
590           else {\r
591             $this->Fields[$i]["DropDownSelect"]="select distinct ".$this->Fields[$i]["ColName"]." from ".$this->Tables[$this->Fields[$i]["TableIdx"]]->TblName." where ".$this->Fields[$i]["ColName"]." is not null";\r
592           }\r
593         }\r
594       }\r
595 \r
596       if ($this->Fields[$i]["TableIdx"] != $this->MainTbl) {\r
597 \r
598         // column from alt table - no avoiding subqueries here\r
599 \r
600         $s="(select " . $this->Fields[$i]["ColName"] . " from " . $this->Tables[$this->Fields[$i]["TableIdx"]]->TblName . " a" . $i . " where " . $this->AltTableJoinClause("t") . $this->AltTableKeyWhereClause($this->Fields[$i]["TableIdx"]) . ")";\r
601         if (substr($this->Fields[$i]["EntryType"],1) == "L" && array_key_exists("SelectSql",$this->Fields[$i])) {\r
602           $oParseLookup->ParseSelect($this->Fields[$i]["SelectSql"]);\r
603           if (count($oParseLookup->arSelList) == 2) {\r
604             $codeField=$oParseLookup->arSelList[0];\r
605             $descField=$oParseLookup->arSelList[1];\r
606             $descQuery="select " . $descField . " from " . $oParseLookup->FromClause . " where " . $codeField . "=" . $s;\r
607             if (!empty($oParseLookup->WhereClause)) $descQuery.=" and " . $oParseLookup->WhereClause;\r
608             $this->oParseMain->arSelList[$i]="(" . $this->objDB->concat(array("(" . $descQuery . ")", "'<span class=\"ricoLookup\">'", $this->objDB->Convert2Char($s), "'</span>'"), false) . ") as rico_col" . $i;\r
609           } else {\r
610             $this->TableEditError("Invalid lookup query (".$this->Fields[$i]["SelectSql"].")");\r
611             return;\r
612           }\r
613         } else {\r
614           $this->oParseMain->arSelList[$i]=$s . " as rico_col" . $i;\r
615         }\r
616       }\r
617     }\r
618     if (empty($this->DefaultSort)) {\r
619       $this->DefaultSort=$this->objDB->PrimaryKey($this->Tables[$this->MainTbl]->TblName);\r
620     }\r
621     $this->oParseMain->AddSort($this->DefaultSort);\r
622   }\r
623   \r
624   //*************************************************************************************\r
625   // returns details of sql query as an array\r
626   //*************************************************************************************\r
627   function SqlSelectData() {\r
628     $this->FinishQuery();\r
629     $arr=$this->oParseMain->ToArray();\r
630     $SelectIdx=count($arr);\r
631     array_push($arr, array());\r
632     $HdgIdx=count($arr);\r
633     array_push($arr, array());\r
634     for ($i=0; $i<count($this->Fields); $i++) {\r
635       if (array_key_exists("DropDownSelect",$this->Fields[$i])) {\r
636         $arr[$SelectIdx][$i]=$this->Fields[$i]["DropDownSelect"];\r
637       }\r
638       if (array_key_exists("Hdg",$this->Fields[$i])) {\r
639         $arr[$HdgIdx][$i]=$this->Fields[$i]["Hdg"];\r
640       }\r
641     }\r
642     return $arr;\r
643   }\r
644   \r
645   //*************************************************************************************\r
646   // Displays a table\r
647   //*************************************************************************************\r
648   function TableDisplay() {\r
649     echo "\n<p class='ricoBookmark'>";\r
650     echo "<span id='".$this->gridID."_timer' class='ricoSessionTimer'></span>";\r
651     echo "<span id='".$this->gridID."_bookmark' class='ricoBookmark'>&nbsp;</span>";\r
652     echo "<span id='".$this->gridID."_savemsg' class='ricoSaveMsg'></span>";\r
653     echo "</p>";\r
654     echo "\n<div id='".$this->gridID."'></div>";\r
655     echo "\n<script type='text/javascript'>";\r
656     echo "\nRico.acceptLanguage('" . $_SERVER["HTTP_ACCEPT_LANGUAGE"] . "');";\r
657     echo "\nvar ".$this->gridID." = {};";\r
658     echo "\n".$this->optionsVar." = {";\r
659     foreach ($this->options as $o => $value) {\r
660       if (!is_object($value) && !array_key_exists($o,$this->SvrOnly)) {\r
661         echo "\n  ".$o.": ".$this->FormatOption($value).",";\r
662       }\r
663     }\r
664     if ($this->CurrentPanel >= 0) {\r
665       echo "\n  panels: [";\r
666       for ($i=0; $i<=$this->CurrentPanel; $i++) {\r
667         if ($i > 0) {\r
668           echo ",";\r
669         }\r
670         echo "'".$this->Panels[$i]."'";\r
671       }\r
672       echo "],";\r
673     }\r
674     echo "\n  columnSpecs : [";\r
675     for ($i=0; $i<count($this->Fields); $i++) {\r
676       if ($this->Fields[$i]["TableIdx"] != $this->MainTbl) $this->Fields[$i]["UpdateOnly"]=true;\r
677       if ($i > 0) {\r
678         echo ",";\r
679       }\r
680       echo "\n    {";\r
681       echo " FieldName:'".$this->ExtFieldId($i)."'";\r
682       foreach ($this->Fields[$i] as $o => $value) {\r
683         if (!is_object($value) && !array_key_exists($o,$this->SvrOnly)) {\r
684           echo ",\n      ".$o.": ".$this->FormatOption($value);\r
685         }\r
686       }\r
687       if (array_key_exists("ColInfo",$this->Fields[$i])) {\r
688         echo ",\n      isNullable:".$this->FormatOption($this->Fields[$i]["ColInfo"]->Nullable);\r
689         echo ",\n      Writeable:".$this->FormatOption($this->Fields[$i]["ColInfo"]->Writeable);\r
690         echo ",\n      isKey:".$this->FormatOption($this->Fields[$i]["ColInfo"]->IsPKey);\r
691         if ($this->Fields[$i]["ColInfo"]->ColLength) {\r
692           echo ",\n      Length:".$this->Fields[$i]["ColInfo"]->ColLength;\r
693         }\r
694       }\r
695       echo " }";\r
696     }\r
697     echo "\n  ]";\r
698     echo "\n};";\r
699     if ($this->AutoInit) {\r
700       echo "\nRico.onLoad(function() {";\r
701       //echo "\n  try {";\r
702       echo "\n  if(typeof Rico.LiveGrid=='undefined') throw('LiveGridForms requires the Rico.LiveGrid Library');";\r
703       echo "\n  if(typeof Rico.GridMenu=='undefined') throw('LiveGridForms requires the Rico.GridMenu Library');";\r
704       echo "\n  if(typeof Rico.Buffer=='undefined') throw('LiveGridForms requires the Rico.Buffer Library');";\r
705       echo "\n  if(typeof Rico.Buffer.AjaxSQL=='undefined') throw('LiveGridForms requires the Rico.Buffer.AjaxSQL Library');";\r
706       echo $this->InitScript();\r
707       //echo "\n  } catch(e) { alert(e.message); };";\r
708       echo "\n});";\r
709     }\r
710     echo "\n</script>";\r
711   }\r
712 \r
713   function FormatOption($s) {\r
714     if (is_array($s)) return "{" . implode(",",$s) . "}";\r
715     switch (gettype($s)) {\r
716       case 'string':  return "\"".addslashes($s)."\"";\r
717       case 'boolean': return $s ? 'true' : 'false';\r
718       case 'double':  return str_replace(",",".",strval($s));  // make sure period is used as a decimal point\r
719       default:        return $s;\r
720     }\r
721   }\r
722 \r
723   function InitScript() {\r
724     $s="\n".$this->bufferVar."=new Rico.Buffer.AjaxSQL('" . $this->options["XMLprovider"] . "', {TimeOut:" . (array_shift(session_get_cookie_params())/60) . "});";\r
725     $s.="\nif(typeof ".$this->gridID."_GridInit=='function') ".$this->gridID."_GridInit();";\r
726     $s.="\n".$this->gridVar."=new Rico.LiveGrid('".$this->gridID."',".$this->bufferVar.",".$this->optionsVar.");";\r
727     $s.="\n".$this->gridVar.".menu=new Rico.GridMenu();";\r
728     if ($this->formView) {\r
729       $s.="\nif(typeof ".$this->gridID."_FormInit=='function') ".$this->gridID."_FormInit();";\r
730       $s.="\n".$this->formVar."=new Rico.TableEdit(".$this->gridVar.");";\r
731     }\r
732     $s.="\nif(typeof ".$this->gridID."_InitComplete=='function') ".$this->gridID."_InitComplete();";\r
733     return $s;\r
734   }\r
735 }\r
736 \r
737 ?>\r