Eecuzione di javascript in ciclo foreach php.

inftecnica

Nuovo Utente
25 Ott 2020
5
0
1
Buongiorno

Non riesco ad eseguire un controllo javascript all'interno di un ciclo foreach php.
In pratica devo modificare un contatore allo scadere di un tempo prefissato.
Ho questo codice:

PHP:
<tbody>

<?php foreach ($this->items as $item): ?>

<tr>

<?php

// ricavo valore ora
$hh = date('H', strtotime($item->date));
// ricavo valore minuti
$mm = date('i', strtotime($item->date));
// trasformo tutto in minuti
$ini = ($hh*60 + $mm);
// stampo i minuti per verifica
echo $ini;
 ?>

<td>

<script type="text/javascript"> 

function aggiorna() {

    var ini = <?php echo $ini ?>;    // inizializzo la variabile php in javascript

    var hour = new Date().getHours() ;    // ricavo ora corrente

    var min = new Date().getMinutes();    // ricavo minuti correnti

    var start = (hour*60 ) + (min + 2);    // predispongo il cambio con due minuti di anticipo

    if (start >= ini) {   //definisco quando far partire il cambio

        document.getElementById("cambio").innerHTML = "Coming Soon!";   

    }

}

    setInterval("aggiorna()", 1000);

</script>

<div id ="cambio">

    <div id="countdown_dashboard">

        <div uk-countdown="date: <?php echo  date("Y-m-d") . "T". date('H:i:s', strtotime($item->date));?>">

            <span class=" uk-countdown-hours"></span>

            <span>:</span>

            <span class=" uk-countdown-minutes"></span>

            <span>:</span>

            <span class="uk-countdown-seconds"></span>

        </div>

    </div>

</div>

</td>

</tr>

<?php endforeach; ?>

</tbody>
Il codice di per se funziona solo che mi rende i valori del solo l'ultimo record saltando quelli precedenti e visualizza il risultato nel primo record.
Se serve posso indicare il sito ove gira.

Grazie a chi vorrà aiutarmi a capire dove sbaglio.
 

Tommy03

Utente Attivo
6 Giu 2018
507
50
28
17
Bassano del Grappa (VI)
Il div con id=cambio è dentro un loop, quindi nel codice sorgente lo vedrai comparire più volte, e questo è sbagliato perche non possono esserci più elementi in una pagina con lo stesso id. Infatti il "Coming sono" lo visualizziamo solo nel primo elemento perche essendo id tutti uguali, gli altri non li considera.
Per risolvere secondo me potresti mettere una variabile numerica che si incrementa con il foreach, e chiamare il div con id=cambio_$variabile, così da poterlo richiamare nel JavaScript
 

inftecnica

Nuovo Utente
25 Ott 2020
5
0
1
Grazie, mi hai fatto ricordare che in una situazione simile avevo fatto proprio come hai suggerito. A volte le soluzioni sono a portata di mano e anche gia percorse ma non riusciamo a vederle.
 

inftecnica

Nuovo Utente
25 Ott 2020
5
0
1
Comunque stranamente anche cambiando l'id ad ogni ciclo ottengo che il cambio, questa volta avviene solo correttamente nell'ultimo record.
Questa la parte del codice modificato:
PHP:
<?php foreach ($this->items as $item): ?>
<tr>
<td>   
<?php
$Minutes = $item->duration;
// ricavo valore ora
$hi = date('H', strtotime($item->date));
// ricavo valore minuti
$mi = date('i', strtotime($item->date));
// trasformo tutto in minuti
$ini = ($hi*60 + $mi);
// stampo i minuti di inizio per verifica
//echo $ini . " ";
 ?>
<div id ="<?php echo $d ?>">   
    <div uk-countdown="date: <?php echo  date("Y-m-d") . "T". date('H:i:s', strtotime($item->date));?>">
        <span class=" uk-countdown-hours"></span>
        <span>:</span>
        <span class=" uk-countdown-minutes"></span>
        <span>:</span>
        <span class="uk-countdown-seconds"></span>
    </div>
</div>
</td>
<script type="text/javascript"> 
function aggiorna() {
    var ini = <?php echo $ini ?>;    // inizializzo la variabile php in javascript
    var hour = new Date().getHours() ;    // ricavo ora corrente
    var min = new Date().getMinutes();    // ricavo minuti correnti
    var start = (hour*60 ) + (min);    // trasformo in minuti
    if (start >= ini) {   //definisco quando far partire il cambio
        document.getElementById("<?php echo $d ?>").innerHTML = "Lezione Iniziata!";   
    }
}
    setInterval("aggiorna()", 1000);
</script>
</tr>
<?php endforeach; ?>
 

inftecnica

Nuovo Utente
25 Ott 2020
5
0
1
Sì scusa nel codice mancava la riga

PHP:
$d = 'div' . $item->id;
Che viene incrementato dal valore dell'id del record.

puoi vederlo a sviluppo.infotecnica.eu
 

inftecnica

Nuovo Utente
25 Ott 2020
5
0
1
E invece era proprio quella, non so come ringraziarti. Metto a disposizione l'applicazione appena la finisco (gestione orario lezioni, componente per joomla) per chi dovesse servire.