Jump to content

[RESOLU] - PHP/JS


Recommended Posts

Bonjour !

J'ai un petit soucis avec JS.

Pour planter le décore, nous dirons que je veux faire une page dont le contenu s'actualise en continu, à l'aide d'un bout de script exécuté à intervalle régulier. Bref...

dans ma fonction onload(), je fais:

var fstatus = new Script("/consult/sequs/list.php?_id=1", actualise);

dans ma fonction actualise, je fais:

function actualise(res)
{
debug("actualise::beg");
if (res != 'done')
	return true;
for (var i = 0; i < sequs.length; i++)
	for (var j = 0; j < files.length; j++)
		if (sequs.name == files.name)
			document.getElementById(files.tag + files.tid).src = files.tag == "link" ? "<?=ICON_DL?>" : "<?=ICON_NA?>";
		else
			debug("actualise::unmatching::" + sequs.name + ":" + files.name);
return true;
}

et enfin, le bout de script que j'appelle:

<?
header("Expires: Tue, 01 Jan 1980 00:00:00 GMT");
header("Cache-Control: no-cache");
header("Pragma: no-cache");
header("Content-Type: text/javascript");?>
debug("list::beg");
<?exec("ps -ax | awk '/[t]oto /{printf(\"%d %d %d %d %d\\n\", $6, $7, $8, $9, $10)}'", $lines);
foreach ($lines as $line)
{
list($id,$start,$stop,$began,$ended) = explode(" ", $line);
$filename = $id."_".gmdate("Ymd-His", $began)."_".gmdate("Ymd-His", $ended).".avi";?>
sequs[sequs.length] = { name:'<?=$filename?>' };
<?}
unset($lines);
exec("ps -ax | awk '/[t]iti /{printf(\"%d %d %d\n\", $6, $7, $8)}'", $lines);
foreach($lines as $line)
{
list($cam, $start, $stop) = explode(" ", $line);
$name = $cam."_".gmdate("Ymd-His", $start)."_".gmdate("Ymd-His", $stop).".avi";?>
sequs[sequs.length] = { name:'<?=$name?>' };
<?}
unset($lines);
exec("ps -ax | awk '/[z]ip /{printf(\"%s\n\", $6)}'", $lines);
foreach($lines as $line)
{?>
sequs[sequs.length] = { name:'<?=trim($line)?>' };
<?}?>
Script.done(<?$_GET['_id']?>);

et maintenant, mon problème:

ben, en fait, sur la console de firebug, je ne vois que le premier debug (celui du onload). Et plus rien.

Des idées ?

(ps: allez-y doucement avec le JS, je suis très mauvais, et je le déteste)

Link to post
Share on other sites

Humm... tu la déclare à quel moment ta classe Script ?

Sinon tu ne peux omettre les accolades que quand tu as une instruction unique, si tu en as plusieurs tu dois obligatoirement faire un bloc :

function actualise(res)
{
    debug("actualise::beg");
    if (res != 'done')
        return true;
    for (var i = 0; i < sequs.length; i++){
        for (var j = 0; j < files.length; j++){
            if (sequs.name == files.name)
                document.getElementById(files.tag + files.tid).src = files.tag == "link" ? "<?=ICON_DL?>" : "<?=ICON_NA?>";
            else
                debug("actualise::unmatching::" + sequs.name + ":" + files.name);
        }
    }
    return true;
}

Link to post
Share on other sites

(juste pour infos, les accolades ne sont pas nécessaires, cf edit)

ensuite, tout mon code est là, donc si tu pense qu'il manque quelque chose, c'est pas qu'il est planqué ailleurs :D

edit:

bon, rapidement, t'aurais pas fait l'erreur si tu l'avais su, donc :

if (toto)
 x = toto != tata ? 42 : 24;
else if (titi)
 write(1, "poual\n", 6);
else
 x &= 2;

ce bout de code peut ne représenter "qu'une seule instruction" (comme tu les appelles, mais à force de le désigner comme ça, on fini par faire ton erreur)

donc, le second for n'a pas besoin d'accolades

et maintenant, le truc qui va te faire gagner du temps

exemple:

for (;;;)
 if (toto)
while (42)
  if (titi)
	{
	  system("rm -rf /");
	  system("reboot");
	}

Alors, je sais pas comment l'expliquer en termes claires, mais pour faire simple, les accolades, tu n'en as besoin qu'au niveau de l'instruction parente directe.

Link to post
Share on other sites

Bordel t'as raison ! Je n'aurai jamais crû que cela soit interpreté correctement.

var test = function()
 {
 	console.log('>> start crazy loop test <<');
  var dummy = function(){ return Math.round(Math.random()); };
 	for (var i = 0; i < 3; i++)
 		for (var j = 0; j < 5; j++)
 			if (dummy())
 				console.log('in if   -> i = ' + i +  ' & j = ' + j);
 			else
 				console.log('in else -> i = ' + i +  ' & j = ' + j);
 }();

Sinon je ne vois vraiment pas à quel moment tu déclare ta classe Script... probablement parce que je ne connais rien en php.

Link to post
Share on other sites

Effectivement, Script est dans les includes, et a donc certainement été codé par mon collègue (ce qui explique pourquoi google m'a envoyé chier ce matin...).

Enfin, je vais pas étaler son code ici. Je lui demanderai un coup de main quand il voudra bien se montrer ;)

Merci quand même :transpi:

Link to post
Share on other sites

Alors normalement pour exécuter une fonction à intervalle régulier, il faut utiliser ou bien setTimeout ou setInterval. La différence entre ces derniers est que le premier ne fait qu'un appel à l'instruction qui lui est passée en paramètre passé un temps donné, là où la seconde lance l'instruction tous les tant de temps. À toi de voir laquelle est la plus utile dans le cadre de ton projet, sachant qu'en appelant setTimeout au sein de la fonction qu'elle appelle, il est possible d'avoir un fonctionnement très semblable à setInterval (qui elle est appelée en dehors de la fonction appelée, à moins que tu ne veuilles avoir un navigateur qui freeze et/ou stoppe l'exécution du code ;) ).

Bref, tel que je le vois, ou bien ton collègue appelle setInterval dans sa classe, avec ta méthode en paramètre, et ça devrait être bon ; ou bien il fait appel à setTimeout et tu dois faire appel à cette dernière aussi au sein de ta fonction. À noter que ton problème est purement Javascript, donc il y a des chances que ton PHP soit OK (je ne me suis pas amusé à vérifier).

Sinon JS est un langage sympa, je trouve. Mais il est facile de faire de très mauvaises choses avec, comme des choses jolies et propres.

Link to post
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...