PHPonTrax
[ class tree: PHPonTrax ] [ index: PHPonTrax ] [ all elements ]

Source for file form_helper.php

Documentation is available at form_helper.php

  1. <?php
  2. /**
  3.  *  File containing the FormHelper class
  4.  *
  5.  *  (PHP 5)
  6.  *
  7.  *  @package PHPonTrax
  8.  *  @version $Id: form_helper.php 243 2006-08-23 05:25:24Z john $
  9.  *  @copyright (c) 2005 John Peterson
  10.  *
  11.  *   Permission is hereby granted, free of charge, to any person obtaining
  12.  *   a copy of this software and associated documentation files (the
  13.  *   "Software"), to deal in the Software without restriction, including
  14.  *   without limitation the rights to use, copy, modify, merge, publish,
  15.  *   distribute, sublicense, and/or sell copies of the Software, and to
  16.  *   permit persons to whom the Software is furnished to do so, subject to
  17.  *   the following conditions:
  18.  *
  19.  *   The above copyright notice and this permission notice shall be
  20.  *   included in all copies or substantial portions of the Software.
  21.  *
  22.  *   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  23.  *   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  24.  *   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  25.  *   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
  26.  *   LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  27.  *   OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  28.  *   WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  29.  */
  30.  
  31. /**
  32.  *  @todo Document this class
  33.  */
  34. class FormHelper extends Helpers {
  35.  
  36.     /**
  37.      *  Default attributes for input fields
  38.      *  @var string[] 
  39.      */
  40.     private $default_field_options = array();
  41.  
  42.     /**
  43.      *  Default attributes for radio buttons
  44.      *  @var string[] 
  45.      */
  46.     private $default_radio_options = array();
  47.  
  48.     /**
  49.      *  Default attributes for text areas
  50.      *  @var string[] 
  51.      */
  52.     private $default_text_area_options = array();
  53.  
  54.     /**
  55.      *  Default attributes for dates
  56.      *  @var string[] 
  57.      */
  58.     private $default_date_options = array();
  59.  
  60.     /**
  61.      *  @todo Document this method
  62.      *  @uses default_date_options
  63.      *  @uses default_field_options
  64.      *  @uses default_radio_options
  65.      *  @uses default_text_area_options
  66.      */
  67.     function __construct($object_name$attribute_name{
  68.         parent::__construct($object_name$attribute_name);
  69.  
  70.         //  Set default attributes for input fields
  71.         $this->default_field_options = 
  72.             array_key_exists('DEFAULT_FIELD_OPTIONS',$GLOBALS)
  73.             ? $GLOBALS['DEFAULT_FIELD_OPTIONS']
  74.             : array("size" => 30);
  75.  
  76.         //  Set default attributes for radio buttons
  77.         $this->default_radio_options =
  78.             array_key_exists('DEFAULT_RADIO_OPTIONS',$GLOBALS)
  79.             ? $GLOBALS['DEFAULT_RADIO_OPTIONS']
  80.             : array();
  81.  
  82.         //  Set default attributes for text areas
  83.         $this->default_text_area_options =
  84.             array_key_exists('DEFAULT_TEXT_AREA_OPTIONS',$GLOBALS)
  85.             ? $GLOBALS['DEFAULT_TEXT_AREA_OPTIONS']
  86.             : array("cols" => 40"rows" => 20);
  87.  
  88.         //  Set default attributes for dates
  89.         $this->default_date_options =
  90.             array_key_exists('DEFAULT_Date_OPTIONS',$GLOBALS)
  91.             ? $GLOBALS['DEFAULT_DATE_OPTIONS']
  92.             : array(":discard_type" => true);
  93.     }
  94.  
  95.     /**
  96.      *  @todo Document this method
  97.      */
  98.     function tag_name({
  99.         return "{$this->object_name}[{$this->attribute_name}]";
  100.     }
  101.  
  102.     /**
  103.      *  @todo Document this method
  104.      */
  105.     function tag_name_with_index($index) {
  106.         return "{$this->object_name}[{$index}][{$this->attribute_name}]";
  107.     }
  108.  
  109.     /**
  110.      *  @todo Document this method
  111.      */
  112.     function tag_id() {
  113.         return "{$this->object_name}_{$this->attribute_name}";
  114.     }
  115.  
  116.     /**
  117.      *  @todo Document this method
  118.      */
  119.     function tag_id_with_index($index) {
  120.         return "{$this->object_name}_{$index}_{$this->attribute_name}";
  121.     }
  122.  
  123.     /**
  124.      *  @todo Document this method
  125.      *  @param string[]
  126.      *  @uses auto_index
  127.      *  @uses tag_id
  128.      *  @uses tag_name
  129.      *  @uses tag_id_with_index()
  130.      *  @uses tag_name_with_index()
  131.      */
  132.     function add_default_name_and_id($options) {  
  133.         $name_option_exists = array_key_exists('name', $options);    
  134.            if(array_key_exists("index", $options)) {
  135.             $options['name'] = $name_option_exists
  136.                 ? $options['name']
  137.                 : $this->tag_name_with_index($options['index']);
  138.             $options['id'array_key_exists('id'$options)
  139.                 ? $options['id']
  140.                 : $this->tag_id_with_index($options['index']);
  141.             unset($options['index']);
  142.         } elseif($this->auto_index{
  143.             $options['name'] = $name_option_exists
  144.                 ? $options['name']
  145.                 : $this->tag_name_with_index($this->auto_index);
  146.             $options['id'array_key_exists('id'$options)
  147.                 ? $options['id']
  148.                 : $this->tag_id_with_index($this->auto_index);
  149.         } else {
  150.             $options['name'] = $name_option_exists
  151.                 ? $options['name']
  152.                 : $this->tag_name();
  153.             $options['id'array_key_exists('id'$options)
  154.                 ? $options['id']
  155.                 : $this->tag_id();
  156.         }
  157.         if(array_key_exists('multiple', $options) && !$name_option_exists) {
  158.             $options['name'] .= "[]";           
  159.         }
  160.         return $options;
  161.     }
  162.  
  163.     /**
  164.      *  Generate an HTML or XML input tag with optional attributes
  165.      *
  166.      *  @param string  Type of input field (<samp>'text'</samp>,
  167.      *                 <samp>'password'</samp>, <samp>'hidden'</samp>
  168.      *                 <i>etc.</i>)
  169.      *  @param string[] Attributes to apply to the input tag:<br>
  170.      *    <samp>array('attr1' => 'value1'[, 'attr2' => 'value2']...)</samp>
  171.      *  @return string
  172.      *   <samp><input type="</samp><i>type</i>
  173.      *   <samp>" maxlength="</samp><i>maxlength</i><samp>" .../>\n</samp>
  174.      *  @uses add_default_name_and_id()
  175.      *  @uses attribute_name
  176.      *  @uses error_wrapping
  177.      *  @uses default_field_options
  178.      *  @uses object()
  179.      *  @uses tag()
  180.      *  @uses value()
  181.      */
  182.     function to_input_field_tag($field_type, $options = array()) {
  183.         $default_size = array_key_exists("maxlength", $options)
  184.             ? $options["maxlength"] : $this->default_field_options['size'];
  185.         $options["size"array_key_exists("size"$options)
  186.             ? $options["size"]$default_size;
  187.         $options array_merge($this->default_field_options$options);
  188.         if($field_type == "hidden"{
  189.             unset($options["size"]);
  190.         }
  191.         $options["type"] = $field_type;
  192.         if($field_type != "file") {
  193.             $options["value"] = array_key_exists("value", $options)
  194.                 ? $options["value"] : $this->value();
  195.         }
  196.         $options = $this->add_default_name_and_id($options);
  197.         return $this->error_wrapping(
  198.                      $this->tag("input"$options),
  199.                      @array_key_exists($this->attribute_name,
  200.                                       $this->object()->errors)
  201.                      ? true false);
  202.     }
  203.  
  204.     /**
  205.      *  @todo Document this method
  206.      *  @uses add_default_name_and_id()
  207.      */
  208.     function to_radio_button_tag($tag_value, $options = array()) {
  209.         $options = array_merge($this->default_radio_options$options);
  210.         $options["type""radio";
  211.         $options["value"$tag_value;
  212.         if($this->value(== $tag_value{
  213.             $options["checked"] = "checked";
  214.         }
  215.         $pretty_tag_value = preg_replace('/\s/', "_", preg_replace('/\W/', "", strtolower($tag_value)));
  216.         $options["id"] = $this->auto_index ?
  217.             "{$this->object_name}_{$this->auto_index}_{$this->attribute_name}_{$pretty_tag_value}" :
  218.             "{$this->object_name}_{$this->attribute_name}_{$pretty_tag_value}";
  219.         $options = $this->add_default_name_and_id($options);
  220.         return $this->error_wrapping($this->tag("input"$options),$this->object()->errors[$this->attribute_name]);
  221.     }
  222.  
  223.     /**
  224.      *  @todo Document this method
  225.      *  @uses add_default_name_and_id()
  226.      */
  227.     function to_text_area_tag($options = array()) {
  228.         if (array_key_exists("size", $options)) {
  229.             $size = explode('x', $options["size"]);
  230.             $options["cols"] = reset($size);
  231.             $options["rows"] = end($size);
  232.             unset($options["size"]);
  233.         }
  234.         $options = array_merge($this->default_text_area_options$options);
  235.         $options $this->add_default_name_and_id($options);
  236.         return $this->error_wrapping(
  237.            $this->content_tag("textarea",
  238.                               htmlspecialchars($this->value()ENT_COMPAT),
  239.                               $options),
  240.            array_key_exists($this->attribute_name,$this->object()->errors)
  241.            ? $this->object()->errors[$this->attribute_namefalse);
  242.     }
  243.  
  244.     /**
  245.      *  @todo Document this method
  246.      *  @uses add_default_name_and_id()
  247.      */
  248.     function to_check_box_tag($options = array(), $checked_value = "1", $unchecked_value = "0") {
  249.         $options["type"] = "checkbox";
  250.         $options["value"] = $checked_value;
  251.         switch(gettype($this->value())) {
  252.             case 'boolean':
  253.                 $checked = $this->value();
  254.                 break;
  255.             case 'NULL':
  256.                 $checked false;
  257.                 break;
  258.             case 'integer':
  259.                 $checked ($this->value(!= 0);
  260.                 break;
  261.             case 'string':
  262.                 $checked ($this->value(== $checked_value);
  263.                 break;
  264.             default:
  265.                 $checked ($this->value(!= 0);
  266.         }
  267.  
  268.         if ($checked || $options["checked"] == "checked") {
  269.             $options["checked"] = "checked";
  270.         } else {
  271.             unset($options["checked"]);
  272.         }
  273.  
  274.         $options = $this->add_default_name_and_id($options);
  275.         return $this->error_wrapping($this->tag("input"array("name" => $options["name"]"type" => "hidden""value" => $unchecked_value)) $this->tag("input"$options),$this->object()->errors[$this->attribute_name]);
  276.     }
  277.  
  278.     /**
  279.      *  @todo Document this method
  280.      *  @uses add_default_name_and_id()
  281.      */
  282.     function to_boolean_select_tag($options = array()) {
  283.         $options = $this->add_default_name_and_id($options);
  284.         $tag_text "<select ";
  285.         $tag_text .= $this->tag_options($options);
  286.         $tag_text .= ">\n";
  287.         $tag_text .= "<option value=\"0\"";
  288.         if($this->value(== false{
  289.             $tag_text .= " selected";
  290.         }
  291.         $tag_text .= ">False</option>\n";
  292.         $tag_text .= "<option value=\"1\"";
  293.         if($this->value()) {
  294.             $tag_text .= " selected";
  295.         }
  296.         $tag_text .= ">True</option>\n";
  297.         $tag_text .= "</select>\n";
  298.         return $this->error_wrapping($tag_text,$this->object()->errors[$this->attribute_name]);
  299.     }
  300.     
  301. }
  302.  
  303.  
  304. /**
  305.  *  Generate HTML/XML for <input type="text" /> in a view file
  306.  *
  307.  *  Example: In the view file, code
  308.  *           <code><?= text_field("Person", "fname"); ?></code>
  309.  *  Result: <input id="Person_fname" name="Person[fname]" size="30" type="text" value="$Person->fname" />
  310.  *  @param string  Class name of the object being processed
  311.  *  @param string  Name of attribute in the object being processed
  312.  *  @param string[]  Attributes to apply to the generated input tag as:<br>
  313.  *    <samp>array('attr1' => 'value1'[, 'attr2' => 'value2']...)</samp>
  314.  *  @uses FormHelper::to_input_field_tag()
  315.  */
  316. function text_field($object, $field, $options = array()) {
  317.     $form = new FormHelper($object, $field);
  318.     return $form->to_input_field_tag("text"$options);
  319. }
  320.  
  321. /**
  322.  *  Works just like text_field, but returns a input tag of the "password" type instead.
  323.  * Example: password_field("user", "password");
  324.  *  Result: <input type="password" id="user_password" name="user[password]" value="$user->password" />
  325.  *  @uses FormHelper::to_input_field_tag()
  326.  */
  327. function password_field($object, $field, $options = array()) {
  328.     $form = new FormHelper($object, $field);
  329.     return $form->to_input_field_tag("password"$options);
  330. }
  331.  
  332. /**
  333.  *  Works just like text_field, but returns a input tag of the "hidden" type instead.
  334.  *  Example: hidden_field("post", "title");
  335.  *  Result: <input type="hidden" id="post_title" name="post[title]" value="$post->title" />
  336.  *  @uses FormHelper::to_input_field_tag()
  337.  */
  338. function hidden_field($object, $field, $options = array()) {
  339.     $form = new FormHelper($object, $field);
  340.     return $form->to_input_field_tag("hidden"$options);
  341. }
  342.  
  343. /**
  344.  * Works just like text_field, but returns a input tag of the "file" type instead, which won't have any default value.
  345.  *  @uses FormHelper::to_input_field_tag()
  346.  */
  347. function file_field($object, $field, $options = array()) {
  348.     $form = new FormHelper($object, $field);
  349.     return $form->to_input_field_tag("file"$options);
  350. }
  351.  
  352. /**
  353.  *  Example: text_area("post", "body", array("cols" => 20, "rows" => 40));
  354.  *  Result: <textarea cols="20" rows="40" id="post_body" name="post[body]">$post->body</textarea>
  355.  *  @uses FormHelper::to_text_area_tag()
  356.  */
  357. function text_area($object, $field, $options = array()) {
  358.     $form = new FormHelper($object, $field);
  359.     return $form->to_text_area_tag($options);
  360. }
  361.  
  362. /**
  363.  * Returns a checkbox tag tailored for accessing a specified attribute (identified by $field) on an object
  364.  * assigned to the template (identified by $object). It's intended that $field returns an integer and if that
  365.  * integer is above zero, then the checkbox is checked. Additional $options on the input tag can be passed as an
  366.  * array with $options. The $checked_value defaults to 1 while the default $unchecked_value
  367.  * is set to 0 which is convenient for boolean values. Usually unchecked checkboxes don't post anything.
  368.  * We work around this problem by adding a hidden value with the same name as the checkbox.
  369. #
  370.  * Example: Imagine that $post->validated is 1:
  371.  *   check_box("post", "validated");
  372.  * Result:
  373.  *   <input type="checkbox" id="post_validate" name="post[validated] value="1" checked="checked" />
  374.  *   <input name="post[validated]" type="hidden" value="0" />
  375. #
  376.  * Example: Imagine that $puppy->gooddog is no:
  377.  *   check_box("puppy", "gooddog", array(), "yes", "no");
  378.  * Result:
  379.  *     <input type="checkbox" id="puppy_gooddog" name="puppy[gooddog] value="yes" />
  380.  *     <input name="puppy[gooddog]" type="hidden" value="no" />
  381.    *  @uses FormHelper::to_check_box_tag()
  382.  */
  383. function check_box($object, $field, $options = array(), $checked_value = "1", $unchecked_value = "0") {
  384.     $form = new FormHelper($object, $field);
  385.     return $form->to_check_box_tag($options$checked_value$unchecked_value);
  386. }
  387.  
  388. /**
  389.  * Returns a radio button tag for accessing a specified attribute (identified by $field) on an object
  390.  * assigned to the template (identified by $object). If the current value of $field is $tag_value the
  391.  * radio button will be checked. Additional $options on the input tag can be passed as a
  392.  * hash with $options.
  393.  * Example: Imagine that $post->category is "trax":
  394.  *   radio_button("post", "category", "trax");
  395.  *   radio_button("post", "category", "java");
  396.  * Result:
  397.  *     <input type="radio" id="post_category" name="post[category] value="trax" checked="checked" />
  398.  *     <input type="radio" id="post_category" name="post[category] value="java" />
  399.  *  @uses FormHelper::to_radio_button_tag()
  400.  */
  401. function radio_button($object, $field, $tag_value, $options = array()) {
  402.     $form = new FormHelper($object, $field);
  403.     return $form->to_radio_button_tag($tag_value$options);
  404. }
  405.  
  406. /**
  407.  *  Make a new FormHelper object and call its to_boolean_select_tag method
  408.  *  @uses FormHelper::to_boolean_select_tag()
  409.  */
  410. function boolean_select($object, $field, $options = array()) {
  411.     $form = new FormHelper($object, $field);
  412.     return $form->to_boolean_select_tag($options);        
  413. }
  414.  
  415. // -- set Emacs parameters --
  416. // Local variables:
  417. // tab-width: 4
  418. // c-basic-offset: 4
  419. // c-hanging-comment-ender-p: nil
  420. // indent-tabs-mode: nil
  421. // End:

Documentation generated on Mon, 21 May 2007 22:28:31 -0600 by phpDocumentor 1.3.2