Location: PHPKode > scripts > AJAXFilterSelect > AJAXFilterSelect.php
<?php
/**
 * AJAXFilterSelect Quick Form element class
 * (c) 2005 Jason Hines, hide@address.com
 *
 * This library is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Library General Public License as
 * published by the Free Software Foundation; either version 2 of the
 * License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library
 * General Public License for more details.
 */

require_once("HTML/QuickForm/input.php");

/**
 * HTML_QuickForm_AjaxFilterSelect QuickForm element class
 *
 * A QuickForm element that provides a select element populated with 
 * results from an AJAX-enabled search.  Requires the HTML_AJAX package.
 * AjaxFilterSelect must be given valid callback information, which tells
 * it where to retrieve the search results.
 *
 * Example QuickForm usage:
 * <code>
 * <?php
 * require('HTML/QuickForm.php');
 *
 * // New QuickForm instance
 * $form = new HTML_QuickForm;
 * 
 * // Create AjaxFilterSelect element instance
 * $fs = $form->createElement("ajax_filter_select","account_id","Account:");
 *
 * // Set callback information (server_url, class_name, function_name)
 * $fs->setServerCallback("/account_list.php","account_list","get_accounts");
 *
 * // Add AjaxFilterSelect element to form
 * $form->addElement($fs);
 * ?>
 * </code>
 *
 * AJAX Server Class Example:
 * <code>
 * <?php
 * require('HTML/AJAX/Server.php');
 * $server = new HTML_AJAX_Server();
 * $account_list = new account_list;
 * $server->registerClass($account_list);
 * $server->handleRequest();
 * 
 * class account_list {
 *     function get_accounts($query_text) {
 *         // $query_text is the user input.
 *         // Execute a database query, and return
 *         // the results in an associate array.
 *         return $result;
 *     }
 * }
 * ?>
 * </code>
 *
 * The AJAX server must return an associate array (or also
 * known as name=>value pairs) because the array is used to populate
 * a select element with values and text.
 *
 * See the HTML_AJAX PEAR package for more information on
 * creating AJAX server classes.
 *
 * @version   $Revision: $
 * @author    Jason Hines <hide@address.com>
 * @access    public
 * @package   HTML_QuickForm_AjaxFilterSelect
 * @category  HTML
 */

class HTML_QuickForm_ajaxfilterselect extends HTML_QuickForm_input {

    var $_server_url = null;
    var $_server_class = null;
    var $_server_method = null;

    /**
     * Sets callback info required to make the AJAX call
     *
     * @param   string  $server_url     URL/Path to the AJAX server
     * @param   string  $class_name     Name of the AJAX server class
     * @param   string  $function_name  The class function to call
     * @author  Jason Hines <hide@address.com>
     * @return  void
     * @access  public
     */
    function setServerCallback($server_url,$class_name,$function_name) {
        $this->_server_url = $server_url;
        $this->_server_class = $class_name;
        $this->_server_method = $function_name;
    }

    /**
     * Returns the input field in HTML
     *
     * @access    public
     * @return    string or PEAR error on misconfiguration
     */
    function toHtml() {
        if (is_null($this->_server_url) || is_null($this->_server_class) || is_null($this->_server_method)) {
            return PEAR::raiseError("AjaxFilterSelect element not configured!");
        }

        if ($this->_flagFrozen) {
            return $this->getFrozenHtml();
        } else {
            $out = $this->_getTabs();
            $out .= '<script type="text/javascript" src="'.$this->_server_url.'?client=all&stub='.$this->_server_class.'"></script>';
            $out .= '
            <script type="text/javascript">
                function fs_findInput_'.$this->getName().'() {
                    var fs_Callback = {
                        '.$this->_server_method.': function(result) {
                            fs_setupInput("'.$this->getName().'");
                            var s = document.getElementById("fs_select_'.$this->getName().'");
                            var i = 0;
                            for (id in result) {
                                if (i==0) {
                                    var l = document.getElementById("fs_label_'.$this->getName().'");
                                    l.value = result[id];
                                }
                                s.options[i++] = new Option(result[id],id);
                            }
                        }
                    }
                    var remoteObject = new '.$this->_server_class.'(fs_Callback);
                    remoteObject.'.$this->_server_method.'(document.getElementById("fs_text_'.$this->getName().'").value);
                }
            </script>';
            $out .= $this->_getJavascript();
            $out .= '<div id="filterselect_'.$this->getName().'"></div>';
            $out .= "<input type=\"hidden\" name=\"fs_label_".$this->getName()."\" id=\"fs_label_".$this->getName()."\" value=\"".$_REQUEST['fs_label_'.$this->getName()]."\" />";
            if ($this->getValue()) {
                $out .= "<script type=\"text/javascript\">fs_valueInput('".$this->getName()."','".$this->getValue()."');</script>";
            } else {
                $out .= "<script type=\"text/javascript\">fs_clearInput('".$this->getName()."');</script>";
            }
            return $out;
        }
    }

    /**
     * Return script containing functions for AjaxAutoFilter
     *
     * @return  string    $js   String of Javascript code
     * @access  private
     */
    function _getJavascript() {
        if (defined('_FILTERSELECT_JS_EXISTS')) {
            return $js;
        }
        define('_FILTERSELECT_JS_EXISTS', true);
        $js .= '
            <script type="text/javascript">
            function fs_clearInput(n) {
                // container
                var div = document.createElement("div");
                div.id = "filterselect_"+n;
    
                // text input
                var t = document.createElement("input");
                t.type = "text";
                t.name = n;
                t.id = "fs_text_"+n;
                t.autocomplete = "off";
                div.appendChild(t);

                // find button
                var f = document.createElement("input");
                f.type = "button";
                f.id = "fs_find_"+n;
                f.value = "Find";
                f.onclick = function() { eval("fs_findInput_"+n+"()"); }
                div.appendChild(f);

                // replace div
                var old_div = document.getElementById("filterselect_"+n);
                old_div.parentNode.replaceChild(div,old_div);
            }
            function fs_setupInput(n) {
                // container
                var div = document.createElement("div");
                div.id = "filterselect_"+n;
    
                // select
                var s = document.createElement("select");
                s.name = n;
                s.id = "fs_select_"+n;
                s.onchange = function() { fs_saveLabel(n,s); }
                div.appendChild(s);

                // clear button
                var c = document.createElement("input");
                c.type = "button";
                c.id = "fs_clear_"+n;
                c.value = "Clear";
                c.onclick = function() { fs_clearInput(n); }
                div.appendChild(c);

                // replace div
                var old_div = document.getElementById("filterselect_"+n);
                old_div.parentNode.replaceChild(div,old_div);
            }
            function fs_valueInput(n,v) {
                // container
                var div = document.getElementById("filterselect_"+n);

                // hidden input
                h = document.createElement("input");
                h.type = "hidden";
                h.value = v;
                h.id = "fs_text_"+n;
                h.name = n;
                div.appendChild(h);

                // get label value
                var l = document.getElementById("fs_label_"+n);

                // print input
                t = document.createElement("span");
                t.innerHTML = l.value + "&nbsp;&nbsp;&nbsp;";
                div.appendChild(t);

                // clear button
                var c = document.createElement("input");
                c.type = "button";
                c.id = "fs_clear_"+n;
                c.value = "Change";
                c.onclick = function() { fs_clearInput(n); }
                div.appendChild(c);
            }
            function fs_saveLabel(n,s) {
                var l = document.getElementById("fs_label_"+n);
                l.value = s.options[s.selectedIndex].text;
            }
            </script>';
          return $js;
     }

}

#if (class_exists('HTML_QuickForm')) {
#    HTML_QuickForm::registerElementType('ajaxfilterselect', 'HTML/QuickForm/ajaxfilterselect.php', 'HTML_QuickForm_ajaxfilterselect');
#}


?> 
Return current item: AJAXFilterSelect