[1428] | 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, |
---|
[3167] | 30 | 'style' => "width: 200px", |
---|
| 31 | 'mode' => "POPULATE_ON_LOAD" |
---|
[1428] | 32 | ); |
---|
| 33 | $extractParams = array( |
---|
| 34 | 'name', |
---|
| 35 | 'ajaxClass', |
---|
| 36 | 'ajaxMethod', |
---|
| 37 | 'methodParam', |
---|
| 38 | 'minLength', |
---|
| 39 | 'idValue', |
---|
| 40 | 'textValue', |
---|
[3167] | 41 | 'style', |
---|
| 42 | 'mode' |
---|
[1428] | 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 | |
---|
[3398] | 76 | /* se o componente for do tipo padrão (POPULATE_ON_LOAD) */ |
---|
[3167] | 77 | if ($mode == 'POPULATE_ON_LOAD'){ |
---|
[3398] | 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 | } |
---|
[3167] | 89 | $inputElement = <<<EOF |
---|
[3409] | 90 | <input id="$name_input" name="$name_input" type="text" value="$textValue" style="$style" onfocus="$onfocus" onblur="$onblur" $extra_input/> |
---|
[3167] | 91 | EOF; |
---|
| 92 | } |
---|
[3398] | 93 | /* se o componente for do tipo REPOPULATE_ON_CHANGE, deverá fazer chamada ajax para toda entrada nova (verificada na ação onkeyup) */ |
---|
[3167] | 94 | elseif ($mode == 'REPOPULATE_ON_CHANGE'){ |
---|
[3398] | 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 | } |
---|
[3167] | 106 | $inputElement = <<<EOF |
---|
[3398] | 107 | <input id="$name_input" name="$name_input" type="text" value="$textValue" style="$style" onblur="$onblur" onkeyup="$onkeyup" $extra_input/> |
---|
[3167] | 108 | EOF; |
---|
| 109 | } |
---|
| 110 | |
---|
[3398] | 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 | |
---|
[3167] | 118 | /* Cria todos os elementos HTML necessários para o componente */ |
---|
[1428] | 119 | $output = <<<EOF |
---|
[1935] | 120 | <input id="$name" name="$name" type="hidden"/> |
---|
[3167] | 121 | $inputElement |
---|
[1428] | 122 | <span id="$name_response"></span> |
---|
| 123 | <div id="$name_list" class="autocomplete" style="display: none;"></div> |
---|
[3167] | 124 | <script>autocompleteSelect('$name', '$ajaxClass', '$ajaxMethod', $sep$methodParam$sep, '$mode', $extraParams);</script> |
---|
[1428] | 125 | EOF; |
---|
| 126 | return $output; |
---|
| 127 | } |
---|
| 128 | ?> |
---|