Salta al contenuto
  • Categorie
  • Recenti
  • Tag
  • Popolare
  • Utenti
  • Gruppi
Collassa
Logo del marchio
  1. Home
  2. Coding e customizzazione (PHP, HTML, CSS)
  3. [Risolto] Il modulo va bene solo al primo giro

[Risolto] Il modulo va bene solo al primo giro

Pianificato Fissato Bloccato Spostato Coding e customizzazione (PHP, HTML, CSS)
5 Post 2 Autori 49 Visualizzazioni
  • Da Vecchi a Nuovi
  • Da Nuovi a Vecchi
  • Più Voti
Effettua l'accesso per rispondere
Questa discussione è stata eliminata. Solo gli utenti con diritti di gestione possono vederla.
  • K Non in linea
    K Non in linea
    kippo
    scritto su ultima modifica di kippo
    #1

    ciao
    ho scritto un modulo joomla per un sito webradio, è un player che legge i file da una cartella e li riproduce
    questo player ha un pulsante di accensione/spegnimento della radio; il problema è questo:
    premo on e tutto ok: la radio canta
    premo off, ok: la radio si ferma
    a questo punto se premo di nuovo on la radio canta ma con risultati imprevedibili: salta le canzoni o le ripete più volte.
    dando un'occhiata con firebug vedo che il flusso del programma non è più regolare ma sembra impazzito da lì ovviamente gli errori
    in pratica funziona bene solo la prima volta, infatti se dopo lo stop ricarico la pagina tutto procede bene
    questo è il modulo

    <?php
    function writemusic ($path) {
    	$dir='Unknown';
    	$arr=[];
    	foreach (new DirectoryIterator($path) as $fileInfo) {
    		if ($fileInfo->isDot()) continue;
    		if ($fileInfo->isDir()) {
    			$dir1=$fileInfo->getFilename();
    			foreach (new DirectoryIterator($path.$dir1.DIRECTORY_SEPARATOR) as $fileInfo) {
    				if ($fileInfo->isDot()) continue;
    				if ($fileInfo->getFilename() != '') {
    					array_push($arr, $dir1.'~'.$fileInfo->getFilename());
    				}
    			}
    		}
    		if ($fileInfo->getFilename() != '') {
    			array_push($arr, $dir.'~'.$fileInfo->getFilename());
    		}
    	}
    	$json = json_encode($arr);
    	file_put_contents($path.'music.json', $json);
    }
    
    function getname ($s) {
    	 $a = explode('~', $s);
    	 if ($a[0] == 'Unknown') {
    		$n = $a[1];
    	 } else {
    		$n = $a[0].DIRECTORY_SEPARATOR.$a[1];
    	 }
    	return ($n);
    }
    
    defined('_JEXEC') or die;
    use Joomla\CMS\HTML\HTMLHelper;
    $jpath = JPATH_SITE;
    $jpath = rtrim($jpath, "/\\ \t\n\r\0\x0B");
    $rpath = $params->get('music_folder').DIRECTORY_SEPARATOR;
    $path = $jpath.DIRECTORY_SEPARATOR.$rpath;
    if (!file_exists($path.'music.json')) {
    	writemusic($path);
    }
    $str = file_get_contents($path.'music.json');
    $aaa = json_decode($str,true);
    $arr=[];
    foreach ($aaa as $item) {
    	$name=getname($item);
    	array_push($arr, JUri::root().$rpath.$name);
    }
    $accp = JUri::root().'images'.DIRECTORY_SEPARATOR.'ggg.png';
    $spep = JUri::root().'images'.DIRECTORY_SEPARATOR.'eee.png';
    
    ?>
    <div id="audio-player">
    <div id="audio-info"><div class="scrolltext"><span id="title" class="title"></span>
    </div>
    </div>
    <audio id="rvAudio">
    <source src="">
    </audio>
    
    <div class="volume">
    <label id="vol">Volume   </label>
    <input id="volume" class="volume" type="range" min="0" max="10" value="10">
    </div>
    <button title="Accendi la Vampira" id="autoplay-button"><img id="api" src="<?php echo $accp; ?>"></button>
    
    <script>
    var audioPlayer = document.getElementById("rvAudio");
    var autoplayButton = document.getElementById("autoplay-button");
    var volumeSlider = document.getElementById("volume");
    var track = 0;
    <?php echo "var jjj = ". json_encode($arr) . ";\n";
    echo "var accp = ". json_encode("<img id=\"api\" src=\"$accp\">") . ";\n";
    echo "var spep = ". json_encode("<img id=\"api\" src=\"$spep\">") . ";\n";
    echo "var rp = ". json_encode($rpath) . ";\n";
    echo "var ds = ". json_encode(DIRECTORY_SEPARATOR) . ";\n"; ?>
    var arr=[];
    for (var i=0;i<jjj.length;i++) {arr[i]=i;}
    var ooo=arr.slice();
    var r=-1;
    var l=arr.length;
    var title = '';
    var ars = '';
    var arp = '';
    var ttt = '';
    
    function autoplayTracks() {
    	playTrack();
    	audioPlayer.addEventListener("ended", function() {
    	playTrack();
    	});
    }
    
    function playTrack() {
    	r=Math.floor((Math.random()*l));
    	track = arr[r];
    	arr.splice(r,1);
    	l=arr.length;
    	if (l == 0) {
    		arr=ooo.slice();
    	}
    	audioPlayer.currentTime = 0;
    	audioPlayer.src = jjj[track];
    	title = audioPlayer.src;
    	audioPlayer.play();
    	ars = title.split(ds);
    	arp = rp.split(ds);
    	if (ars[ars.length-2] == arp[arp.length-2]) {
    		title = 'Unknown - ' + ars[ars.length-1];
    	} else {
    		title = ars[ars.length-2] + ' - ' + ars[ars.length-1];
    	}
    	ttt=title.replace(/\.[^/.]+$/, "");
    	ttt=decodeURI(ttt);
    	if (document.getElementById("title") !== null) {
    		document.querySelector('.title').textContent = ttt;
    	}
    }
    
    function stopTrack() {
    	audioPlayer.pause();
    	audioPlayer.currentTime = 0;
    	audioPlayer.src = '';
    }
    
    autoplayButton.addEventListener("click", function() {
    	if (autoplayButton.innerHTML == accp) {
    		autoplayButton.innerHTML = spep;
    		autoplayButton.title = "Spegni la Vampira";
    		arr=ooo.slice();
    		r=-1;
    		l=arr.length;
    		autoplayTracks();
    	} else {
    		autoplayButton.innerHTML = accp;
    		autoplayButton.title = "Accendi la Vampira";
    		stopTrack();
    		location.reload();
    	}
    });
    
    volumeSlider.addEventListener("input", function() {audioPlayer.volume = this.value/10;});
    </script>
    
    

    voglio far notare che il modulo se lanciato da solo funziona perfettamente, è solo quando è integrato con joomla che succede questo
    non so cosa dovrei resettare dopo lo stop.

    In realta' una soluzione l'avrei trovata: basta ricaricare la pagina allo stop ma li' poi c'e' un altro inghippo: per un attimo
    esce fuori l'icona broken img sul bottone on/off. Quindi le domande sono 2:
    1 - perche' joomla si impiccia al secondo giro del modulo?
    2 - come eliminare l'icona broken img in tutto il sito? perche' da dentro il modulo non ha effetto (gia' provato)
    grazie

    ps il modulo ha anche un main chiamante ed un xml ditemi se postare anche' quelli

    1 Risposta Ultima Risposta
    0
    • jabbaJ Online
      jabbaJ Online
      jabba
      scritto su ultima modifica di
      #2

      hai dei sistemi di cache attivi o un qualche plugin che ottimizza / va a toccare i javascript (tipo un plugin di ottimizzazione come jch)?

      Dovrei fare qualche prova più approfondita però forse devi rimuovere e rimettere ogni volta l'event listener "ended" perchè viene aggiunto tutte le volte che clicchi play, e forse manda tutto in confusione perchè crea più istanze. Prova a modificare queste due funzioni:

      function stopTrack() {
          audioPlayer.pause();
          audioPlayer.currentTime = 0;
          audioPlayer.src = '';
          audioPlayer.removeEventListener("ended", playTrack);
      }
      
      
      function autoplayTracks() {
          playTrack();
          audioPlayer.removeEventListener("ended", playTrack);
          audioPlayer.addEventListener("ended", playTrack);
      }
      
      

      Gianluca Gabella - smanettone IT, webbarolo, Joomler per passione - pixed.it

      1 Risposta Ultima Risposta
      0
      • K Non in linea
        K Non in linea
        kippo
        scritto su ultima modifica di
        #3

        grazie mille era proprio addEventListener che faceva casino (in effetti add significa add)
        devo ancora mangiare fagioli e js
        a proposito uno dei 2 remove non e' ridondante?
        bene a sto punto la domanda 2 e' inutile
        ho un'altra curiosita' ma apriro' un altro post
        grazie ancora

        jabbaJ 1 Risposta Ultima Risposta
        0
        • jabbaJ Online
          jabbaJ Online
          jabba
          risposto a kippo su ultima modifica di
          #4

          @kippo ha detto in Il modulo va bene solo al primo giro:

          grazie mille era proprio addEventListener che faceva casino (in effetti add significa add)
          devo ancora mangiare fagioli e js
          a proposito uno dei 2 remove non e' ridondante?
          bene a sto punto la domanda 2 e' inutile
          ho un'altra curiosita' ma apriro' un altro post
          grazie ancora

          si potrebbe essere ridondande, mi dovrei studiare per bene il codice ma farlo così a secco è complesso. Ad ogni modo l'idea è quella di non lasciare e lanciare più EventListener in contemporanea perchè possono crearti delle "code" di eventi che poi vanno a sovrapporsi, spero sia più o meno chiaro 😛

          Gianluca Gabella - smanettone IT, webbarolo, Joomler per passione - pixed.it

          1 Risposta Ultima Risposta
          0
          • K Non in linea
            K Non in linea
            kippo
            scritto su ultima modifica di
            #5

            e' tutto chiarissimo
            grazie ancora

            1 Risposta Ultima Risposta
            1

            • Accedi

            • Non hai un account? Registrati

            • Accedi o registrati per effettuare la ricerca.
            Powered by NodeBB Contributors
            • Primo post
              Ultimo post
            0
            • Categorie
            • Recenti
            • Tag
            • Popolare
            • Utenti
            • Gruppi