2 //**********************************
\r
3 // Rico: GENERIC TABLE/VIEW EDITOR
\r
5 //**********************************
\r
7 class TableEditTable {
\r
15 class TableEditClass {
\r
17 // public properties
\r
31 var $convertCharSet; // set to true if database is ISO-8859-1 encoded, false if UTF-8
\r
34 // private properties
\r
35 var $Panels=array();
\r
42 var $Tables=array();
\r
44 var $Fields=array();
\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
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
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
78 $this->xhtmlcloser=">";
\r
80 $this->CurrentPanel=-1;
\r
82 $this->AutoInit=true;
\r
83 $this->formView=true;
\r
84 $this->sessions=isset($_SESSION);
\r
85 $this->ErrorFlag=false;
\r
87 $this->convertCharSet=false;
\r
88 $this->oParseMain= new sqlParse();
\r
89 $this->oParseMain->Init();
\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
99 $this->options=NULL;
\r
100 $this->SvrOnly=NULL;
\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
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
117 $this->CurrentField["type"]="date";
\r
121 $this->CurrentField["type"]="datetime";
\r
126 $this->CurrentField["TxtAreaRows"]=4;
\r
127 $this->CurrentField["TxtAreaCols"]=80;
\r
132 $this->CurrentField["RadioBreak"]="<br".$this->xhtmlcloser;
\r
136 $this->CurrentField["visible"]=false;
\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
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
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
179 $descField=str_replace("%alias%",$alias . ".",str_replace("%aliasmain%","t.",$descField));
\r
181 $this->oParseMain->AddColumn($descField, "rico_col".$this->FieldCnt);
\r
184 $this->TableEditError("Invalid lookup query (".$sql.")");
\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
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
200 function AddPanel($PanelHeading) {
\r
201 $this->CurrentPanel++;
\r
202 $this->Panels[$this->CurrentPanel]=$PanelHeading;
\r
205 function DefineAltTable($AltTabName, $arFieldList, $arFieldData) {
\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
217 return $this->TableCnt;
\r
220 function IncrCurrentField() {
\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
230 function SetTableName($s) {
\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
247 function AddSort($field,$direction) {
\r
248 if (!empty($this->DefaultSort)) $this->DefaultSort.=",";
\r
249 $this->DefaultSort.=$field . " " . $direction;
\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
261 function SortAsc() {
\r
262 $this->SortCurrent("ASC");
\r
265 function SortDesc() {
\r
266 $this->SortCurrent("DESC");
\r
269 function ConfirmDeleteColumn() {
\r
270 $this->options["ConfirmDeleteCol"]=$this->FieldCnt;
\r
273 function genXHTML() {
\r
274 $this->xhtmlcloser=" />";
\r
277 function SetDbConn(&$dbcls) {
\r
278 $this->objDB=&$dbcls;
\r
281 //*************************************************************************************
\r
282 // Take appropriate action
\r
283 //*************************************************************************************
\r
284 function DisplayPage() {
\r
285 if (count($this->Fields) == 0) {
\r
288 if (!$this->ErrorFlag) {
\r
289 $this->GetColumnInfo();
\r
291 if (!$this->ErrorFlag) {
\r
292 switch ($this->action) {
\r
295 if ($this->options["canDelete"]) {
\r
296 $this->TableDeleteRecord();
\r
301 if ($this->options["canAdd"]) {
\r
302 $this->TableInsertRecord();
\r
307 if ($this->options["canEdit"]) {
\r
308 $this->TableUpdateRecord();
\r
313 if ($this->sessions) $_SESSION[$this->gridID]=$this->SqlSelectData();
\r
314 $this->TableDisplay();
\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
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
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
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
354 $this->TableEditError("no key value");
\r
357 return " WHERE ".$w;
\r
361 // name used external to this script
\r
362 function ExtFieldId($i) {
\r
363 return $this->gridID."_".$i;
\r
366 function IsCalculatedField($i) {
\r
367 return array_key_exists("Formula",$this->Fields[$i]);
\r
370 //*************************************************************************************
\r
371 // Retrieves column info from database for main table and any alternate tables
\r
372 //*************************************************************************************
\r
373 function GetColumnInfo() {
\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
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
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
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
403 elseif ($Columns[$c]->IsPKey) {
\r
404 $this->TableEditError("primary key field is not defined (".$this->Tables[$i]->TblName.".".$colname.")");
\r
413 function TableUpdateDatabase($sqltext, $actiontxt) {
\r
414 if ($this->ErrorFlag) {
\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
425 $this->TableEditError("no data changed - update skipped");
\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
437 elseif ($fld["EntryType"] == "I" || $fld["EntryType"] == "F") {
\r
439 if ($v == "" || !is_numeric($v)) {
\r
443 elseif ($fld["EntryType"] == "N" && $v == $this->options["TableSelectNew"]) {
\r
444 $v=trim($_POST["textnew__".$this->ExtFieldId($idx)]);
\r
446 elseif (strpos("SNR",substr($fld["EntryType"],0,1)) !== false && $v == $this->options["TableSelectNone"]) {
\r
450 if ($addquotes) $v=$this->objDB->addQuotes($v);
\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
465 return $this->FormatValue($v, $idx);
\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
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
482 $this->TableEditError($errmsg);
\r
484 elseif ($this->options["DebugFlag"]) {
\r
485 echo "<BR class='debug'>".$sqltext;
\r
489 function UpdateAltTableRecords($i) {
\r
490 if ($this->ErrorFlag) {
\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
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
508 for ($j=0; $j<count($this->Tables[$i]->arFields); $j++) {
\r
509 $c=$this->Tables[$i]->arFields[$j];
\r
511 $coldata.=",".$this->Tables[$i]->arData[$j];
\r
513 $sqltext="insert into ".$this->Tables[$i]->TblName." (".substr($colnames,1).") values (".substr($coldata,1).")";
\r
514 $this->UpdateRecord($sqltext);
\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
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
533 $sqltext="UPDATE ".$this->Tables[$this->MainTbl]->TblName." SET ".substr($sqltext,1);
\r
534 $sqltext.=$this->TableKeyWhereClause();
\r
535 $this->TableUpdateDatabase($sqltext, "updated");
\r
537 //*************************************************************************************
\r
538 // Inserts a new record into the db
\r
539 //*************************************************************************************
\r
541 function TableInsertRecord() {
\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
551 if ($this->Fields[$i]["ColInfo"]->Writeable) {
\r
552 $sqlcol.=",".$this->Fields[$i]["ColName"];
\r
553 $sqlval.=",".$this->FormatFormValue($i);
\r
557 $sqltext="insert into ".$this->Tables[$this->MainTbl]->TblName." (".substr($sqlcol,1).") values (".substr($sqlval,1).")";
\r
558 $this->TableUpdateDatabase($sqltext, "added");
\r
561 function TableEditError($msg) {
\r
562 $this->ErrorFlag=true;
\r
563 $this->ErrorMsg=$msg;
\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
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
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
588 $this->Fields[$i]["DropDownSelect"]=str_replace("%alias%","",str_replace("%aliasmain%","",$s));
\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
596 if ($this->Fields[$i]["TableIdx"] != $this->MainTbl) {
\r
598 // column from alt table - no avoiding subqueries here
\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
610 $this->TableEditError("Invalid lookup query (".$this->Fields[$i]["SelectSql"].")");
\r
614 $this->oParseMain->arSelList[$i]=$s . " as rico_col" . $i;
\r
618 if (empty($this->DefaultSort)) {
\r
619 $this->DefaultSort=$this->objDB->PrimaryKey($this->Tables[$this->MainTbl]->TblName);
\r
621 $this->oParseMain->AddSort($this->DefaultSort);
\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
638 if (array_key_exists("Hdg",$this->Fields[$i])) {
\r
639 $arr[$HdgIdx][$i]=$this->Fields[$i]["Hdg"];
\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'> </span>";
\r
652 echo "<span id='".$this->gridID."_savemsg' class='ricoSaveMsg'></span>";
\r
654 echo "\n<div id='".$this->gridID."'></div>";
\r
655 echo "\n<script type='text/javascript'>";
\r
656 echo "\nvar ".$this->gridID." = {};";
\r
657 echo "\n".$this->optionsVar." = {";
\r
658 foreach ($this->options as $o => $value) {
\r
659 if (!is_object($value) && !array_key_exists($o,$this->SvrOnly)) {
\r
660 echo "\n ".$o.": ".$this->FormatOption($value).",";
\r
663 if ($this->CurrentPanel >= 0) {
\r
664 echo "\n panels: [";
\r
665 for ($i=0; $i<=$this->CurrentPanel; $i++) {
\r
669 echo "'".$this->Panels[$i]."'";
\r
673 echo "\n columnSpecs : [";
\r
674 for ($i=0; $i<count($this->Fields); $i++) {
\r
675 if ($this->Fields[$i]["TableIdx"] != $this->MainTbl) $this->Fields[$i]["UpdateOnly"]=true;
\r
680 echo " FieldName:'".$this->ExtFieldId($i)."'";
\r
681 foreach ($this->Fields[$i] as $o => $value) {
\r
682 if (!is_object($value) && !array_key_exists($o,$this->SvrOnly)) {
\r
683 echo ",\n ".$o.": ".$this->FormatOption($value);
\r
686 if (array_key_exists("ColInfo",$this->Fields[$i])) {
\r
687 echo ",\n isNullable:".$this->FormatOption($this->Fields[$i]["ColInfo"]->Nullable);
\r
688 echo ",\n Writeable:".$this->FormatOption($this->Fields[$i]["ColInfo"]->Writeable);
\r
689 echo ",\n isKey:".$this->FormatOption($this->Fields[$i]["ColInfo"]->IsPKey);
\r
690 if ($this->Fields[$i]["ColInfo"]->ColLength) {
\r
691 echo ",\n Length:".$this->Fields[$i]["ColInfo"]->ColLength;
\r
698 if ($this->AutoInit) {
\r
699 echo "\nRico.onLoad(function() {";
\r
701 echo "\n if(typeof Rico.LiveGrid=='undefined') throw('LiveGridForms requires the Rico.LiveGrid Library');";
\r
702 echo "\n if(typeof Rico.GridMenu=='undefined') throw('LiveGridForms requires the Rico.GridMenu Library');";
\r
703 echo "\n if(typeof Rico.Buffer=='undefined') throw('LiveGridForms requires the Rico.Buffer Library');";
\r
704 echo "\n if(typeof Rico.Buffer.AjaxSQL=='undefined') throw('LiveGridForms requires the Rico.Buffer.AjaxSQL Library');";
\r
705 echo $this->InitScript();
\r
706 //echo "\n } catch(e) { alert(e.message); };";
\r
709 echo "\n</script>";
\r
712 function FormatOption($s) {
\r
713 if (is_array($s)) return "{" . implode(",",$s) . "}";
\r
714 switch (gettype($s)) {
\r
715 case 'string': return "\"".addslashes($s)."\"";
\r
716 case 'boolean': return $s ? 'true' : 'false';
\r
717 case 'double': return str_replace(",",".",strval($s)); // make sure period is used as a decimal point
\r
718 default: return $s;
\r
722 function InitScript() {
\r
723 $CookieInfo = session_get_cookie_params();
\r
724 $s="\n".$this->bufferVar."=new Rico.Buffer.AjaxSQL('" . $this->options["XMLprovider"] . "', {TimeOut:" . (array_shift($CookieInfo)/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
732 $s.="\nif(typeof ".$this->gridID."_InitComplete=='function') ".$this->gridID."_InitComplete();";
\r