[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, |
---|
[2139] | 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', |
---|
[2139] | 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 | |
---|
| 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 | |
---|
[2139] | 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 */ |
---|
[1428] | 96 | $output = <<<EOF |
---|
[1935] | 97 | <input id="$name" name="$name" type="hidden"/> |
---|
[2139] | 98 | $inputElement |
---|
[1428] | 99 | <span id="$name_response"></span> |
---|
| 100 | <div id="$name_list" class="autocomplete" style="display: none;"></div> |
---|
[2139] | 101 | <script>autocompleteSelect('$name', '$ajaxClass', '$ajaxMethod', $sep$methodParam$sep, '$mode', $extraParams);</script> |
---|
[1428] | 102 | EOF; |
---|
| 103 | return $output; |
---|
| 104 | } |
---|
| 105 | ?> |
---|