Newsgroup: it.comp.lang.javascript
Titolo: Ordina per... ASC e DESC [help]

Ho il seguente link per cambiare l'ordine dei risultati di una query:
<a href="javascript: CambiaOrdine('artista')">Artista</a>
che fa capo a questo script;
<script language="JavaScript1.2">
<!--
function CambiaOrdine(campo) {
     document.frmCerca.ordine.value = campo;
     document.frmCerca.submit();
}
//-->
</script>
Volevo fare in modo che cliccandolo una seconda volta l'ordine si inverta
(ASC to  DESC).
non sono pratico di JS...
Grazie per l'aiuto
Luciano

 non sono pratico di JS...
L'ordinamento viene eseguito lato server; non so che tecnologia usi (ASP,
PHP, JSP..), cmq l'idea di base e' quella di usare lo stesso approccio che
gia' hai. Ovvero, dallo script che hai postato, suppongo che tu abbia nella
form un campo hidden chiamato "ordine", dove imposti il nome della colonna
rispetto alla quale ordinare i record lato server.
Ti basta aggiungerne un'altro, e recuperarne poi il valore server side:
<input type="hidden" name="orderType" value="ASC" />
E modificare la tua funzione in questo modo:
function CambiaOrdine(campo) {
	var f=document.forms["frmCerca"];
 
	f.ordine.value = campo;
	f.orderType.value=f.orderType.value=="ASC"?"DESC":"ASC";
	f.submit();
}
Attento pero'. Cosi' facendo ottieni parzialmente quel che vuoi. In quanto
imposti un ordinamento generale, non in base alla colonna.
Mi spiego: Se tu hai tre colonne, diciamo Artista, Titolo e Data, e ottieni
la prima lista ordinata per data ASC; e poi fai click su "CambiaOrdine" ma
relativamente all'Artista, ottieni un Artista DESC, non ASC come ci si
aspetterebbe. Se poi fai click su Titolo, riottieni un Titolo ASC..
insomma, il tipo di ordinamento s'inverte, ma non in base alla colonna che
clicchi, ma in generale.
E questo, non e' cio' che vorremmo, probabilmente. Allora dobbiamo
specificare che SE la colonna che vogliamo impostare come criterio di
ordinamento, e' diversa da quella corrente, allora l'ordinamento sara' di
tipo ASC (ad esempio), indipendentemente dall'ordinamento corrente.
Altrimenti, se e' la stessa colonna, invertira' l'ordinamento. Per far
questo, basta cambiare la funzione in questo modo:
function CambiaOrdine(campo){
	var f=document.forms["frmCerca"];
 
	if (campo!=f.ordine.value){
		f.orderType.value=f.orderType.value=="ASC"?"DESC":"ASC";
	}else{
		f.orderType.value="ASC";
	}
	f.submit();
}	
Ovviamente il tutto deve essere coordinato lato server.
Ovvero devi ricordarti di scrivere nel campo "ordine" per il quale hai
appena fatto la query, e lo stesso dicasi per il campo "orderType".
E poi, devi concatenare ovviamente il campo orderType nella tua query :)
-- 
C'ya,
  ZER0 :: coder.gfxer.webDesigner();
"When you have eliminated the impossible, whatever remains,
however improbable, must be the truth." (S.H.)

Ho provato ma lo script ha un comportamento strano...
prima mi regolavo solo il campo artista sempre pero in ordine ASC, poi ho
modificato il codice che hai postato cosě:
<script language="JavaScript1.2">
<!--
function CambiaOrdine(campo) {
     var f=document.forms["frmCerca"];
 if (campo!=f.ordine.value){
      f.ordine.value = campo;
      f.orderType.value=f.orderType.value=="ASC"?"DESC":"ASC";
 } else {
      f.ordine.value = campo;
      f.orderType.value="ASC";
 }
 f.submit();
}
//-->
</script>
ho aggiunto   f.ordine.value = campo;
adesso tutte le colonne (esclusa quella dell'anno che forse ha altri tipi di
problemi) si ordinano ma sempre DESC e cliccando nuovamente sul link non
cambia il risultato
questo č il link della tabella...:
http://www.mrfantasy.it/web/pagina.php?name=cerca
Grazie per l'aiuto
Lux

 cambia il risultato
Come ti ho detto, devi sincronizzare la cosa lato server, non basta client.
I campi hidden "ordine" e "orderType" devono riflettere i valori correnti
usati dalla query appena eseguita; non devono essere fissi.
Ovvero, devi avere qualcosa tipo (adesso che so che usi PHP posso usare la
giusta sintassi):
<input type="hidden" name="ordine" value="<?=$columnName?>" />
<input type="hidden" name="orderType" value="<?=$direction?>" />


Ancora non ci siamo...
riepilogando
(1) Clicco sul link, il link che dovrebbe far combiare stato è il seguente:
        <a href="javascript:  CambiaOrdine('artista')" >Artista</a>
        <a href="javascript:  CambiaOrdine('titolo')" >Titolo</a>
(2) questo fa partire il JS
        function CambiaOrdine(campo) {
            var f=document.forms["frmCerca"];
            if (campo!=f.ordine.value){
                f.orderType.value="ASC";
                f.ordine.value = campo;
            } else {
                f.ordine.value = campo;
                f.orderType.value=f.orderType.value=="ASC"?"DESC":"ASC";
            }
            f.submit();
       }
(3) che va a modificare i campi nascosti del form frmCerca:
        <input type="hidden" name="ordine" value="<?php echo $ordine ?>">
        <input type="hidden" name="orderType" value="<?php echo $type ?>">
(4) i campi $ordine e $type sono così inizzializzati
        $ordine = isSet($_POST["ordine"]) ? $_POST["ordine"] : "artista";
        $type    = isSet($_POST["orderType"]) ? $_POST["orderType"] : "ASC";
(5) e in fine  la query funziona così:
        $query .= ' order by '.$ordine .' '.$type;
il problema però è sempre che non si inverte l'ordine...
Lux

 il problema perň č sempre che non si inverte l'ordine...
Sei sicuro che non sta cachando la pagina? Fatti stampare da PHP la query
che esegue, e da javascript fatti visualizzare il valore dei campi prima di
submittare, ovvero:
alert ("column: "+f.ordine.value+"\ntype: "+f.orderType.value);
-- 
C'ya,
  ZER0 :: coder.gfxer.webDesigner();
"Questa e' una lezione difficile, ma importante: Cio' che e' stato, e cio'
che sara', non cambia cio' che e'.
Sta a te decidere poi come prendere questa cosa,se logorarsi per un passato
che non puoi cambiare, invece di prendere tutto il bene che il presente ti
offre." ()

ti riposto il link cosě puoi controllare anche tu se vuoi...
http://www.mrfantasy.it/web/pagina.php?name=cerca
mi da sempre ASC come ordine
sembra che il problema sia qui:
f.orderType.value=="ASC"?"DESC":"ASC";
ma non ho abbastanza competenze per poterlo dire

 ma non ho abbastanza competenze per poterlo dire
Questo e' l'operatore ternario, lo stesso che hai usato in PHP per
impostare le variabili $type.


 impostare le variabili $type.
si, lo avevo riconosciuto ma credevo che dipendeva da qualcosa al suo
interno...
Non capisco... logicamente tutto fila... come posso controllare meglio che
non ci siano errori?

Ho trovato l'errore:
tu hai scritto:
if (campo!=f.ordine.value){
io ho provato (del tutto empiricamente:-)
if (campo!==f.ordine.value){
adesso tutto funziona...
Grazie mille per l'aiuto

 non ci siano errori?
Facendoti stampare un po' di alert (lato javascript) e echo (lato php) con
i valori dei vari step.
-- 
C'ya,
  ZER0 :: coder.gfxer.webDesigner();
"When you have eliminated the impossible, whatever remains,


 if (campo!==f.ordine.value)
E difatti non ha senso.
Hai fatto una "strict not equal" (vedasi reference di Javascript su
http://devedge.netscape.com
), temo che l'errore sia altrove e che questa
condizione ti restituisca sempre true o false, vanificando cosi'
l'ordinamento per colonna, ma alternandolo a tutte le colonne.
Infatti, nel tuo particolare caso, il not equal ed il not strict equal si
equivarrebbero. Il fatto che non sia cosi', e' dato da un anomalia nel tuo
codice (come se i due valori non fossero dello stesso tipo).
Purtroppo adesso sono di corsa, e non posso testare.
Fatti un alert per verificare in che blocco entra, e verifica che le
condizioni siano sempre corrette (insomma, un po' di debugging).


ho testato i vari casi e tutto funziona come deve:
se clicco artista mida artista asc
se riclicco artista mi da artista desc
se invece clicco un'altra colonna da artista asc passa a titolo asc per
esempio
in pratica non alterna semplicemente asc e desc ma si adegua alla colonna...

 ho testato i vari casi e tutto funziona come deve:
Ma hai letto cos'e' che ti ho scritto, nell'ultimo post, ed hai dato
un'occhiata alla reference? Hai capito che non ha senso quel che hai
scritto?
La prima soluzione plausibile, e' che prima si trattava di pagine cachate. 
Altrimenti, e se fai prove stand alone o dai un occhio alla reference,
vedrai anche da solo che non vi e' alcuna differenza nel tuo contesto tra
lo scrivere il not equal o lo strict not equal.
Eventualmente se mi puoi mandare la pagina PHP cerco di capire io dove sta
l'anomalia del tuo codice (nn e' necessario che faccia fisicamente la
query, basta che outputti l'SQL statement a video per vedere che ha
effettivamente switchato da ASC a DESC).
Anche perche' se si trattasse di un bug di un browser o di uno script
engine, e' utile saperlo.
-- 
C'ya,
  ZER0 :: coder.gfxer.webDesigner();
"When you have eliminated the impossible, whatever remains,
