Newsgroup: it.comp.lang.javascript
Titolo: Passaggio variabili

Salve
e' ormai da tempo che cerco in lungo e in largo nella rete come fare a
passare piu' variabili/informazioni da una pagina ad un'altra in tempi
diversi pero', fino ad adesso, non ho trovato nulla (o forse sono io
che non capisco nulla :-) )
Vi faccio un esempio di quello che vorrei fare :
- pagina divisa in due frame
- nel frame di sinistra ci sono vari tipi di frutta (pere, mele,
banane, etc...) e varie azioni (compro, vendo, mangio, etc...)
- cliccando su un frutto o su una azione il valore deve essere passato
al frame di destra che cosi' la puo' usare. al momento non e' previsto
l'uso di drop down list o di listbox per puri motivi estetici e poi
anche perche' i valori selezionabili sono molto pochi
- dato che non e' possibile cliccare sull'azione e sul frutto in
contemporanea avrei bisogno che il frame di destra ricordasse i valori
passati precedentemente. Pertanto, quando clicco su 'mele' il frame di
destra dovrebbe dire "cosa ci faccio con le mele ?" e non appena
clicco sull'azione dovrebbe usare entrambe le risposte e dire "vendo
mele". Se poi clicco su un altro frutto ecco che dovrebbe combinare il
nuovo frutto con la vecchia azione e cosi' via.
In altre parole, a sinistra ho alcuni valori selezionabili che devo
passare al frame di destra il quale a sua volta (in php) manda la
query al database. 
Avendo a disposizione solo il frutto posso estrarre tutti i record che
si riferiscono a quel frutto ma come fare se volessi solo i record che
parlano di banane comprate ?
nota : uso PHP4 dove le variabili globali sono disabilitate di
default. Se le abilito risolvo ? Creo poi dei casini a livello di
sicurezza ?
Grazie, saluti

 sicurezza ?
Ci sono diversi modi di risolvere il tuo problema (uso di frame 
appunto, cookie, querystring, post di dati, etc), vediamo di capire 
quale fa al caso tuo.
-- 
C'ya,
  ZER0 :: coder.gfxer.webDesigner();
"When you have eliminated the impossible, whatever remains,
however improbable, must be the truth." (S.H.)

querystring
Mi manca anche questa. Continuo a leggere il manuale :-))
Tks, ciao

 :-))
...per dover di storia... ben prima: MANIAC MANSION.
Due ps per fanaticinostalgici:
- forse pero' con Monkey Island avevano inaugurato il primo IMUSE?
- ho letto poco tempo fa che qualcuno ben piu' fanaticonostalgico di chi 
sta ancora leggendo stava per partorire una versione moderna di Zak 
McCracken

 - forse pero' con Monkey Island avevano inaugurato il primo IMUSE?
Mi pare anche a me.


 OK, ma come passo le variabili ?
Giusto per non andare troppo OT (visto che abbiamo parlato solo di PHP 
:P ), tra i frame in javascript le variabili possono essere passate 
normalmente.
Se nella pagina del frame "A" (dove "A" e' il nome) hai tale variabile:
var oggetto="banana";
dalla pagina del frame B, *lato client*, puoi accedere cosi' facendo:
alert(top.frames["A"].oggetto);
Credo che nel tuo caso, ignorando ampiamente qual'e' tutto il contesto, 
ma basandomi solo su cio' che mi dici, la cosa piu' veloce e semplice 
da fare sia che il frame A passi in querystring cio' che gli serve. 
Esempio:
frame A
<script>
	var currObject="",currAction="";
	function doRequest(szObj,szAction){
		currObject=szObj;
		currAction=szAction||currAction;
		top.frames["B"].location.href="pagina.php?
oggetto="+currObject+"&azione="+currAction;
	}
</script>
<a href="#" onclick="doRequest('banane');return false">banane</a>
<a href="#" onclick="doRequest('pesche');return false">pesche</a>
e
<a href="#" onclick="doRequest(currObject,'compro');return false">
compro</a>
<a href="#" onclick="doRequest(currObject,'vendo');return false">vendo
</a>
Non e' certo il modo migliore per fare un discorso del genere, ma e' 
alla fine cio' che hai chiesto e quindi credo che possa esserti utile 
quanto meno a fine "didattico", eventualmente una volta appresi questi 
concetti puoi cercare di migliorarli.
In sintesi il discorso e': Il frame A non cambia mai, resta sempre alla 
solita pagina.
Il frame B, e' quello che invece elabora i dati, e cambia ad ogni 
click, richiamando la pagina "pagina.php" con i seguenti parametri: 
"oggetto" e "azione".
I casi che dovrai poi gestire in PHP, sono:
ho un oggetto, ma non ho un azione.
non ho un oggetto, ma ho un azione.
ho un oggetto e un azione.
Il primo caso lo si ha se i click avvengono solo sugli oggetti.
Il secondo caso lo si ha se i click avvengono solo sulle azioni.
Mentre l'ultimo lo si ha dopo aver cliccato prima su uno e poi 
sull'altro, indifferentemente.
Se clicco su banane,  e poi su compra, alla pagina php arriva "compra 
banane", se poi clicco su "vendi" mi arriva "vendi banane", e se dopo 
scelgo "pesche" avro' "vendi pesche".
Se si vuol azzerare il tutto, a parte fare un refresh del primo frame 
;) basta portare a stringa vuota le due variabili:
<a href="#" onclick="currObject='';return false;">Resetta memoria 
oggetto</a>
<a href="#" onclick="currAction='';return false;">Resetta memoria 
azione</a>
<a href="#" onclick="currObject='';currAction='';return false;">Resetta 
memoria oggetto e azione</a>
Tutto questo dovrebbe funzionare, l'ho scritto al volo e stamani sono 
un po' assonnato, quindi in caso fammi sapere.


> >hai pero' gli array $_POST,$_GET
Alla fine mi sono buttato sul $_POST e funzionerebbe se non fosse che
il frame principale non riesce a vedere tutte le variabili. Mi spiego
meglio :
- la finestra e' divisa in tre frame :
  - uno verticale sulla sinistra dove ci sono varie voci da
    selezionare (chiamiamolo LEFT). Ecco come il frame crea e manda
    le variabili
    function Chg_Cur(Id)
      {
      document.myform.CurId.value = Id;
      document.myform.submit()
      }
    function Chg_LowLimit(Id)
      {
      document.myform.ExcludeUnder.value = Id;
      document.myform.submit()
      }
    .....
    <form name="myform" method="post" action="OUTR2.php4"
     target="RIGHT_B">
    <input type="hidden" name="CurId" value="">
    <input type="hidden" name="searchw" value="">
    <input type="hidden" name="ExcludeUnder" value="">
     .....
    <tr><td class="menu"
      <a href="javascript:Chg_Cur('USD')">USD</a></td></tr>
    <tr><td><select name="ExcludeUnder" onchange="Chg_LowLimit(this)">
      <option selected value=0>0</option><option value=1>1</option>
      <option value=5>5</option><option value=10>10</option><option 
       value=50>50</option></select></td></tr>
 
  - il frame di destra e' diviso in due frami orizzontali. Quello
    superiore (chiamiamolo RIGHT_T) contiene voci da selezionare e
    quello inferiore (RIGHT_B) e quello che riceve i dati e che poi
    deve andare a fare la query in PHP/MySQL. Al momento nel frame
    superiore ho solo un pulsante di test e il codice e' il seguente :
    function Chg_Sw(id)
      {
      document.myform.searchw.value=id;
      document.myform.submit()
      }
    .....
    <form name="myform" method="post" action="OUTR2.php4"
     target="RIGHT_B">
    <input type="hidden" name="CurId">
    <input type="hidden" name="searchw">
    <input type="hidden" name="ExcludeUnder">
    <table border=0>
    <tr><td><input type="text" name="searchw">
      <input type="button" onclick="Chg_Sw(this)" value=" Go ">
      </tr></td></table>
  - Il frame che riceve i dati e' tutto in PHP ed all'inizio ho i
    seguenti comandi :
    $CurId = $_POST['CurId'];
    $Cli_code_param = $_POST['searchw'];
    $ExcludeUnder = $_POST['ExcludeUnder'];
Se clicco sul frame di sinistra (ad esempio sul currency o sul limite
minimo) il frame che riceve i dati me li mostra immediatamente. Se poi
vado nel frame RIGHT_T ed inserisco una parola questa viene passata al
frame 'dati' il quale pero' non mostra piu' le veriabili create dal
frame di sinistra.
In sostanza, ogni volta che passo dal frame di sinistra al quello a
destra in alto perdo la visibilita' sulle variabili create dall'altro
frame (le variabili non sono perse in quanto se ritorno sul frame
precedente vedo che hanno mantenuto i valori)
A naso direi che il problema e' dovuto all'uso di
document.myform.etc... pero' non ho capito con cosa sostituirlo
Grz, ciao

 precedente vedo che hanno mantenuto i valori)
Si, ma ti dimentiche di passarle alla pagina successiva, per quello non 
ci sono.


Era la piu' semplice.
Si' pero' l'avevo messa da parte in quanto pensavo che la querystring
fosse visibile (ed e' una cosa che non mi piace per nulla) e anche
perche' ho paura che mi vengano delle querystring molto lunghe. C'e'
un limite nella lunghezza ?
Adesso l'ho ripresa in mano ed in effetti e' la soluzione piu'
semplice anche c'e' ancora qualche problema quando si usano certi
elementi del form.
Problema 1 : usando il select non riesco a leggere il valore della
variabile. La alert(Id) mi mostra quello che ho selezionato nel form
pero' la variabile ExcludeUnder rimane vuota. Come mai ?
function Chg_LowLimit(Id)
{
document.myform.ExcludeUnder.value = Id;
alert(Id);
alert(ExcludeUnder);
top.frames("R2").location.href="OUTR2.php4?OrgId="+OrgId+"&CurId="+CurId+"&ExcludeUnder="+ExcludeUnder+"&searchw="+searchw
}
<td><select name="ExcludeUnder" onchange="Chg_LowLimit(this.value)">
<option selected value=0>0</option><option value=1>1</option>
<option value=5>5</option><option value=10>10</option>
</option></select></td></tr>
---------------------------------------------
Problema 2 : la alert(Id) mostra [object] e quando visualizzo la
variabile searchw mostra "Go" (il valore del pulsante) invece di
quello che ho scritto nella casella di testo
<html>
<head><title></title>
<SCRIPT language=javascript>
function Chg_Sw(Id)
{
alert(Id);
document.myform.searchw.value=Id.value;
top.frames["R2"].location.href="OUTR2.php4?OrgId="+OrgId+"&CurId="+CurId+"&ExcludeUnder="+ExcludeUnder+"&searchw="+searchw
}
</SCRIPT>
</head>
<body>
<form name="myform" method="post" action="OUTR2.php4" target="R2">
<input type="hidden" name="OrgId">
<input type="hidden" name="CurId">
<input type="hidden" name="searchw" = "aaa">
<input type="hidden" name="ExcludeUnder">
<table border=0>
<tr><td><input type="text" name="searchw">
<input type="button" onclick="Chg_Sw(this)" value=" Go "></td></tr>
</table>
</form>
</body>
</html>
----------------------------------------------
Problema 3 : Quando clicco su un elemento del frame di sinistra
(esempio ExcludeUnder) il frame principale che riceve le variabili
subito si attiva e me le mostra. Questo non succede quando vado nel
frame superiore dove seleziono la parola da cercare (vedi sorgente nel
problema 2)
----------------------------------------------
Problema 4 : faccio l'input nel form del frame superiore (vedi
problema 2), seleziono una voce nel form di sx e il principale mostra
entrambi i valori (anche se uno e' sbagliato, vedi problema 3). Se poi
seleziono un altro valore nel form di sx la variabile creata dal form
superiore viene cancellata (undefined). Come puo' essere ?
E se mi mettesi ad usare le sessioni in PHP per memorizzare le
variabili ? A questo punto l'unico problema sarebbe risvegliare il
frame principale in modo che legga i nuovi valori di ricerca e crei
quindi il nuovo report ma questo potreu farlo con il JS.
Che ne pensi ?
Grz, ciso