- Home
- Categorie
- Coding e Sistemistica
- PHP
- sito dinamico
-
Ho trovato in giro un bel codice in javascript che mi permettesse di avere un campo data scelta da un calendario.
Il mio problema è che ho più campi di questo genere nello stesso form e che per le date in cima del form il calendario viene mostrato quasi affianco al suo bottone ma invece per le date in fondo al form il calendario viene ancora mostrato in cima e mi tocca scrollare la pagina (molto poco elegante).
[PHP]
/INIZIO CODICE in javascript PER FORM CALENDARIO/
var source;
var tipo;
var campi = new Array();
function cal(val, e, t) {
var dt = new Array();
xPos = (document.layers) ? e.pageX : ((document.all) ? event.x : e.clientX);
yPos = (document.layers) ? e.pageY : ((document.all) ? event.y : e.clientY);
tipo = t;
source = val;
if (t == 0) {
dt[0] = val[0].value;
dt[1] = val[1].value;
dt[2] = val[2].value;
}
else
dt = val.value.split('-');
showCalendar(new Date(dt[2], dt[1] - 1, dt[0]), xPos, yPos);
}
/FINE CODICE PER FORM CALENDARIO/
[/PHP]
[PHP]//esempio di codice di un campo richiamante il calendario
<tr><td class="td_form_sx">Data di rilevazione</td>
<td align="right">
<input type="text" name="datacompleta1" style="width:230px" maxlength="10" value="<?php echo $data_rilevazione;?>">
<input type="button" name="go1" value="V" onMouseDown="cal(datacompleta1, event, 1)"></td>
</tr>
[/PHP]
e quest'ultimo file ax_data.js e quello che richiama e costruisce il calendario
[PHP]
var xwidth = 220;
var xheight = 180;
var browser = document.layers ? 0 : document.all ? 1 : 2;// colori
var backtable = '#999999';//#90C0FF
var calendback = '#CCCCCC';//#DDDDBB
var lines = '#404040';//#404040
var bright = '#000000';//#000000
var festa = '#FF0000';//#FD9139
// ------ Non cambiare ----------
var mesi = new Array('Gennaio', 'Febbraio', 'Marzo', 'Aprile', 'Maggio', 'Giugno',
'Luglio', 'Agosto', 'Settembre', 'Ottobre', 'Novembre', 'Dicembre');
var days = new Array('Lu', 'Ma', 'Me', 'Gi', 'Ve', 'Sa', 'Do');
var dd = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
var today = new Date();
var anno = today.getFullYear();
var mese = today.getMonth();
var currday = today.getDate();
var cellwidth = Math.floor(xwidth / 7);
xwidth = cellwidth * 7;
var xmese = 0;
var aboutx = false;
var isOn = false;function action(g, m , a) {
function format(x) {
return x > 9 ? x : "0" + x;
}
getId().showIt(false);
if (tipo == 0) {
source[0].value = format(g);
source[1].value = format(m + 1);
source[2].value = a;
}
else
source.value = format(g) + '-' + format(m + 1) + '-' + a;
}
document.write('<style type="text/css">\n<!--');
document.write('.cal { font-family: Arial, Helvetica, sans-serif; font-size: 10px; font-weight: bold; color: #000099}');
document.write('.num { font-family: Arial, Helvetica, sans-serif; font-size: 12px; text-decoration:none}');
document.write('.mese { font-family: Arial, Helvetica, sans-serif; font-size: 14px; font-weight: bold; color: #663300}');
document.write('.butt { font-family: Arial, Helvetica, sans-serif; font-size: 10px}');
document.write('-->\n</style>');function comparedate(d1, d2) {
if (d1.getFullYear() == d2.getFullYear() && d1.getMonth() == d2.getMonth() && d1.getDate() == d2.getDate())
return true;
return false;
}
function pasqua(aa) {
var xx = new Array(22, 22, 23, 23, 24, 24);
var yy = new Array(2, 2, 3, 4, 5, 5);
var a = aa % 19;
var b = aa % 4;
var c = aa % 7;
var i = Math.floor(aa / 100) - 15;
var x = xx*, y = yy*;
var d = (19a + x) % 30;
var e = (2b + 4*c + 6 * d + y) % 7;
var p = 22 + d + e;
var m = 300;
if (p > 31) {
m = 400;
p = p - 31;
}
return m + p;
}function isfesta(d) {
var feste = new Array(0, 101, 106, 425, 501, 602, 815, 1101, 1208, 1225, 1226);
if (d.getDay() == 0)
return true;
var pp = pasqua(d.getFullYear()) + 1; // Pasquetta
if (pp % 100 > 31)
pp = 401;
feste[0] = pp;
for (var i = 0; i < feste.length; i++)
if (Math.floor(feste* / 100) == d.getMonth() + 1) {
var gg = feste* % 100;
if (gg == d.getDate())
return true;
}
return false;
}function calendar(currday, mese, anno) {
var dx = 2 - (new Date(anno, mese, 1)).getDay();
if (dx == 2)
dx = -5;
var daysInMonth = dd[mese];
if (mese == 1) {
if (anno % 4 == 0 && anno % 100 != 0 || anno % 400 == 0)
daysInMonth++
}
var tx = '<div class="mese"> ' + mesi[mese] + ' ' + anno +'</div>\n';
tx += '<table width="' + xwidth + '" border="0" cellspacing="1" cellpadding="1">\n';
tx += '<tr align="right">\n';
for (var i = 0; i < 7; i++)
tx += '<td width="' + cellwidth+ '" class="cal">' + days* + ' </td>\n';
tx += '</tr>\n';
for (var j = 0; j < 6; j++) {
tx += '<tr bgcolor="' + calendback + '" align="right">\n';
for (var i = 0; i < 7; i++) {
var bgstring = "";
var fgcol = lines;
var fgstring = ' ';
if (dx > 0 && dx <= daysInMonth) {
fgstring = dx;
var ddx = new Date(anno, mese, dx);
if (isfesta(ddx)) {
bgstring = ' bgcolor="' + festa + '"';
}
if (comparedate(ddx, today)) {
fgcol = bright;
fgstring = '<b><u>' + dx + '</u></b>\n';
}
var tempdate = ddx.getDate() + ", " + ddx.getMonth() + ", " + ddx.getFullYear();
fgstring = '<a href="javascript:action(' + tempdate + ')" class = "num"><font color="' + fgcol + '">' + fgstring + '</font></a>\n';
}
tx += '<td width="' + cellwidth + '" class="num"' + bgstring + '>\n';
tx += fgstring;
tx += '</td>\n';
dx++;
}
tx += '</tr>\n';
}
tx += '</table>\n';
return tx;
}function dataframe(x) {
var s = '<table width="' + xwidth + '" border="1" cellspacing="0" cellpadding="0" bgcolor="' + backtable + '">';
s += '<tr>\n<td class="mese" valign="middle">';
s += x; // calendar(currday, mese, anno);s += '</td></tr><tr><td>';
s += '<form class="butt"><table width="100%" border="0" cellspacing="0" cellpadding="2">';
s += '<tr>';
s += '<td></td>';
s += '<td align="right"><input type="button" name="prev" value=" - " class="butt" onclick="altro_mese(-1)">';
s += '<input type="button" name="current" value="Default" class="butt" onclick="altro_mese(9)">';
s += '<input type="button" name="next" value=" + " class="butt" onclick="altro_mese(1)"></td>';
s += '</tr></form></table>';
s += '</td>\n</tr>\n</table>';
return s;
}function altro_mese(x) {
xmese += x;
if (x == 9)
xmese = 0;
var xday = (xmese == 0)? currday : 99;
var mm = (mese + xmese) % 12;
while (mm < 0)
mm += 12;
var s = dataframe(calendar(xday, mm, anno + Math.floor((mese + xmese) / 12)));
writeLayer(s);
aboutx = false;
}
function getId() {
switch (browser) {
case 0:
return document.layers.calframe;
case 1:
return eval('calframe');
case 2:
return document.getElementById("calframe");
}
}function moveLayer(xPos, yPos) {
switch (browser) {
case 0:
this.left = xPos+50;
this.top = yPos;
break;
case 1:
this.style.pixelLeft = xPos+50;
this.style.pixelTop = yPos;
break;
default:
this.style.left = xPos+50;
this.style.top = yPos;
}
}function createlayer() {
var s;
if (document.layers)
s = '<layer id="calframe" visibility="hide" z-index=1>';
else
s = '<div id="calframe" style="position:absolute; visibility: hidden">';
if (document.layers)
s += '</layer>';
else
s += '</div>';
document.writeln(s);
}function showIt(on) {
isOn = on;
if (browser)
this.style.visibility = (on) ? "visible" : "hidden";
else
this.visibility = (on) ? "show" : "hide"
}function writeLayer(s) {
var id = getId();
if (browser)
id.innerHTML = s;
else {
id.document.open();
id.document.write(s);
id.document.close();
}
}
function init() {
var id = getId();
id.moveLayer = moveLayer;
id.showIt = showIt;
id.showIt(false);
}function showCalendar(d, xpos, ypos) {
if (!isOn) {if (d) {
anno = d.getFullYear();
mese = d.getMonth();
currday = d.getDate();
} else {
anno = today.getFullYear();
mese = today.getMonth();
currday = today.getDate();
}
if (arguments.length > 2) {
var id = getId();
id.moveLayer(xpos, ypos);
}
else
getId().moveLayer(100, 100);
xmese = 0;
writeLayer(dataframe(calendar(currday, mese, anno)));}
getId().showIt(!isOn);
}createlayer(1);
onload = init;
[/PHP]
Tutto funziona benissimo ma volevo sapere se qualcuno mi sa indicare come modificare questo codice affinchè il calendario venga visualizzato affienco al bottone premuto.P.S. Io devo utilizzare IExplorer
Grazie
-
Devi cercare dove viene impostata la posizione del layer...
Nello statico vedo un class="td_form_sx". Puoi iniziare controllando la classe td_form_sx che fa... se dovesse posizonarlo sei a cavallo perchè ti basta creare una classe tipo .td_form_dx e metterlo altrove...
Altrimenti c'è una caterva di codice html creato nella comunicazione asincrona con ajax
Questa porzione è molto indiziata:
function moveLayer(xPos, yPos) {
switch (browser) {
case 0:
this.left = xPos+50;
this.top = yPos;
break;
case 1:
this.style.pixelLeft = xPos+50;
this.style.pixelTop = yPos;
break;
default:
this.style.left = xPos+50;
this.style.top = yPos;
}
}
-
grazie per la risposta veloce ma td_form_sx l'ho creata io per formattare il campo ma non condiziona il calendario mentre anch'io ho trovato quel codice e l'ho modificato con quei +50 che me mi distanziano più a destra il calendario.
Quello che non capisco è perchè xpos e ypos non prendono la posizione del bottone cliccato oppure non capisco perchè posiziona il calendario sempre in alto
-
Li definisce qui:
xPos = (document.layers) ? e.pageX : ((document.all) ? event.x : e.clientX);
yPos = (document.layers) ? e.pageY : ((document.all) ? event.y : e.clientY);e.pageX / event.x / e.clientX sono le posizioni dove avviene un evento... in pratica lui parte dal punto in cui avviene l'evento... la chiave sta lì...
keiske
-
ci sono ho capito anch'io che è questa la parte di codice di interesse infatti il calendario si sposta sulla pagina ma se clikko su l'ultimo campo della data il calendario compare in cima e questo secondo le coordinate è un assurdo.
Chi mi sa aiutare?:?:?:?
-
Prova temporaneamente a mettere
xPos = 200;
yPos = 200;E vedi come si comporta...
keiske
-
seguendo il tuo consiglio il calendario viene sempre mostrato nella stessa posizione cioè alle coordinate x=200 e y=200
-
Almeno abbiamo capito che è lì la chiave di tutto... adesso bisogna capire perchè (document.layers) ? e.pageX : ((document.all) ? event.x : e.clientX); non ti cattura la coordinata dove avviene l'evento del mouse... controlla in rete le sintassi di "e.pageX, event.x e e.clientX
Suppongo che dipenda dai browser... non è che c'è modo di accedere con DOM?
Prova così:
xPos = event.clientX;
yPos = event.clientY;
-
come mi dici tu scende un po' ma il risultato non è ancora accettabile però leggevo qua e la che:
document.layers indicava il vecchio DOM di Netscape Navigator fino alla versione 4.
document.all indicava il vecchio DOM di Internet Explorer fino alla versione 4 (ma il vecchio DOM è ancora supportato anche all'interno della versione 6)
document.getElementById indica il DOM secondo gli standard del W3C e contraddistingue tutti i browser moderni, compresi Netscape 6 o superiori, Internet Explorer 5 o superiori e molti altri browser (FireFox, Opera, Safari, eccetera)
In pratica document.layers e document.all appartengono al passato.
Oggi devi usare sempre document.getElementById o sintassi secondo gli standard W3C.Io lavoro su internet explorer 7 e dove invece dovrò implementare il codice ha internet explorer 6
-
scusa, mi fai uno screenshot del mouse sul bottone che ha appena cliccato ed è comparso il layer?
Nel tuo caso non usi getElementById, o meglio... vuoi svincolarti dall'evento del mouse?
onclick="document.getElementById('id_del_layer').style.cssText = 'visibility:visible;top:XXpx;left:XXpx'"
A quell'id applichi una classe staticamente che definisce "position:absolute;visibility:hidden" e le cose fisse
In questo modo al click del mouse il layer diventa visibile e si "piazza" dove dici tu e per ogni bottone puoi individuare dove lo vuoi... (ci sono modi più belli esteticamente a livello di codice, ma non conosco bene la tua pagina)
keiske
keiske
-
allora i cerchi rossi indicano i vari campi che richiamano il calendario e nel caso dei bottoni in alto il calendario compare in una posizione accettabile mentre nel caso dei bottoni in basso il calendario non scende di molto e cmq rimane visualizzato sempre troppo in alto e mi tocca scrollare la pagina.
-
ma il calendario che appare è sempre lui? O cambia a seconda del bottone che premi? Lo facevi un po' più piccolo lo screenshot e mi serviva un microscopio elettronico
keiske
-
scusami ma non sono stato io a farlo piccolo ma le restrizioni degli allegati del forum ma cmq si è sempre lo stesso calendario
-
ho messo questo codice
[PHP]alert(xPos+","+yPos);[/PHP]
nella funzione che richiama il calendario dopo le famosissime variabili xPos e yPos ed ho cliccato su tutti i bottoni partendo dall'alto in giù ed ho avuto i seguenti risultati:
685,199
685,230
685,93
685,151
685,208
questo mi dimostra che essendo i primi due bottoni in una tabella ed i restanti bottoni in un'altra tabella il calendario elabora le posizioni relative e non quelle assolute della pagina.
Mo' che faccio?
-
Allora perchè scusa non usi il sistema che ho detto prima, magari perfezionandolo?
imposta il div del calendario tutto per benino... poi dagli "position:relative;left:10px;top:10px;visibility:hidden"
Poi assegna ai bottoni sull'evento onclick di dare visibilità al layer che teoricamente dovrebbe apparire 10 pixel a sinistra e 10 sopra rispetto all'elemento bottone (il div è "relativo")... almeno io ho gli aiuti in linea e li faccio così... appaiono un po' spostati con "relazione" al link... però io di fianco ad ogni "link" di aiuto metto il codice che richiama il layer (ma lo stile è nel css per tutti i layer)
keiske
edit: controlla se il "div" è impostato relativo o assoluto, oppure prova a usare il float
-
forse ho trovato questo codice che mi ha chiarito un po' le idee
[PHP]
<script>
function test()
{
if (document.layers) getMouseLoc; //NS
else if (document.all) getMouseLoc(); //IE
alert(mouseLocation.x+","+mouseLocation.y);
}function Point(x,y) { this.x = x; this.y = y; }
mouseLocation = new Point(-500,-500);
function getMouseLoc(e)
{
if(!document.all) //NS
{
mouseLocation.x = e.pageX;
mouseLocation.y = e.pageY;
}
else //IE
{
mouseLocation.x = event.x + document.body.scrollLeft;
mouseLocation.y = event.y + document.body.scrollTop;
}
return true;
}
if(document.layers){ document.captureEvents(Event.MOUSEMOVE); document.onMouseMove = getMouseLoc; }
</script><a href="#" onClick="test()">ooooooooooooooooooooooooo</a>
[/PHP]
infatti adattandolo un po' cioè scrivendo
[PHP]
xPos = event.x + document.body.scrollLeft;
yPos = event.y + document.body.scrollTop;
[/PHP]
il tutto quasi torna dico quasi perchè viene spostato un pochino più in basso il calendario per i bottoni in alto invece è perfetto per quelli in basso
-
ti ringrazio per l'attenzione.
Alla fine ho risolto così un po' brutale ma funzionante
[PHP]
if(val=='datacompleta1' || val=='datacompleta2'){
xPos = event.x;
yPos = event.y;
}else{
xPos = event.x + document.body.scrollLeft;
yPos = event.y + document.body.scrollTop;
}
[/PHP]
cioè per i bottoni di sopra funziona come sempre ha funzionato per il resto segui le coordinate della pagina.
-
Sì ma allora le funzioni sono condizionate da dove hai messo i bottoni, nel senso che sono dentro blocchi e oggetti inline... magari potresti vedere se la struttura è ottimizzata o se c'è qualche elemento di troppo...
keiske
edit: perfetto
-
avendo un database con una tabella in particolare sulla quale più utenti potrebbero inserire dei dati come posso creare un codice php che mi permetta di non avere collisioni di richieste?
Cioè:come chiave primaria della tebella in questione ho le colonne:
- ID_INS = intero crescente indicante l'inserimento
- DATA_INS = data dell'inserimento
- STATO = indicante la tipologia dello stato (es. INS inserimento,ANN annullato,MOD modificato)
dove il codice creato da me legge il massimo dell'ID_INS e lo incrementa di una unità e così inserisce una nuova riga nella tabella.
Il mio dubbio proviene dal fatto che se un utente fa una richiesta di inserimento nella tabella e quindi riceve il massimo dell'ID_INS e quasi contemporaneamente un altro utente ne fa richiesta e li viene associato lo stesso ID_INS perchè il primo non ha ancora registrato allora all'ultimo li verrà negata la richiesta di inserimento perchè esiste già un record con quell'ID_INS.
Chi mi sa dare un consiglio?