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 | */ |
---|
21 | function 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 | /* Cria um objeto JSON com os parâmetros opcionais utilizados pelo javascript */ |
---|
77 | $extraParams = array ('idValue' => $idValue |
---|
78 | , 'textValue' => $textValue |
---|
79 | , 'minLength' => $minLength |
---|
80 | ); |
---|
81 | $extraParams = json_encode($extraParams); |
---|
82 | |
---|
83 | /* se o componente for do tipo padrão (POPULATE_ON_LOAD), não necessita de função para onkeyup */ |
---|
84 | if ($mode == 'POPULATE_ON_LOAD'){ |
---|
85 | $inputElement = <<<EOF |
---|
86 | <input id="$name_input" name="$name_input" type="text" value="$textValue" style="$style" onfocus="checkDataLoaded('$name');" onblur="setTimeout('selectAutocompleteElement(\'$name\')', 500);"/> |
---|
87 | EOF; |
---|
88 | } |
---|
89 | elseif ($mode == 'REPOPULATE_ON_CHANGE'){ |
---|
90 | $inputElement = <<<EOF |
---|
91 | <input id="$name_input" name="$name_input" type="text" value="$textValue" style="$style" onblur="setTimeout('selectAutocompleteElement(\'$name\')', 500);" onkeyup="updateCacheRequestsTimeout('$name', '$ajaxClass', '$ajaxMethod', this.value, '$mode')"/> |
---|
92 | EOF; |
---|
93 | } |
---|
94 | |
---|
95 | /* Cria todos os elementos HTML necessários para o componente */ |
---|
96 | $output = <<<EOF |
---|
97 | <input id="$name" name="$name" type="hidden"/> |
---|
98 | $inputElement |
---|
99 | <span id="$name_response"></span> |
---|
100 | <div id="$name_list" class="autocomplete" style="display: none;"></div> |
---|
101 | <script>autocompleteSelect('$name', '$ajaxClass', '$ajaxMethod', $sep$methodParam$sep, '$mode', $extraParams);</script> |
---|
102 | EOF; |
---|
103 | return $output; |
---|
104 | } |
---|
105 | ?> |
---|