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

Source for file autocomplete.php

Documentation is available at autocomplete.php

  1. <?php
  2. /* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
  3.  
  4. /**
  5.  * HTML class for an autocomplete element
  6.  *
  7.  * PHP versions 4 and 5
  8.  *
  9.  * LICENSE: This source file is subject to version 3.01 of the PHP license
  10.  * that is available through the world-wide-web at the following URI:
  11.  * http://www.php.net/license/3_01.txt If you did not receive a copy of
  12.  * the PHP License and are unable to obtain it through the web, please
  13.  * send a note to license@php.net so we can mail you a copy immediately.
  14.  *
  15.  * @category    HTML
  16.  * @package     HTML_QuickForm
  17.  * @author      Matteo Di Giovinazzo <matteodg@infinito.it>
  18.  * @copyright   2001-2011 The PHP Group
  19.  * @license     http://www.php.net/license/3_01.txt PHP License 3.01
  20.  * @version     CVS: $Id: autocomplete.php 317587 2011-10-01 07:55:53Z avb $
  21.  * @link        http://pear.php.net/package/HTML_QuickForm
  22.  */
  23.  
  24. /**
  25.  * HTML class for a text field
  26.  */
  27. require_once 'HTML/QuickForm/text.php';
  28.  
  29. /**
  30.  * HTML class for an autocomplete element
  31.  *
  32.  * Creates an HTML input text element that
  33.  * at every keypressed javascript event checks in an array of options
  34.  * if there's a match and autocompletes the text in case of match.
  35.  *
  36.  * For the JavaScript code thanks to Martin Honnen and Nicholas C. Zakas
  37.  * See {@link http://www.faqts.com/knowledge_base/view.phtml/aid/13562} and
  38.  * {@link http://www.sitepoint.com/article/1220}
  39.  *
  40.  * Example:
  41.  * <code>
  42.  * $autocomplete =& $form->addElement('autocomplete', 'fruit', 'Favourite fruit:');
  43.  * $options = array("Apple", "Orange", "Pear", "Strawberry");
  44.  * $autocomplete->setOptions($options);
  45.  * </code>
  46.  *
  47.  * @category    HTML
  48.  * @package     HTML_QuickForm
  49.  * @author      Matteo Di Giovinazzo <matteodg@infinito.it>
  50.  * @version     Release: 3.2.13
  51.  * @since       3.2
  52.  */
  53. {
  54.     // {{{ properties
  55.  
  56.     /**
  57.      * Options for the autocomplete input text element
  58.      *
  59.      * @var       array 
  60.      * @access    private
  61.      */
  62.     var $_options = array();
  63.  
  64.     /**
  65.      * "One-time" javascript (containing functions), see bug #4611
  66.      *
  67.      * @var     string 
  68.      * @access  private
  69.      */
  70.     var $_js '';
  71.  
  72.     // }}}
  73.     // {{{ constructor
  74.  
  75.     /**
  76.      * Class constructor
  77.      *
  78.      * @param     string    $elementName    (optional)Input field name attribute
  79.      * @param     string    $elementLabel   (optional)Input field label in form
  80.      * @param     array     $options        (optional)Autocomplete options
  81.      * @param     mixed     $attributes     (optional)Either a typical HTML attribute string
  82.      *                                       or an associative array. Date format is passed along the attributes.
  83.      * @access    public
  84.      * @return    void 
  85.      */
  86.     function HTML_QuickForm_autocomplete($elementName = null$elementLabel = null$options = null$attributes = null)
  87.     {
  88.         $this->HTML_QuickForm_text($elementName$elementLabel$attributes);
  89.         $this->_persistantFreeze = true;
  90.         $this->_type 'autocomplete';
  91.         if (isset($options)) {
  92.             $this->setOptions($options);
  93.         }
  94.     //end constructor
  95.  
  96.     // }}}
  97.     // {{{ setOptions()
  98.  
  99.     /**
  100.      * Sets the options for the autocomplete input text element
  101.      *
  102.      * @param     array    $options    Array of options for the autocomplete input text element
  103.      * @access    public
  104.      * @return    void 
  105.      */
  106.     function setOptions($options)
  107.     {
  108.         $this->_options array_values($options);
  109.     // end func setOptions
  110.  
  111.     // }}}
  112.     // {{{ toHtml()
  113.  
  114.     /**
  115.      * Returns Html for the autocomplete input text element
  116.      *
  117.      * @access      public
  118.      * @return      string 
  119.      */
  120.     function toHtml()
  121.     {
  122.         // prevent problems with grouped elements
  123.         $arrayName str_replace(array('['']')array('__''')$this->getName()) '_values';
  124.  
  125.         $this->updateAttributes(array(
  126.             'onkeypress' => 'return window.autocomplete(this, event, ' $arrayName ');'
  127.         ));
  128.         if ($this->_flagFrozen{
  129.             $js '';
  130.         else {
  131.             $js "<script type=\"text/javascript\">\n//<![CDATA[\n";
  132.             if (!defined('HTML_QUICKFORM_AUTOCOMPLETE_EXISTS')) {
  133.                 $this->_js .= <<<EOS
  134.  
  135. /* begin javascript for autocomplete */
  136. function setSelectionRange(input, selectionStart, selectionEnd) {
  137.     if (input.setSelectionRange) {
  138.         input.setSelectionRange(selectionStart, selectionEnd);
  139.     }
  140.     else if (input.createTextRange) {
  141.         var range = input.createTextRange();
  142.         range.collapse(true);
  143.         range.moveEnd("character", selectionEnd);
  144.         range.moveStart("character", selectionStart);
  145.         range.select();
  146.     }
  147.     input.focus();
  148. }
  149.  
  150. function setCaretToPosition(input, position) {
  151.     setSelectionRange(input, position, position);
  152. }
  153.  
  154. function replaceSelection (input, replaceString) {
  155.     var len = replaceString.length;
  156.     if (input.setSelectionRange) {
  157.         var selectionStart = input.selectionStart;
  158.         var selectionEnd = input.selectionEnd;
  159.  
  160.         input.value = input.value.substring(0, selectionStart) + replaceString + input.value.substring(selectionEnd);
  161.         input.selectionStart  = selectionStart + len;
  162.         input.selectionEnd  = selectionStart + len;
  163.     }
  164.     else if (document.selection) {
  165.         var range = document.selection.createRange();
  166.         var saved_range = range.duplicate();
  167.  
  168.         if (range.parentElement() == input) {
  169.             range.text = replaceString;
  170.             range.moveEnd("character", saved_range.selectionStart + len);
  171.             range.moveStart("character", saved_range.selectionStart + len);
  172.             range.select();
  173.         }
  174.     }
  175.     input.focus();
  176. }
  177.  
  178.  
  179. function autocompleteMatch (text, values) {
  180.     for (var i = 0; i < values.length; i++) {
  181.         if (values[i].toUpperCase().indexOf(text.toUpperCase()) == 0) {
  182.             return values[i];
  183.         }
  184.     }
  185.  
  186.     return null;
  187. }
  188.  
  189. function autocomplete(textbox, event, values) {
  190.     if (textbox.setSelectionRange || textbox.createTextRange) {
  191.         switch (event.keyCode) {
  192.             case 38:    // up arrow
  193.             case 40:    // down arrow
  194.             case 37:    // left arrow
  195.             case 39:    // right arrow
  196.             case 33:    // page up
  197.             case 34:    // page down
  198.             case 36:    // home
  199.             case 35:    // end
  200.             case 13:    // enter
  201.             case 9:     // tab
  202.             case 27:    // esc
  203.             case 16:    // shift
  204.             case 17:    // ctrl
  205.             case 18:    // alt
  206.             case 20:    // caps lock
  207.             case 8:     // backspace
  208.             case 46:    // delete
  209.                 return true;
  210.                 break;
  211.  
  212.             default:
  213.                 var c = String.fromCharCode(
  214.                     (event.charCode == undefined) ? event.keyCode : event.charCode
  215.                 );
  216.                 replaceSelection(textbox, c);
  217.                 sMatch = autocompleteMatch(textbox.value, values);
  218.                 var len = textbox.value.length;
  219.  
  220.                 if (sMatch != null) {
  221.                     textbox.value = sMatch;
  222.                     setSelectionRange(textbox, len, textbox.value.length);
  223.                 }
  224.                 return false;
  225.         }
  226.     }
  227.     else {
  228.         return true;
  229.     }
  230. }
  231. /* end javascript for autocomplete */
  232.  
  233. EOS;
  234.                 define('HTML_QUICKFORM_AUTOCOMPLETE_EXISTS'true);
  235.             }
  236.             $jsEscape = array(
  237.                 "\r"    => '\r',
  238.                 "\n"    => '\n',
  239.                 "\t"    => '\t',
  240.                 "'"     => "\\'",
  241.                 '"'     => '\"',
  242.                 '\\'    => '\\\\'
  243.             );
  244.  
  245.             $js .= $this->_js;
  246.             $js .= 'var ' $arrayName " = new Array();\n";
  247.             for ($i = 0; $i count($this->_options)$i++{
  248.                 $js .= $arrayName '[' $i "] = '" strtr($this->_options[$i]$jsEscape"';\n";
  249.             }
  250.             $js .= "//]]>\n</script>";
  251.         }
  252.         return $js . parent::toHtml();
  253.     }// end func toHtml
  254.  
  255.     // }}}
  256. // end class HTML_QuickForm_autocomplete
  257. ?>

Documentation generated on Sat, 01 Oct 2011 09:00:07 +0000 by phpDocumentor 1.4.3. PEAR Logo Copyright © PHP Group 2004.