source: branches/2.2/workflow/inc/smarty/wf_plugins/function.wf_autocomplete_input.php @ 3398

Revision 3398, 5.1 KB checked in by asaikawa, 13 years ago (diff)

Ticket #946 - Ajustes para permitir que sejam passados parametros extras ao input

Line 
1<?php
2/**
3 * Este plugin insere um input que mostra os valores que podem ser selecionados enquanto o usuário digita.
4 * Os valores são preenchidos previamente através de uma requisição ajax: a classe e método que será invocado é passado por parêmetro no momento em que o desenvolvedor utiliza o componente.
5 *
6 * @package Smarty
7 * @subpackage wf_plugins
8 * @param array $params Array de parametros
9 * - name: o nome que o componente irá receber.
10 * - ajaxClass: classe ajax que será utilizada para fazer a consulta.
11 * - ajaxMethod: método da classe que será invocado para preencher a lista de opções.
12 * - methodParam: Parâmetro para o método que será invocado para preencher a lista de opções.
13 * - idValue: (opcional) o id de um item previamente selecionado (não é visível para o usuário).
14 * - textValue: (opcional) o texto de um item inicialmente selecionado (é visível para o usuário).
15 * - minLength: (opcional) número mínimo de caracteres necessários para que as opções apareçam na lista.
16 * - style: (opcional) estilo para o campo input
17 * @param object &$smarty Instância do objeto smarty em uso
18 * @return string $output codigo que insere os select boxes.
19 * @access public
20 */
21function smarty_function_wf_autocomplete_input($params, &$smarty)
22{
23        $requiredParams = array(
24                'name',
25                'ajaxClass',
26                'ajaxMethod'
27        );
28        $defaultValues = array(
29                'minLength'     => 1,
30                'style'         => "width: 200px",
31                'mode'          => "POPULATE_ON_LOAD"
32        );
33        $extractParams = array(
34                'name',
35                'ajaxClass',
36                'ajaxMethod',
37                'methodParam',
38                'minLength',
39                'idValue',
40                'textValue',
41                'style',
42                'mode'
43        );
44
45        /* verifica se todos os parâmetros obrigatórios foram passados */
46        foreach ($requiredParams as $required)
47                if (!array_key_exists($required, $params) || (empty($params[$required])))
48                        $smarty->trigger_error("[wf_autocomplete_input] missing required parameter(s): $required", E_USER_ERROR);
49
50        /* atribui valores default para os parâmetros não passados */
51        foreach ($defaultValues as $key => $value)
52                if (!isset($params[$key]))
53                        $params[$key] = $value;
54
55        /* extrai alguns parâmetros da matriz de parâmetros */
56        foreach ($extractParams as $extract)
57                $$extract = $params[$extract];
58
59        /* parâmetros extras são "acumulados" em uma única variável */
60        $extraParams = array();
61        foreach ($params as $key => $value_params)
62                if (!in_array($key, $extractParams))
63                        $extraParams[$key] = $value_params;
64
65        $name_input = 'input' . $name;
66        $name_list      = 'list' . $name;
67        $name_response = 'response' . $name;
68
69        /* se parâmetro for um array "joga" para o javascript como um objeto JSON */
70        if (is_array($methodParam)){
71                $methodParam = json_encode($methodParam);
72        } else {
73                $sep = "'"; // se não for um objeto passa parâmetro entre aspas
74        }
75
76        /* se o componente for do tipo padrão (POPULATE_ON_LOAD) */
77        if ($mode == 'POPULATE_ON_LOAD'){
78                // Se o usuário necessitar utilizar os parâmetros onfocus ou onblur, concatena as chamadas
79                // passadas na declaração do componente com as necessárias para o funcionamento do plugin.
80                // Outros parâmetros são apenas repassados para o campo input.
81                $onfocus = "checkDataLoaded('$name');" . $extraParams['onfocus'];
82                unset($extraParams['onfocus']);
83                $onblur = "setTimeout('selectAutocompleteElement(\'$name\')', 500);" . $extraParams['onblur'];
84                unset($extraParams['onblur']);
85                $extra_input = "";
86                foreach($extraParams AS $key => $value){
87                        $extra_input .= " $key=$value ";
88                }
89                $inputElement = <<<EOF
90                <input id="$name_input" name="$name_input" type="text" value="$textValue" style="$style" onfocus=$onfocus onblur=$onblur $extra_input/>
91EOF;
92        }
93        /* se o componente for do tipo REPOPULATE_ON_CHANGE, deverá fazer chamada ajax para toda entrada nova (verificada na ação onkeyup) */
94        elseif ($mode == 'REPOPULATE_ON_CHANGE'){
95                // Se o usuário necessitar utilizar os parâmetros onblur ou onkeyup, concatena as chamadas
96                // passadas na declaração do componente com as necessárias para o funcionamento do plugin.
97                // Outros parâmetros são apenas repassados para o campo input.
98                $onblur = "setTimeout('selectAutocompleteElement(\'$name\')', 500);" . $extraParams['onblur'];
99                unset($extraParams['onblur']);
100                $onkeyup = "updateCacheRequestsTimeout('$name', '$ajaxClass', '$ajaxMethod', this.value, '$mode');" . $extraParams['onkeyup'];
101                unset($extraParams['onkeyup']);
102                $extra_input = "";
103                foreach($extraParams AS $key => $value){
104                        $extra_input .= " $key=$value ";
105                }
106                $inputElement = <<<EOF
107                <input id="$name_input" name="$name_input" type="text" value="$textValue" style="$style" onblur="$onblur" onkeyup="$onkeyup" $extra_input/>
108EOF;
109        }
110
111        /* Cria um objeto JSON com os parâmetros opcionais utilizados pelo javascript */
112        $extraParams = array ('idValue'         => $idValue
113                                                , 'textValue'   => $textValue
114                                                , 'minLength'   => $minLength
115        );
116        $extraParams = json_encode($extraParams);
117
118        /* Cria todos os elementos HTML necessários para o componente */
119        $output = <<<EOF
120        <input id="$name" name="$name" type="hidden"/>
121        $inputElement
122        <span id="$name_response"></span>
123        <div id="$name_list" class="autocomplete" style="display: none;"></div>
124        <script>autocompleteSelect('$name', '$ajaxClass', '$ajaxMethod', $sep$methodParam$sep, '$mode', $extraParams);</script>
125EOF;
126        return $output;
127}
128?>
Note: See TracBrowser for help on using the repository browser.