1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

dois selects

Discussão em 'Web Development' iniciada por MarcosFonseca, 28 de Janeiro de 2009. (Respostas: 12; Visualizações: 930)

  1. MarcosFonseca

    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
     
  2. tonebiclas

    tonebiclas Power Member

    sim, tens de usar AJAX para isso...

    cumps ;)
     
  3. hostmake

    hostmake Power Member

    Ou usas AJAX, ou fazes um POST relativamente ao onChange da selecção anterior, mas AJAX é o que está a dar.
     
  4. mad16v

    mad16v Power Member

    Ou ainda..... utilizando simplesmente Javascript.

    Para quê complicar...;)
     
  5. fil79

    fil79 Power Member



    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
     
  6. Mavors

    Mavors Power Member

    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...
     
  7. mad16v

    mad16v Power Member

    É 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:
     
  8. Mavors

    Mavors Power Member

    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".
     
  9. fil79

    fil79 Power Member


    não creio que seja uma questão de moda...o futuro das aplicações web vai passar por o Ajax
     
  10. mad16v

    mad16v Power Member

    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.


    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: 30 de Janeiro de 2009
  11. fil79

    fil79 Power Member



    o que tu disseste e passo a citar foi:

    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.
     
  12. Mavors

    Mavors Power Member

    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.

    Old school e funciona.
     
    Última edição: 30 de Janeiro de 2009
  13. fil79

    fil79 Power Member


    sem dúvida...até há uns 6 meses era a solução que usava...até que decidi de uma vez por todas aprender Ajax
     

Partilhar esta Página