home *** CD-ROM | disk | FTP | other *** search
/ PC World 2001 August / PCWorld_2001-08_cd.bin / Komunikace / phptriad / phptriadsetup2-11.exe / php / pear / HTML / Form.php next >
PHP Script  |  2001-01-24  |  18KB  |  643 lines

  1. <?php
  2. //
  3. // +----------------------------------------------------------------------+
  4. // | PHP version 4.0                                                      |
  5. // +----------------------------------------------------------------------+
  6. // | Copyright (c) 1997-2001 The PHP Group                                |
  7. // +----------------------------------------------------------------------+
  8. // | This source file is subject to version 2.0 of the PHP license,       |
  9. // | that is bundled with this package in the file LICENSE, and is        |
  10. // | available at through the world-wide-web at                           |
  11. // | http://www.php.net/license/2_02.txt.                                 |
  12. // | If you did not receive a copy of the PHP license and are unable to   |
  13. // | obtain it through the world-wide-web, please send a note to          |
  14. // | license@php.net so we can mail you a copy immediately.               |
  15. // +----------------------------------------------------------------------+
  16. // | Authors: Stig Bakken <ssb@fast.no>                                   |
  17. // |          Urs Gehrig <urs@circle.ch>                                  |
  18. // +----------------------------------------------------------------------+
  19. //
  20. // $Id: Form.php,v 1.8 2001/01/24 11:04:33 ssb Exp $
  21. //
  22. // HTML form utility functions.
  23. //
  24.  
  25. if (!defined('HTML_FORM_TEXT_SIZE')) {
  26.     define('HTML_FORM_TEXT_SIZE', 20);
  27. }
  28.  
  29. if (!defined('HTML_FORM_MAX_FILE_SIZE')) {
  30.     define('HTML_FORM_MAX_FILE_SIZE', 1048576); // 1 MB
  31. }
  32.  
  33. class HTML_Form {
  34.     // {{{ properties
  35.  
  36.     /** ACTION attribute of <FORM> tag */
  37.     var $action;
  38.  
  39.     /** METHOD attribute of <FORM> tag */
  40.     var $method;
  41.  
  42.     /** NAME attribute of <FORM> tag */
  43.     var $name;
  44.  
  45.     /** an array of entries for this form */
  46.     var $fields;
  47.  
  48.     /** DB_storage object, if tied to one */
  49.     var $storageObject;
  50.  
  51.     /** <FORM ENCODING=""> attribute value */
  52.     var $encoding;
  53.  
  54.     /** TARGET attribute of <FORM> tag */
  55.     var $target;
  56.  
  57.     // }}}
  58.  
  59.     // {{{ constructor
  60.  
  61.     function HTML_Form($action, $method = 'GET', $name = '', $target = '') {
  62.         $this->action = $action;
  63.         $this->method = $method;
  64.         $this->name = $name;
  65.         $this->fields = array();
  66.         $this->encoding = '';
  67.         $this->target = $target;
  68.     }
  69.  
  70.     // }}}
  71.  
  72.     // {{{ addText()
  73.  
  74.     function addText($name, $title, $default, $size = HTML_FORM_TEXT_SIZE) {
  75.         $this->fields[] = array("text", $name, $title, $default, $size);
  76.     }
  77.  
  78.     // }}}
  79.     // {{{ addPassword()
  80.  
  81.     function addPassword($name, $title, $default, $size = HTML_FORM_PASSWD_SIZE) {
  82.         $this->fields[] = array("password", $name, $title, $default, $size);
  83.     }
  84.  
  85.     // }}}
  86.     // {{{ addCheckbox()
  87.  
  88.     function addCheckbox($name, $title, $default) {
  89.         $this->fields[] = array("checkbox", $name, $title, $default);
  90.     }
  91.  
  92.     // }}}
  93.     // {{{ addTextarea()
  94.  
  95.     function addTextarea($name, $title, $default,
  96.                          $width = HTML_FORM_TEXTAREA_WT,
  97.                          $height = HTML_FORM_TEXTAREA_HT) {
  98.         $this->fields[] = array("textarea", $name, $title, &$default, $width, $height);
  99.     }
  100.  
  101.     // }}}
  102.     // {{{ addSubmit
  103.  
  104.     function addSubmit($name = "submit", $title = "Submit Changes") {
  105.         $this->fields[] = array("submit", $name, $title);
  106.     }
  107.  
  108.     // }}}
  109.     // {{{ addReset()
  110.  
  111.     function addReset($title = "Discard Changes") {
  112.         $this->fields[] = array("reset", $title);
  113.     }
  114.  
  115.     // }}}
  116.     // {{{ addSelect()
  117.  
  118.     function addSelect($name, $title, $entries, $default = '', $size = 1,
  119.                        $blank = '', $multiple = false, $attribs = '') {
  120.         $this->fields[] = array("select", $name, $title, &$entries, $default,
  121.                 $size, $blank, $multiple, $attribs);
  122.     }
  123.  
  124.     // }}}
  125.     // {{{ addRadio()
  126.  
  127.     function addRadio($name, $title, $value, $default) {
  128.         $this->fields[] = array("radio", $name, $title, $value, $default);
  129.     }
  130.  
  131.     // }}}
  132.     // {{{ addImage()
  133.  
  134.     function addImage($name, $src) {
  135.         $this->fields[] = array("image", $name, $src);
  136.     }
  137.  
  138.     // }}}
  139.     // {{{ addHidden()
  140.  
  141.     function addHidden($name, $value) {
  142.         $this->fields[] = array("hidden", $name, $value);
  143.     }
  144.  
  145.     // }}}
  146.  
  147.     // {{{ start()
  148.  
  149.     function start() {
  150.         print "<FORM ACTION=\"" . basename($this->action) . "\" METHOD=\"$this->method\"";
  151.         if ($this->name) {
  152.             print " NAME=\"$this->name\"";
  153.         }
  154.     if ($this->target) {
  155.         print " TARGET=\"$this->target\"";
  156.     }
  157.         print ">";
  158.     }
  159.  
  160.     // }}}
  161.     // {{{ end()
  162.  
  163.     function end() {
  164.         $fields = array();
  165.         reset($this->fields);
  166.         while (list($i, $data) = each($this->fields)) {
  167.             if ($data[0] == 'reset') {
  168.                 continue;
  169.             }
  170.             $fields[$data[1]] = true;
  171.         }
  172.         $this->displayHidden("_fields", implode(":", array_keys($fields)));
  173.         print "</FORM>";
  174.     }
  175.  
  176.     // }}}
  177.  
  178.     // {{{ displayText()
  179.  
  180.     function displayText($name, $default = '', $size = HTML_FORM_TEXT_SIZE) {
  181.         print "<INPUT NAME=\"$name\" VALUE=\"$default\" SIZE=\"$size\">";
  182.     }
  183.  
  184.     // }}}
  185.     // {{{ displayTextRow()
  186.  
  187.     function displayTextRow($name, $title, $default = '', $size = HTML_FORM_TEXT_SIZE) {
  188.         print " <TR>\n";
  189.         print "  <TH ALIGN=\"right\">$title</TH>";
  190.         print "  <TD>";
  191.         $this->displayText($name, $default, $size);
  192.         print "</TD>\n";
  193.         print " </TR>\n";
  194.     }
  195.  
  196.     // }}}
  197.     // {{{ displayPassword()
  198.  
  199.     function displayPassword($name, $default = '', $size = HTML_FORM_PASSWD_SIZE) {
  200.         print "<INPUT NAME=\"$name\" TYPE=\"password\" VALUE=\"$default\" SIZE=\"$size\">";
  201.     }
  202.  
  203.     // }}}
  204.     // {{{ displayPasswordRow()
  205.  
  206.     function displayPasswordRow($name, $title, $default = '', $size = HTML_FORM_PASSWD_SIZE) {
  207.         print "<TR>\n";
  208.         print "  <TH ALIGN=\"right\">$title</TH>\n";
  209.         print "  <TD>";
  210.         $this->displayPassword($name, $default, $size);
  211.         print " repeat: ";
  212.         $this->displayPassword($name."2", $default, $size);
  213.         print "</TD>\n";
  214.         print "</TR>\n";
  215.     }
  216.  
  217.     // }}}
  218.     // {{{ displayCheckbox()
  219.  
  220.     function displayCheckbox($name, $default = false) {
  221.         print "<INPUT TYPE=\"checkbox\" NAME=\"$name\"";
  222.         if ($default && $default != 'off') {
  223.             print " CHECKED";
  224.         }
  225.         print ">";
  226.     }
  227.  
  228.     // }}}
  229.     // {{{ displayCheckboxRow()
  230.  
  231.     function displayCheckboxRow($name, $title, $default = false) {
  232.         print " <TR>\n";
  233.         print "  <TH ALIGN=\"left\">$title</TH>";
  234.         print "  <TD>";
  235.         $this->displayCheckbox($name, $default);
  236.         print "</TD>\n";
  237.         print " </TR>\n";
  238.     }
  239.  
  240.     // }}}
  241.     // {{{ displayTextarea()
  242.  
  243.     function displayTextarea($name, $default = '', $width = 40, $height = 5) {
  244.         print "<TEXTAREA NAME=\"$name\" COLS=\"$width\" ROWS=\"$height\">";
  245.         print $default;
  246.         print "</TEXTAREA>";
  247.     }
  248.  
  249.     // }}}
  250.     // {{{ displayTextareaRow()
  251.  
  252.     function displayTextareaRow($name, $title, $default = '', $width = 40, $height = 5) {
  253.         print " <TR>\n";
  254.         print "  <TH ALIGN=\"right\">$title</TH>\n";
  255.         print "  <TD>";
  256.         $this->displayTextarea($name, &$default, $width, $height);
  257.         print "</TD>\n";
  258.         print " </TR>\n";
  259.     }
  260.  
  261.     // }}}
  262.     // {{{ displaySubmit()
  263.  
  264.     function displaySubmit($title = 'Submit Changes', $name = "submit") {
  265.     print $this->returnSubmit($title, $name);
  266.     }
  267.  
  268.     // }}}
  269.     // {{{ displaySubmitRow()
  270.  
  271.     function displaySubmitRow($name = "submit", $title = 'Submit Changes') {
  272.     print $this->returnSubmitRow($name, $title);
  273.     }
  274.  
  275.     // }}}
  276.     // {{{ displayReset()
  277.  
  278.     function displayReset($title = 'Clear contents') {
  279.         print $this->returnReset($title);
  280.     }
  281.  
  282.     // }}}
  283.     // {{{ displayResetRow()
  284.  
  285.     function displayResetRow($title = 'Clear contents') {
  286.         print $this->returnResetRow($title);
  287.     }
  288.  
  289.     // }}}
  290.     // {{{ displaySelect()
  291.  
  292.     function displaySelect($name, $entries, $default = '', $size = 1,
  293.                            $blank = '', $multiple = false, $attribs = '') {
  294.         print $this->returnSelect($name, $entries, $default, $size, $blank,
  295.                                   $multiple, $attribs);
  296.     }
  297.  
  298.     // }}}
  299.     // {{{ displaySelectRow()
  300.  
  301.     function displaySelectRow($name, $title, &$entries, $default = '',
  302.                   $size = 1, $blank = '', $multiple = false)
  303.     {
  304.     print $this->returnSelectRow($name, $title, $entries, $default, $size,
  305.                      $blank, $multiple);
  306.     }
  307.  
  308.     // }}}
  309.     // {{{ displayHidden()
  310.  
  311.     function displayHidden($name, $value) {
  312.     print $this->returnHidden($name, $value);
  313.     }
  314.  
  315.     // }}}
  316.  
  317.     // XXX missing: displayRadio displayRadioRow
  318.  
  319.     // {{{ returnText()
  320.  
  321.     function returnText($name, $default = '', $size = HTML_FORM_TEXT_SIZE) {
  322.         return "<INPUT NAME=\"$name\" VALUE=\"$default\" SIZE=\"$size\">";
  323.     }
  324.  
  325.     // }}}
  326.     // {{{ returnTextRow()
  327.  
  328.     function returnTextRow($name, $title, $default = '', $size = HTML_FORM_TEXT_SIZE) {
  329.         $str .= " <TR>\n";
  330.         $str .= "  <TH ALIGN=\"right\">$title</TH>";
  331.         $str .= "  <TD>";
  332.         $str .= $this->returnText($name, $default, $size);
  333.         $str .= "</TD>\n";
  334.         $str .= " </TR>\n";
  335.  
  336.         return $str;
  337.     }
  338.  
  339.     // }}}
  340.     // {{{ returnPassword()
  341.  
  342.     function returnPassword($name, $default = '', $size = HTML_FORM_PASSWD_SIZE) {
  343.         return "<INPUT NAME=\"$name\" TYPE=\"password\" VALUE=\"$default\" SIZE=\"$size\">";
  344.     }
  345.  
  346.     // }}}
  347.     // {{{ returnPasswordRow()
  348.  
  349.     function returnPasswordRow($name, $title, $default = '', $size = HTML_FORM_PASSWD_SIZE) {
  350.         $str .= "<TR>\n";
  351.         $str .= "  <TH ALIGN=\"right\">$title</TH>\n";
  352.         $str .= "  <TD>";
  353.         $str .= $this->returnPassword($name, $default, $size);
  354.         $str .= " repeat: ";
  355.         $str .= $this->returnPassword($name."2", $default, $size);
  356.         $str .= "</TD>\n";
  357.         $str .= "</TR>\n";
  358.  
  359.         return $str;
  360.     }
  361.  
  362.     // }}}
  363.     // {{{ returnCheckbox()
  364.  
  365.     function returnCheckbox($name, $default = false) {
  366.         $str .= "<INPUT TYPE=\"checkbox\" NAME=\"$name\"";
  367.         if ($default && $default != 'off') {
  368.             $str .= " CHECKED";
  369.         }
  370.         $str .= ">";
  371.  
  372.         return $str;
  373.     }
  374.  
  375.     // }}}
  376.     // {{{ returnCheckboxRow()
  377.  
  378.     function returnCheckboxRow($name, $title, $default = false) {
  379.         $str .= " <TR>\n";
  380.         $str .= "  <TH ALIGN=\"right\">$title</TH>\n";
  381.         $str .= "  <TD>";
  382.         $str .= $this->returnCheckbox($name, $default);
  383.         $str .= "</TD>\n";
  384.         $str .= " </TR>\n";
  385.  
  386.         return $str;
  387.     }
  388.  
  389.     // }}}
  390.     // {{{ returnTextarea()
  391.  
  392.     function returnTextarea($name, $default = '', $width = 40, $height = 5) {
  393.         $str .= "<TEXTAREA NAME=\"$name\" COLS=\"$width\" ROWS=\"$height\">";
  394.         $str .= $default;
  395.         $str .= "</TEXTAREA>";
  396.  
  397.         return $str;
  398.     }
  399.  
  400.     // }}}
  401.     // {{{ returnTextareaRow()
  402.  
  403.     function returnTextareaRow($name, $title, $default = '', $width = 40, $height = 5) {
  404.         $str .= " <TR>\n";
  405.         $str .= "  <TH ALIGN=\"right\">$title</TH>\n";
  406.         $str .= "  <TD>";
  407.         $str .= $this->returnTextarea($name, &$default, $width, $height);
  408.         $str .= "</TD>\n";
  409.         $str .= " </TR>\n";
  410.  
  411.         return $str;
  412.     }
  413.  
  414.     // }}}
  415.     // {{{ returnSubmit()
  416.  
  417.     function returnSubmit($title = 'Submit Changes', $name = "submit") {
  418.         return "<INPUT NAME=\"$name\" TYPE=\"submit\" VALUE=\"$title\">";
  419.     }
  420.  
  421.     // }}}
  422.     // {{{ returnSubmitRow()
  423.  
  424.     function returnSubmitRow($name = "submit", $title = 'Submit Changes') {
  425.         $str .= " <TR>\n";
  426.         $str .= "  <TD> </TD>\n";
  427.         $str .= "  <TD>";
  428.         $str .= $this->returnSubmit($title, $name);
  429.         $str .= "</TD>\n";
  430.         $str .= " </TR>\n";
  431.  
  432.         return $str;
  433.     }
  434.  
  435.     // }}}
  436.     // {{{ returnReset()
  437.  
  438.     function returnReset($title = 'Clear contents') {
  439.         return "<INPUT TYPE=\"reset\" VALUE=\"$title\">";
  440.     }
  441.  
  442.     // }}}
  443.     // {{{ returnResetRow()
  444.  
  445.     function returnResetRow($title = 'Clear contents') {
  446.         $str .= " <TR>\n";
  447.         $str .= "  <TD> </TD>\n";
  448.         $str .= "  <TD>";
  449.         $str .= $this->returnReset($title);
  450.         $str .= "</TD>\n";
  451.         $str .= " </TR>\n";
  452.  
  453.         return $str;
  454.     }
  455.  
  456.     // }}}
  457.     // {{{ returnSelect()
  458.  
  459.     function returnSelect($name, $entries, $default = '', $size = 1,
  460.                            $blank = '', $multiple = false, $attrib = '') {
  461.         if ($multiple && substr($name, -2) != "[]") {
  462.             $name .= "[]";
  463.         }
  464.         $str .= "   <SELECT NAME=\"$name\"";
  465.         if ($size) {
  466.             $str .= " SIZE=\"$size\"";
  467.         }
  468.         if ($multiple) {
  469.             $str .= " MULTIPLE";
  470.         }
  471.         if ($attrib) {
  472.             $str .= " $attrib";
  473.         }
  474.         $str .= ">\n";
  475.         if ($blank) {
  476.             $str .= "    <OPTION VALUE=\"\">$blank\n";
  477.         }
  478.         while (list($val, $text) = each($entries)) {
  479.             $str .= '    <OPTION ';
  480.             if ($default) {
  481.                 if ($multiple && is_array($default)) {
  482.                     if ((is_string(key($default)) && $default[$val]) ||
  483.                         (is_int(key($default)) && in_array($val, $default))) {
  484.                         $str .= 'SELECTED ';
  485.                     }
  486.                 } elseif ($default == $val) {
  487.                     $str .= 'SELECTED ';
  488.                 }
  489.             }
  490.             $str .= "VALUE=\"$val\">$text\n";
  491.         }
  492.         $str .= "   </SELECT>\n";
  493.  
  494.         return $str;
  495.     }
  496.  
  497.     // }}}
  498.     // {{{ returnSelectRow()
  499.  
  500.     function returnSelectRow($name, $title, &$entries, $default = '', $size = 1,
  501.                               $blank = '', $multiple = false)
  502.     {
  503.         $str .= " <TR>\n";
  504.         $str .= "  <TH ALIGN=\"right\">$title:</TH>\n";
  505.         $str .= "  <TD>\n";
  506.         $str .= $this->returnSelect($name, &$entries, $default, $size, $blank, $multiple);
  507.         $str .= "  </TD>\n";
  508.         $str .= " </TR>\n";
  509.  
  510.         return $str;
  511.     }
  512.  
  513.     // }}}
  514.     // {{{ returnHidden()
  515.  
  516.     function returnHidden($name, $value) {
  517.         return "<INPUT TYPE=\"hidden\" NAME=\"$name\" VALUE=\"$value\">";
  518.     }
  519.  
  520.     // }}}
  521.     // {{{ returnFile()
  522.  
  523.     function returnFile($name = 'userfile', $maxsize = HTML_FORM_MAX_FILE_SIZE, $size = HTML_FORM_TEXT_SIZE) {
  524.         $str .= " <INPUT TYPE=\"hidden\" NAME=\"MAX_FILE_SIZE\" VALUE=\"$maxsize\">";
  525.         $str .= " <INPUT TYPE=\"file\" NAME=\"$name\" SIZE=\"$size\">";
  526.         return $str;
  527.     }
  528.  
  529.     // }}}
  530.     // {{{ returnMultipleFiles()
  531.  
  532.     function returnMultipleFiles($name = 'userfile[]', $maxsize = HTML_FORM_MAX_FILE_SIZE, $files = 3, $size = HTML_FORM_TEXT_SIZE) {
  533.         $str .= " <INPUT TYPE=\"hidden\" NAME=\"MAX_FILE_SIZE\" VALUE=\"$maxsize\">";
  534.         for($i=0; $i<$files; $i++) {
  535.            $str .= " <INPUT TYPE=\"file\" NAME=\"$name\" SIZE=\"$size\"><br>";
  536.         }
  537.         return $str;
  538.     }
  539.  
  540.     // }}}
  541.     // {{{ returnStart()
  542.  
  543.     function returnStart($multipartformdata = false) {
  544.         $str .= "<FORM ACTION=\"" . basename ($this->action) . "\" METHOD=\"$this->method\"";
  545.         if ($this->name) {
  546.             $str .= " NAME=\"$this->name\"";
  547.         }
  548.         if ($multipartformdata) {
  549.             $str .= " ENCTYPE=\"multipart/form-data\"";
  550.         }
  551.         $str .= ">";
  552.  
  553.         return $str;
  554.     }
  555.  
  556.     // }}}
  557.     // {{{ returnEnd()
  558.  
  559.     function returnEnd() {
  560.         $fields = array();
  561.         reset($this->fields);
  562.         while (list($i, $data) = each($this->fields)) {
  563.             if ($data[0] == 'reset') {
  564.                 continue;
  565.             }
  566.             $fields[$data[1]] = true;
  567.         }
  568.     $ret = $this->returnHidden("_fields", implode(":", array_keys($fields)));
  569.     $ret .= "</FORM>";
  570.     return $ret;
  571.     }
  572.  
  573.     // }}}
  574.  
  575.     // {{{ display()
  576.  
  577.     function display() {
  578.         $this->start();
  579.         print "<TABLE>\n";
  580.         reset($this->fields);
  581.         $hidden = array();
  582.         $call_cache = array();
  583.         while (list($i, $data) = each($this->fields)) {
  584.             switch ($data[0]) {
  585.                 case "hidden":
  586.                     $hidden[] = $i;
  587.                     continue 2;
  588.                 case "reset":
  589.                     $params = 1;
  590.                     break;
  591.                 case "submit":
  592.                 case "image":
  593.                     $params = 2;
  594.                     break;
  595.                 case "checkbox":
  596.                     $params = 3;
  597.                     break;
  598.                 case "text":
  599.                 case "password":
  600.                 case "radio":
  601.                     $params = 4;
  602.                     break;
  603.                 case "textarea":
  604.                     $params = 5;
  605.                     break;
  606.                 case "select":
  607.                     $params = 8;
  608.                     break;
  609.                 default:
  610.                     // unknown field type
  611.                     continue 2;
  612.             }
  613.             $str = $call_cache[$data[0]];
  614.             if (empty($str)) {
  615.                 $str = '$this->display'.ucfirst($data[0])."Row(";
  616.                 for ($i = 1; $i <= $params; $i++) {
  617.                     $str .= '$data['.$i.']';
  618.                     if ($i < $params) $str .= ', ';
  619.                 }
  620.                 $str .= ');';
  621.                 $call_cache[$data[0]] = $str;
  622.             }
  623.             eval($str);
  624.         }
  625.         print "</TABLE>\n";
  626.         for ($i = 0; $i < sizeof($hidden); $i++) {
  627.             $this->displayHidden($this->fields[$hidden[$i]][1],
  628.                                  $this->fields[$hidden[$i]][2]);
  629.         }
  630.         $this->end();
  631.     }
  632.  
  633.     // }}}
  634. }
  635.  
  636. /*
  637.  * Local variables:
  638.  * tab-width: 4
  639.  * c-basic-offset: 4
  640.  * End:
  641.  */
  642. ?>
  643.