dois selects

MarcosFonseca

Power Member
Olá malta

Gostaria de fazer uma select depender de outra, por exemplo:

Escolher marca da computador: HP
Modelo: Compaq nx2112

Mediante a marda do pc, aparecem os modelos...

Mas nao tou a conseguir fazer, terei que usar JavaScript?

cumpss
 
Ou ainda..... utilizando simplesmente Javascript.

Para quê complicar...;)



só com javascript não estou a ver como é possivel...a segunda drop down é preenchida consoante o valor escolhido na primeira, tem de ir ao servidor (par ir buscar os resultados a uma tabela) portanto parece-me que se trata de uma solução inviável..usa Ajax que não é tão complicado como parece
 
AJAX sem dúvida.

Só com javascript não consegues fazer, a não ser que trouxesses os valores todos e fizesses o trabalho em javascript fazendo só um select, com o inconveniente de matares a aplicação se for mta informação. :P

Ou então com POST, mas é menos bonito e menos prático...
 
É claro que é possível só com Javascript e PHP, a informação é toda carregada durante a abertura da página para arrays, e consoante a selecção do primeiro select, o 2º select é preenchido com a informação no array correspondente à 'key' do primeiro select.


Agora tudo depende da quantidade de informação que irá ser utilizada.... se não fôr para utilizar quantidades massivas de informação, não estou a perceber o porquê de se estar a carregar a página com requests de AJAX só porque está na moda :confused:
 
É claro que é possível só com Javascript e PHP, a informação é toda carregada durante a abertura da página para arrays, e consoante a selecção do primeiro select, o 2º select é preenchido com a informação no array correspondente à 'key' do primeiro select.


Agora tudo depende da quantidade de informação que irá ser utilizada.... se não fôr para utilizar quantidades massivas de informação, não estou a perceber o porquê de se estar a carregar a página com requests de AJAX só porque está na moda :confused:

Não é uma questão de moda. É uma questão de optimização. Por javascript + PHP só tens duas maneiras de o fazer.

1ª Forma.
Select à base de dados sem Key, e passas tudo para um array. A key é usada na função em javascript para pesquisar no result set para alimentar a segunda combo. Com isto não há POST ficando tudo on the fly, mas tens um peso enorme de informação trazida além do overkill proporcionado pela função de pesquisa. E fazes apenas 1 select à base de dados.

2ª Forma.
Carregas a primeira combo e no onchange fazes SELECT. Tens que fazer POST para o server para carregares a segunda combo. Perdes tempo e é menos bonito veres a página a ser carregada novamente.

Com Ajax tens tudo fluído e transparente. Alimentas a primeira combo e fazes request para o SELECT da segunda combo. Não há POST e consequentemente não tens recarregamento de página. A informação fica-te automaticamente disponível sem perda de performance.

Se há coisas que surgiram para optimização há que encarar isso como uma mais valia e usar. Não encaro isso como "modas".
 
Ok.... desisto.

Olá malta

Gostaria de fazer uma select depender de outra, por exemplo:

Escolher marca da computador: HP
Modelo: Compaq nx2112

Mediante a marda do pc, aparecem os modelos...

Mas nao tou a conseguir fazer, terei que usar JavaScript?

cumpss
A questão era quais as hipóteses de o fazer, e com recurso a quê?

Quando disse que apenas com Javascript+PHP é possível, dizem logo que é impossível (por aqui se vê os conhecimentos).... e que com o AJAX é que é bom.

Eu não tenho nada contra AJAX, e até o utilizo várias vezes, mas dependendo da quantidade de informação necessária poderá não ser necessário utilizá-lo. Se quiserem ser puristas na questão da performance, façam das duas formas e comparem os tempos de execução.

Por mim desisto..... indiquei que é possível só com Javascript e PHP. É uma forma de o fazer, se quiserem utilizem se não utilizem outra forma.


Deixo aqui um exemplo de como o fazer só com Javascript + PHP:

Código:
<script type="text/javascript">
    <?php 
        $models = mysql_query( "SELECT * FROM models ORDER BY title ASC" , $__DB_CONNECTION ) or die( mysql_error( ));
        echo 'var idsMarcas = new Array('.mysql_num_rows( $models ).');';
        echo 'var idsModelos = new Array('.mysql_num_rows( $models ).');';
        echo 'var modelos = new Array('.mysql_num_rows( $models ).');';
        
        $i = 0;
        while ( $row_models = mysql_fetch_assoc( $models ) ) {
            echo 'idsMarcas['.$i.'] = '.$row_models[ 'id_make' ].';';
            echo 'idsModelos['.$i.'] = '.$row_models[ 'id_model' ].';';
            echo 'modelos['.$i.'] = "'.$row_models[ 'title' ].'";';
            $i++;
        }
    ?>
    function populate_models(id) {
        var combo = document.search_form.id_model;
    
        for ( x=combo.options.length-1; x>=0 ; x-- )
            combo.options[x] = null;

        combo.options[combo.options.length] = new Option( "" , "" );
        
        //<![CDATA[ 
        for( var i=0; i<modelos.length; i++ ) {
            if( idsMarcas[i]==id )
                combo.options[combo.options.length] = new Option( modelos[i] , idsModelos[i] );
        }
        //]]> 
    }
</script>


<select name="id_make" onchange="populate_models(this.options[selectedIndex].value)" class="search_item">
                    <option value="">&nbsp;</option>
                    <?php
                        while( $row_makes = mysql_fetch_assoc( $makes ) ) {
                            if( isset( $id_make ) && $id_make == $row_makes[ 'id_make' ] ) 
                                echo "<option value='".$row_makes[ 'id_make' ]."' selected>".ucwords( $row_makes[ 'title' ])."</option>";
                            else
                                echo "<option value='".$row_makes[ 'id_make' ]."'>".ucwords( $row_makes[ 'title' ])."</option>";
                        }
                    ?>
                </select>

<select name="id_model" class="search_item">
                    <option value="">&nbsp;</option>
                </select>
Cumprimentos
Bruno Vaz
 
Última edição:
Ok.... desisto.

A questão era quais as hipóteses de o fazer, e com recurso a quê?

Quando disse que apenas com Javascript+PHP é possível, dizem logo que é impossível (por aqui se vê os conhecimentos).... e que com o AJAX é que é bom.

Eu não tenho nada contra AJAX, e até o utilizo várias vezes, mas dependendo da quantidade de informação necessária poderá não ser necessário utilizá-lo. Se quiserem ser puristas na questão da performance, façam das duas formas e comparem os tempos de execução.

Por mim desisto..... indiquei que é possível só com Javascript e PHP. É uma forma de o fazer, se quiserem utilizem se não utilizem outra forma.



o que tu disseste e passo a citar foi:

Ou ainda..... utilizando simplesmente Javascript.

Para quê complicar...;)

ao qual eu respondi que não era possivel, pois é sempre necessário tecnologia de servidor. É que fazê-lo com javascript+php é diferente do que afirmaste inicialmente.

Para cada problema existem várias soluções (até posso acrescentar mais uma que é a velha técnica do Iframe escondido).
Neste caso a melhor solução é usar Ajax.
 
Ok.... desisto.

A questão era quais as hipóteses de o fazer, e com recurso a quê?

Quando disse que apenas com Javascript+PHP é possível, dizem logo que é impossível (por aqui se vê os conhecimentos).... e que com o AJAX é que é bom.

Se leres bem eu não disse que era impossível.

Mas imagina numa tabela AgComp (hipoteticamente) com os campos marca e modelo. Tens 1000 marcas e cada marca tem 300 modelos.

Com AJAX fazes um SELECT DISTINCT da marca, e consequentemente um SELECT modelo FROM AgComp Where marca=keyValue. Trazes 1000 registos na primeira invocação e 300 na segunda.

Da maneira como dizes trazes 300 000 registos para frontend. Qual é que achas realmente q é mais optimizante? Qual é que proporciona maior carga?

Foi só isso que me referi. Claro que é possível fazer em JavaScript + PHP e até é possível fazeres com dois selects se fizeres POST. Mas se exponenciares isto com valores mais elevados corres inclusivé o risco de matares mesmo a performance da aplicação web com o número de values retornados se utilizares a primeira forma.

Foi só isto que foi referido penso eu. Neste caso AJAX será a melhor opção.

Para cada problema existem várias soluções (até posso acrescentar mais uma que é a velha técnica do Iframe escondido).
Neste caso a melhor solução é usar Ajax.

Old school e funciona.
 
Última edição:
Back
Topo