1: <?php
2: 3: 4: 5: 6: 7: 8: 9: 10:
11: require_once("AWLUtilities.php");
12:
13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37:
38: class EntryField
39: {
40: 41: 42:
43: 44: 45: 46:
47: var $fname;
48:
49: 50: 51: 52:
53: var $ftype;
54:
55:
56: 57: 58:
59: 60: 61: 62:
63: var $current;
64:
65: 66: 67: 68:
69: var $attributes;
70:
71: 72: 73: 74:
75: var $rendered;
76:
77:
78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136:
137: function EntryField( $intype, $inname, $attributes="", $current_value="" )
138: {
139: $this->ftype = $intype;
140: $this->fname = $inname;
141: $this->current = $current_value;
142:
143: if ( isset($this->{"new_$intype"}) && function_exists($this->{"new_$intype"}) ) {
144:
145: $this->{"new_$intype"}( $attributes );
146: }
147: else if ( is_array($attributes) ) {
148: $this->attributes = $attributes;
149: }
150: else {
151: }
152:
153: $this->rendered = "";
154: }
155:
156: 157: 158: 159: 160: 161:
162: function Render() {
163: global $session;
164:
165: $r = "<";
166: dbg_error_log( "EntryField", ":Render: Name: %s, Type: %s, Current: %s", $this->fname, $this->ftype, $this->current );
167: $size = "";
168: switch ( $this->ftype ) {
169:
170: case "select":
171: $r .= "select name=\"$this->fname\"%%attributes%%>";
172: reset( $this->attributes );
173: while( list($k,$v) = each( $this->attributes ) ) {
174: if ( substr($k, 0, 1) != '_' ) continue;
175: if ( $k == '_help' ) continue;
176: $k = substr($k,1);
177: $r .= "<option value=\"".htmlspecialchars($k)."\"";
178: if ( "$this->current" == "$k" ) $r .= " selected";
179: $r .= ">$v</option>" ;
180: }
181: $r .= "</select>";
182: break;
183:
184: case "lookup":
185: $r .= "select name=\"$this->fname\"%%attributes%%>";
186: reset( $this->attributes );
187: while( list($k,$v) = each( $this->attributes ) ) {
188: if ( substr($k, 0, 1) != '_' ) continue;
189: $k = substr($k,1);
190: if ( $k == 'help' || $k == "sql" || $k == "type" ) continue;
191: if ( $k == "null" ) $k = "";
192: if ( $k == "zero" ) $k = "0";
193: $r .= "<option value=\"".htmlspecialchars($k)."\"";
194: if ( "$this->current" == "$k" ) $r .= " selected";
195: $r .= ">$v</option>" ;
196: }
197: if ( isset($this->attributes["_sql"]) ) {
198: $qry = new PgQuery( $this->attributes["_sql"] );
199: }
200: else {
201: $qry = new PgQuery( "SELECT code_id, code_value FROM codes WHERE code_type = ? ORDER BY code_seq, code_id", $this->attributes['_type'] );
202: }
203: $r .= EntryField::BuildOptionList( $qry, $this->current, "rndr:$this->fname", array('translate'=>1) );
204: $r .= "</select>";
205: break;
206:
207: case "date":
208: case "timestamp":
209: $size = '';
210: if ( !isset($this->attributes['size']) || $this->attributes['size'] == "" ) $size = " size=" . ($this->ftype == 'date' ? "12" : "18");
211: $r .= "input type=\"text\" name=\"$this->fname\"$size value=\"".$session->FormattedDate(htmlspecialchars($this->current))."\"%%attributes%%>";
212: break;
213:
214: case "checkbox":
215:
216:
217: $r .= "input type=\"hidden\" name=\"$this->fname\" value=\"off\"><";
218: case "radio":
219: $checked = "";
220: if ( $this->current === true || $this->current == 't' || intval($this->current) == 1 || $this->current == 'on'
221: || (isset($this->attributes['value']) && $this->current == $this->attributes['value'] ) )
222: $checked = " checked";
223: $id = "id_$this->fname" . ( $this->ftype == "radio" ? "_".$this->attributes['value'] : "");
224: if ( isset($this->attributes['_label']) ) {
225: $r .= "label for=\"$id\"";
226: if ( isset($this->attributes['class']) )
227: $r .= ' class="'. $this->attributes['class'] . '"';
228: $r .= "><";
229: }
230: $r .= "input type=\"$this->ftype\" name=\"$this->fname\" id=\"$id\"$checked%%attributes%%>";
231: if ( isset($this->attributes['_label']) ) {
232: $r .= " " . $this->attributes['_label'];
233: $r .= "</label>";
234: }
235: break;
236:
237: case "button":
238: $r .= "input type=\"button\" name=\"$this->fname\"%%attributes%%>";
239: break;
240:
241: case "submit":
242: $r .= "input type=\"submit\" name=\"$this->fname\" value=\"".htmlspecialchars($this->current)."\"%%attributes%%>";
243: break;
244:
245: case "textarea":
246: $r .= "textarea name=\"$this->fname\"%%attributes%%>$this->current</textarea>";
247: break;
248:
249: case "file":
250: if ( !isset($this->attributes['size']) || $this->attributes['size'] == "" ) $size = " size=25";
251: $r .= "input type=\"file\" name=\"$this->fname\"$size value=\"".htmlspecialchars($this->current)."\"%%attributes%%>";
252: break;
253:
254: case "password":
255: $r .= "input type=\"password\" name=\"$this->fname\" value=\"".htmlspecialchars($this->current)."\"%%attributes%%>";
256: break;
257:
258: default:
259: $r .= "input type=\"text\" name=\"$this->fname\" value=\"".htmlspecialchars($this->current)."\"%%attributes%%>";
260: break;
261: }
262:
263:
264: reset( $this->attributes );
265: $attribute_values = "";
266: while( list($k,$v) = each( $this->attributes ) ) {
267: if ( $k == '_readonly' ) $attribute_values .= " readonly";
268: else if ( $k == '_disabled' ) $attribute_values .= " disabled";
269: if ( substr($k, 0, 1) == '_' ) continue;
270: $attribute_values .= " $k=\"".htmlspecialchars($v)."\"";
271: }
272: $r = str_replace( '%%attributes%%', $attribute_values, $r );
273:
274: $this->rendered = $r;
275: return $r;
276: }
277:
278: 279: 280: 281: 282:
283: function new_lookup( $attributes ) {
284: $this->attributes = $attributes;
285: }
286:
287: 288: 289: 290: 291: 292: 293:
294: static function BuildOptionList( $qry, $current = '', $location = 'options', $parameters = false ) {
295: global $debuggroups;
296: $result = '';
297: $translate = false;
298:
299: if ( isset($maxwidth) ) unset($maxwidth);
300: if ( is_array($parameters) ) {
301: if ( isset($parameters['maxwidth']) ) $maxwidth = max(4,intval($parameters['maxwidth']));
302: if ( isset($parameters['translate']) ) $translate = true;
303: }
304:
305:
306: if ( $qry->rows() > 0 || $qry->Exec($location) ) {
307: while( $row = $qry->Fetch(true) )
308: {
309: if (is_array($current)) {
310: $selected = ( ( in_array($row[0],$current,true) || in_array($row[1],$current,true)) ? ' selected="selected"' : '' );
311: }
312: else {
313: $selected = ( ( "$row[0]" == "$current" || "$row[1]" == "$current" ) ? ' selected="selected"' : '' );
314: }
315: $display_value = $row[1];
316: if ( isset($translate) ) $display_value = translate( $display_value );
317: if ( isset($maxwidth) ) $display_value = substr( $display_value, 0, $maxwidth);
318: $nextrow = "<option value=\"".htmlspecialchars($row[0])."\"$selected>".htmlspecialchars($display_value)."</option>";
319: $result .= $nextrow;
320: }
321: }
322: return $result;
323: }
324:
325: }
326:
327: 328: 329: 330: 331: 332: 333:
334: class EntryForm
335: {
336: 337: 338:
339: 340: 341: 342:
343: var $action;
344:
345: 346: 347: 348:
349: var $record;
350:
351: 352: 353: 354:
355: var $EditMode;
356:
357: 358: 359: 360:
361: var $name;
362:
363: 364: 365: 366:
367: var $class;
368:
369: 370: 371: 372:
373: var $break_line_format;
374:
375: 376: 377: 378:
379: var $table_line_format;
380:
381: 382: 383: 384:
385: var $saved_line_format;
386:
387:
388: 389: 390: 391: 392: 393:
394: function EntryForm( $action, &$record, $editing=false )
395: {
396: $this->action = $action;
397: $this->record = &$record;
398: $this->EditMode = $editing;
399: $this->break_line_format = '<tr><th class="ph" colspan="2">%s</th></tr>'."\n";
400: $this->table_line_format = '<tr><th class="prompt">%s</th><td class="entry">%s<span class="help">%s</span></td></tr>'."\n";
401: }
402:
403: 404: 405: 406: 407:
408: function PopulateForm( &$record, $prefix="" )
409: {
410: foreach( $record AS $k => $v ) {
411: $this->record->{"$prefix$k"} = $v;
412: }
413: }
414:
415: 416: 417:
418: function NoHelp( ) {
419: $this->break_line_format = '<tr><th class="ph" colspan="2">%s</th></tr>'."\n";
420: $this->table_line_format = '<tr><th class="prompt">%s</th><td class="entry">%s</td></tr>'."\n";
421: }
422:
423: 424: 425:
426: function HelpInLine( ) {
427: $this->break_line_format = '<tr><th class="ph" colspan="2">%s</th></tr>'."\n";
428: $this->table_line_format = '<tr><th class="prompt">%s</th><td class="entry">%s<span class="help">%s</span></td></tr>'."\n";
429: }
430:
431: 432: 433:
434: function HelpInCell( ) {
435: $this->break_line_format = '<tr><th class="ph" colspan="3">%s</th></tr>'."\n";
436: $this->table_line_format = '<tr><th class="prompt">%s</th><td class="entry">%s</td><td class="help">%s</td></tr>'."\n";
437: }
438:
439: 440: 441:
442: function SimpleForm( $new_format = '<span class="prompt">%s:</span> <span class="entry">%s</span>' ) {
443: $this->break_line_format = '%s'."\n";
444: $this->table_line_format = $new_format."\n";
445: }
446:
447: 448: 449: 450:
451: function TempLineFormat( $new_format = '<span class="prompt">%s:</span> <span class="entry">%s</span>' ) {
452: $this->saved_line_format = $this->table_line_format;
453: $this->table_line_format = $new_format ."\n";
454: }
455:
456: 457: 458:
459: function RevertLineFormat( ) {
460: if ( isset($this->saved_line_format) ) {
461: $this->table_line_format = $this->saved_line_format;
462: }
463: }
464:
465: 466: 467: 468: 469:
470: function StartForm( $extra_attributes='' ) {
471: if ( !is_array($extra_attributes) && $extra_attributes != '' ) {
472: list( $k, $v ) = explode( '=', $extra_attributes );
473: $extra_attributes = array( $k => $v );
474: }
475: $extra_attributes['action'] = $this->action;
476: if ( !isset($extra_attributes['method']) ) $extra_attributes['method'] = 'post';
477: if ( strtolower($extra_attributes['method']) != 'get' )
478: if ( !isset($extra_attributes['enctype']) ) $extra_attributes['enctype'] = 'multipart/form-data';
479: if ( !isset($extra_attributes['name']) ) $extra_attributes['name'] = 'form';
480: if ( !isset($extra_attributes['class']) ) $extra_attributes['class'] = 'formdata';
481: if ( !isset($extra_attributes['id']) ) $extra_attributes['id'] = $extra_attributes['name'];
482:
483:
484: reset( $extra_attributes );
485: $attribute_values = "";
486: while( list($k,$v) = each( $extra_attributes ) ) {
487: $attribute_values .= " $k=\"".htmlspecialchars($v)."\"";
488: }
489: return "<form$attribute_values>\n";
490: }
491:
492: 493: 494: 495:
496: function EndForm( ) {
497: return "</form>\n";
498: }
499:
500: 501: 502: 503:
504: function BreakLine( $text = '' )
505: {
506: return sprintf( $this->break_line_format, translate($text));
507: }
508:
509: 510: 511: 512: 513: 514: 515:
516: function HiddenField($fname,$fvaluei,$fid = null) {
517: return sprintf( '<input type="hidden" name="%s" value="%s" %s/>%s', $fname,
518: htmlspecialchars($fvalue), (isset($id) ? 'id="$id" ' : ''), "\n" );
519: }
520:
521: 522: 523: 524: 525: 526: 527: 528: 529: 530: 531:
532: function _ParseAttributes( $ftype = '', $attributes = '' ) {
533:
534: if ( !is_array($attributes) ) {
535: if ( strpos( $attributes, '=' ) === false ) {
536: $attributes = array();
537: }
538: else {
539: list( $k, $v ) = explode( '=', $attributes );
540: $attributes = array( $k => $v );
541: }
542: }
543:
544:
545: if ( !isset($attributes['_help']) ) {
546: $attributes['_help'] = "";
547: if ( isset($attributes['title']) )
548: $attributes['_help'] = $attributes['title'];
549: }
550:
551:
552: if ( !isset($attributes['class']) ) {
553: $attributes['class'] = "f$ftype";
554: }
555:
556: return $attributes;
557: }
558:
559: 560: 561: 562:
563: function DataEntryField( $format, $ftype='', $base_fname='', $attributes='', $prefix='' )
564: {
565: global $session;
566:
567: if ( ($base_fname == '' || $ftype == '') ) {
568:
569: return $format;
570: }
571: $fname = $prefix . $base_fname;
572:
573: dbg_error_log( "DataEntry", ":DataEntryField: fmt='%s', fname='%s', fvalue='%s'", $format, $fname, (isset($this->record->{$fname})?$this->record->{$fname}:'value not set') );
574: if ( !$this->EditMode ) {
575:
576: if ( !isset($this->record->{$fname}) && substr($fname,0,4) == 'xxxx' && isset($this->record->{substr($fname,4)}) )
577: $fname = substr($fname,4);
578: if ( !isset($this->record->{$fname}) ) return '';
579:
580: if ($ftype == "date" || $ftype == "timestamp")
581: return sprintf($format, $session->FormattedDate($this->record->{$fname}) );
582: dbg_error_log( "DataEntry", ":DataEntryField: fmt='%s', fname='%s', fvalue='%s'", $format, $fname, (isset($this->record->{$fname})?$this->record->{$fname}:'value not set') );
583: return sprintf($format, $this->record->{$fname} );
584: }
585:
586: $currval = '';
587:
588: if ( preg_match("/^(.+)\[(.+)\]$/", $fname, $parts) ) {
589: $p1 = $parts[1];
590: $p2 = $parts[2];
591: @dbg_error_log( "DataEntry", ":DataEntryField: fname=%s, p1=%s, p2=%s, POSTVAL=%s, \$this->record->{'%s'}['%s']=%s",
592: $fname, $p1, $p2, $_POST[$p1][$p2], $p1, $p2, $this->record->{"$p1"}["$p2"] );
593:
594: if ( isset($_POST[$p1]) ) {
595: if ( isset($_POST[$p1][$p2]) ) {
596: $currval = $_POST[$p1][$p2];
597: }
598: }
599: else if ( isset($this->record) && is_object($this->record)
600: && isset($this->record->{"$p1"}["$p2"])
601: ) {
602: $currval = $this->record->{"$p1"}["$p2"];
603: }
604: }
605: else {
606: if ( isset($_POST[$fname]) ) {
607: $currval = $_POST[$fname];
608: }
609: else if ( isset($this->record) && is_object($this->record) && isset($this->record->{"$base_fname"}) ) {
610: $currval = $this->record->{"$base_fname"};
611: }
612: else if ( isset($this->record) && is_object($this->record) && isset($this->record->{"$fname"}) ) {
613: $currval = $this->record->{"$fname"};
614: }
615: }
616: if ( $ftype == "date" ) $currval = $session->FormattedDate($currval);
617: else if ( $ftype == "timestamp" ) $currval = $session->FormattedDate($currval, $ftype);
618:
619:
620: $field = new EntryField( $ftype, $fname, $this->_ParseAttributes($ftype,$attributes), $currval );
621: return $field->Render();
622: }
623:
624:
625: 626: 627: 628:
629: function SubmitButton( $fname, $fvalue, $attributes = '' )
630: {
631: $field = new EntryField( 'submit', $fname, $this->_ParseAttributes('submit', $attributes), $fvalue );
632: return $field->Render();
633: }
634:
635: 636: 637: 638:
639: function DataEntryLine( $prompt, $field_format, $ftype='', $fname='', $attributes='', $prefix = '' )
640: {
641: $attributes = $this->_ParseAttributes( $ftype, $attributes );
642: return sprintf( $this->table_line_format, $prompt,
643: $this->DataEntryField( $field_format, $ftype, $fname, $attributes, $prefix ),
644: $attributes['_help'] );
645: }
646:
647:
648: 649: 650: 651:
652: function MultiEntryLine( $prompt_options, $prompt_name, $default_prompt, $format, $ftype='', $fname='', $attributes='', $prefix )
653: {
654:
655: $prompt = "<select name=\"$prompt_name\">";
656:
657: reset($prompt_options);
658: while( list($k,$v) = each($prompt_options) ) {
659: $selected = ( ( $k == $default_prompt ) ? ' selected="selected"' : '' );
660: $nextrow = "<option value=\"$k\"$selected>$v</option>";
661: if ( preg_match('/&/', $nextrow) ) $nextrow = preg_replace( '/&/', '&', $nextrow);
662: $prompt .= $nextrow;
663: }
664: $prompt .= "</select>";
665:
666: return $this->DataEntryLine( $prompt, $format, $ftype, $fname, $attributes, $prefix );
667: }
668:
669: }
670:
671: