Visualizzazione risultati 1 fino 22 di 22
Like Tree3Likes
  • 1 Post By mzanella
  • 1 Post By mzanella
  • 1 Post By mzanella

Discussione: controllo pulsante

  1. #1
    inucane non è connesso Utente giovane
    Data registrazione
    21-08-2007
    Messaggi
    36

    Predefinito controllo pulsante

    Aiutami a capire:
    Di default ho due pagine web, una per gli utenti e una per l'admin.
    dove ci sono due immagini di bottoni sulla pagina user è rosso e se cliccato deve diventare verde, il contrario nella pagina admin
    Un'idea potrebbe essere di salvarmii 2 valori "pulsante1" e "pulsante2" ciascuno dei quali può avere valore 0/1
    all'inizio sono così
    pulsante1: 1
    pulsante2: 0
    il che vorrebbe dire: il pulsante1 è verde, il pulsante2 è rosso

    cliccando sul pulsante1 controlli i valori e se sono come te li aspetti, quindi come scritto sopra (1/0), modifichi i valori in
    pulsante1: 0
    pulsante2: 1
    se invece pulsante1 era 0 non fai niente

    ora cliccando sul pulsante2 controlli i valori e se sono come te li aspetti, quindi come scritto qui sopra (0/1), modifichi i valori in
    pulsante1: 1
    pulsante2: 0
    se invece pulsante2 era 0 non fare niente.

    solo che non ne ho idea di come creare lo script. penso devo fare un txt che assuma questi valori al clik su immagine con controlli if ma non ne ho idea sullo script. potete aiutarmi ?

  2. #2
    inucane non è connesso Utente giovane
    Data registrazione
    21-08-2007
    Messaggi
    36

    Predefinito

    nessuna mi aiuta ?

  3. #3
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    I pulsanti delle due pagine sono tra loro collegati? Dalla descrizione sembra di no, dall'esempio sembra di sì...

    Dall'esempio sembra che:
    • i pulsanti 1 e 2 possono essere verdi o rossi
    • se uno è verde, l'altro è rosso, in maniera esclusiva
    • solo il pulsante rosso è cliccabile
    • il click su un pulsante (rosso) inverte i colori (e quindi il comportamento) di entrambi i pulsanti


    Gli ostacoli più ovvi sono mettere in comunicazione i due pulsanti, lo stato condiviso, l'accesso a risorsa condivisa (lo stato, appunto), e le conseguenti race conditions. Non sono problemi da poco, se possibile cerca un sistema alternativo.

    Innanzitutto, non serve a nulla memorizzare la doppia informazione "0-1" per entrambi i pulsanti, dato che i loro colori sono sempre mutualmente esclusivi è sufficiente indicare quale tra i due è rosso (o verde). Evita i file di testo, salva l'informazione in una base di dati, anche con sqlite.

    Hai poi bisogno di una pagina (php, chiamiamola controller.php) che gestisca lo stato condiviso. Questa pagina riceverà delle richieste (probabilmente tramite AJAX) nelle quali si indica quale pulsante è stato cliccato. Questa pagina interrogherà la base di dati per stabilire se il click ricevuto deve modificare lo stato condiviso e, in caso positivo, lo modificherà. In ogni caso invierà una risposta alla pagina richiedente, indicandole il nuovo stato dei pulsanti.

    Oltre a questo, la pagina dovrebbe anche prevedere un meccanismo di lock per evitare race conditions, ma lo farei in un secondo momento...

    Le pagine richiedenti, quelle contenenti i pulsanti 1 e 2 rispettivamente, dovranno effettuare una richiesta AJAX verso la pagina controller.php alla pressione del rispettivo pulsante. Le richieste indicheranno quale pulsante è stato premuto. La pagina richiedente riceverà quindi una risposta (sempre tramite AJAX), la quale riporterà lo stato dei pulsanti dopo l'azione (tale stato potrebbe essere uguale al precedente, oppure invertito); usando l'informazione ricevuta nella risposta, la pagina richiedente modificherà eventualmente il colore (e quindi la reazione al click) del pulsante.

    Ci sono comunque dei potenziali problemi.
    Supponi di avere aperte 1 pagina di amministrazione e 10 pagine utenti. All'inizio il pulsante nella pagina di amministrazione è rosso, quindi cliccabile, mentre quelli nelle 10 pagine utenti sono, di conseguenza, verdi.
    Il click sul pulsante rosso dovrebbe informare le 10 pagine utenti di modificare il colore dei loro pulsanti, ma implementare questo via web è... complicato.
    È più semplice effettuare un polling in cui ciascuna pagina richiede periodicamente lo stato dei pulsanti. Ad esempio ogni 0.5 secondi. A questo scopo è possibile modificare controller.php in modo che gestisca sia le richieste di lettura dello stato che quelle di modifica.

    I sistemi concorrenti non sono mai facili!

  4. #4
    inucane non è connesso Utente giovane
    Data registrazione
    21-08-2007
    Messaggi
    36

    Predefinito

    Citazione Originalmente inviato da mzanella Visualizza messaggio
    I pulsanti delle due pagine sono tra loro collegati? Dalla descrizione sembra di no, dall'esempio sembra di sì...

    Dall'esempio sembra che:
    • i pulsanti 1 e 2 possono essere verdi o rossi
    • se uno è verde, l'altro è rosso, in maniera esclusiva
    • solo il pulsante rosso è cliccabile
    • il click su un pulsante (rosso) inverte i colori (e quindi il comportamento) di entrambi i pulsanti


    Gli ostacoli più ovvi sono mettere in comunicazione i due pulsanti, lo stato condiviso, l'accesso a risorsa condivisa (lo stato, appunto), e le conseguenti race conditions. Non sono problemi da poco, se possibile cerca un sistema alternativo.

    Innanzitutto, non serve a nulla memorizzare la doppia informazione "0-1" per entrambi i pulsanti, dato che i loro colori sono sempre mutualmente esclusivi è sufficiente indicare quale tra i due è rosso (o verde). Evita i file di testo, salva l'informazione in una base di dati, anche con sqlite.

    Hai poi bisogno di una pagina (php, chiamiamola controller.php) che gestisca lo stato condiviso. Questa pagina riceverà delle richieste (probabilmente tramite AJAX) nelle quali si indica quale pulsante è stato cliccato. Questa pagina interrogherà la base di dati per stabilire se il click ricevuto deve modificare lo stato condiviso e, in caso positivo, lo modificherà. In ogni caso invierà una risposta alla pagina richiedente, indicandole il nuovo stato dei pulsanti.

    Oltre a questo, la pagina dovrebbe anche prevedere un meccanismo di lock per evitare race conditions, ma lo farei in un secondo momento...

    Le pagine richiedenti, quelle contenenti i pulsanti 1 e 2 rispettivamente, dovranno effettuare una richiesta AJAX verso la pagina controller.php alla pressione del rispettivo pulsante. Le richieste indicheranno quale pulsante è stato premuto. La pagina richiedente riceverà quindi una risposta (sempre tramite AJAX), la quale riporterà lo stato dei pulsanti dopo l'azione (tale stato potrebbe essere uguale al precedente, oppure invertito); usando l'informazione ricevuta nella risposta, la pagina richiedente modificherà eventualmente il colore (e quindi la reazione al click) del pulsante.

    Ci sono comunque dei potenziali problemi.
    Supponi di avere aperte 1 pagina di amministrazione e 10 pagine utenti. All'inizio il pulsante nella pagina di amministrazione è rosso, quindi cliccabile, mentre quelli nelle 10 pagine utenti sono, di conseguenza, verdi.
    Il click sul pulsante rosso dovrebbe informare le 10 pagine utenti di modificare il colore dei loro pulsanti, ma implementare questo via web è... complicato.
    È più semplice effettuare un polling in cui ciascuna pagina richiede periodicamente lo stato dei pulsanti. Ad esempio ogni 0.5 secondi. A questo scopo è possibile modificare controller.php in modo che gestisca sia le richieste di lettura dello stato che quelle di modifica.

    I sistemi concorrenti non sono mai facili!
    la tua spiegazione è meravigliosa e ti ringrazio. purtroppo penso di essere abbastanza ottuso e non ho capito molto

  5. #5
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    A volte temo di essere troppo astratto .

    Ricapitoliamo. I due pulsanti devono "sincronizzarsi" tra loro, in modo da poter essere rispettivamente verdi o rossi, in base a quale viene premuto. Questa "sincronizzazione" è un po' articolata da realizzare, non c'è un meccanismo che lo faccia automaticamente, quindi occorre ingegnarsi un po'.

    Un modo è tenere in memoria lo stato dei pulsanti da qualche parte (chiamiamolo stato condiviso). Tu proponevi un file, ma per vari motivi un database credo sia più sicuro.
    Oltre a questo, serve una pagina PHP (chiamiamola controller.php) che si incarichi di gestire accesso e modifica allo stato condiviso. Questa pagina funziona più o meno così, in pseudocodice:
    Codice:
    if (richiesta_lettura_stato) {
        stato = leggi_dal_database();
        echo converti_in_json(stato);
    }
    
    else if (richiesta_modifica_stato, pulsante_premuto) {
        stato_attuale = leggi_dal_database();
        // vari controlli...
        nuovo_stato = ...
        salva_nel_database(nuovo_stato);
        echo converti_in_json(nuovo_stato);
    }

    Così facendo, le due pagine non dovranno farsi carico di gestire lo stato condiviso (che sarebbe complicato): al bisogno, chiederanno a controller.php di leggere o modificare lo stato.
    La richiesta, per praticità, sarà effettuata con AJAX (magari con le funzioni offerte da jQuery), in modo da poter avvenire dinamicamente senza dover ricaricare la pagina.

    Spero sia un po' più chiaro, se hai dubbi più specifici chiedi pure!

  6. #6
    inucane non è connesso Utente giovane
    Data registrazione
    21-08-2007
    Messaggi
    36

    Predefinito

    ma ciò mi comporta usare mysql che volevo evitare, anche perchè non sono molto capace.comunque grazie

  7. #7
    inucane non è connesso Utente giovane
    Data registrazione
    21-08-2007
    Messaggi
    36

    Predefinito

    Citazione Originalmente inviato da mzanella Visualizza messaggio
    A volte temo di essere troppo astratto .

    Ricapitoliamo. I due pulsanti devono "sincronizzarsi" tra loro, in modo da poter essere rispettivamente verdi o rossi, in base a quale viene premuto. Questa "sincronizzazione" è un po' articolata da realizzare, non c'è un meccanismo che lo faccia automaticamente, quindi occorre ingegnarsi un po'.

    Un modo è tenere in memoria lo stato dei pulsanti da qualche parte (chiamiamolo stato condiviso). Tu proponevi un file, ma per vari motivi un database credo sia più sicuro.
    Oltre a questo, serve una pagina PHP (chiamiamola controller.php) che si incarichi di gestire accesso e modifica allo stato condiviso. Questa pagina funziona più o meno così, in pseudocodice:
    Codice:
    if (richiesta_lettura_stato) {
        stato = leggi_dal_database();
        echo converti_in_json(stato);
    }
    
    else if (richiesta_modifica_stato, pulsante_premuto) {
        stato_attuale = leggi_dal_database();
        // vari controlli...
        nuovo_stato = ...
        salva_nel_database(nuovo_stato);
        echo converti_in_json(nuovo_stato);
    }

    Così facendo, le due pagine non dovranno farsi carico di gestire lo stato condiviso (che sarebbe complicato): al bisogno, chiederanno a controller.php di leggere o modificare lo stato.
    La richiesta, per praticità, sarà effettuata con AJAX (magari con le funzioni offerte da jQuery), in modo da poter avvenire dinamicamente senza dover ricaricare la pagina.

    Spero sia un po' più chiaro, se hai dubbi più specifici chiedi pure!
    potresti farmi un esempio di ajax ?


    io pensavo una cosa del tipo questa, ma chiaramente non funziona..

    echo " "."<name='asd'> <img src="on.png" />"." " ;
    echo "<td> <onclick= $bacca'+1' ";
    if($bacca = 1){

    $fh = fopen("pos.txt", "w");
    fwrite($fh, "0");
    fclose($fh);
    }
    al click mi aumentava di uno una varibile e quindi mi faceva lo script
    Ultima modifica di inucane : 30-12-2016 alle ore 18.47.42

  8. #8
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    potresti farmi un esempio di ajax ?
    Ecco degli esempi con jQuery e AJAX (ho cercato di adattarlo al tuo contesto), per la pagina in cui è presente il "pulsante 1":
    Codice HTML:
    ...
    <img src="on.png" alt="on" id="immagine_pulsante">
    ...
    
    <!-- Includi la libreria jQuery per poterla usare! -->
    <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
    
    <script>
    // Imposta il "colore" corretto in base ai dati ricevuti
    function updateButton (data) {
        var pulsante = $('#immagine_pulsante');
    
        if (data.satus.pulsante1 == "on") {
            pulsante.attr('src', 'on.png');
            pulsante.attr('alt', 'on');
        }
        else {
            pulsante.attr('src', 'off.png');
            pulsante.attr('alt', 'off');
        }
    }
    
    $(function() {
        // Associa una chiamata AJAX al click sull'immagine
        $('#immagine_pulsante').click(function () {        
            $.post("controller.php", {pulsante: "pulsante1"}, updateButton);
        });
    });
    </script>
    Mentre la pagina controller.php che elabora la richiesta e serve i risultati:
    Codice PHP:
    header('Content-type: application/json');

    // Se è stato premuto un pulsante/richiesto un cambiamento dello stato condiviso...
    if (isset($_POST['pulsante'])) {
    $pulsante = $_POST['pulsante'];

    // vari controlli su file/database/quello che è per leggere o modificare lo stato dei pulsanti...
    $pulsante1 = "on";
    $pulsante2 = "off";

    echo
    json_encode(array(
    "pulsante1" => $pulsante1,
    "pulsante2" => $pulsante2
    ));
    }

    // Altrimenti, mostra semplicemente lo stato attuale senza intervenire attivamente
    else {
    // Lettura da file/database/quello che è dello stato attuale
    $pulsante1 = "on";
    $pulsante2 = "off";

    echo
    json_encode(array(
    "pulsante1" => $pulsante1,
    "pulsante2" => $pulsante2
    ));
    }

    La parte AJAX vera e propria è:
    Codice:
    // Associa una chiamata AJAX al click sull'immagine
    $('#immagine_pulsante').click(function () {        
        $.post("controller.php", {pulsante: "pulsante1"}, updateButton);
    });
    in cui, tramite JavaScript (jQuery), si indica che ogni volta che l'oggetto con id immagine_pulsante viene cliccato, deve essere effettuata una chiamata AJAX vero la pagina controller.php per modificare lo stato condiviso (quindi la richiesta è di tipo POST), indicando che il pulsante premuto è il pulsante1. La pagina controller.php risponderà comunicando il nuovo stato, che sarà passato alla funzione updateButton.
    updateButton imposta semplicemente il colore corretto all'immagine in base alla risposta ricevuta, modificandola in on.png se il pulsante 1 deve essere attivo, oppure in off.png altrimenti.

    La pagina controller.php riceve le richieste POST (e GET, ma su questo sorvoliamo per ora), fa i suoi controlli sul file, sulla base di dati, o su quello che intendi usare, e "decide" se è il caso di modificare lo stato o meno. In ogni caso, prepara un vettore in questa forma:
    Codice PHP:
    [ "pulsante1" => "on", "pulsante2" => "off"]
    lo converte in JSON e lo restituisce. Nel codice di esempio ho scritto
    Codice PHP:
    $pulsante1 = "on";
    $pulsante2 = "off";
    ma è sottointeso che l'impostazione dei valori "on" e "off" dipenda dal contenuto del file su cui lavori!

  9. #9
    inucane non è connesso Utente giovane
    Data registrazione
    21-08-2007
    Messaggi
    36

    Predefinito

    Citazione Originalmente inviato da mzanella Visualizza messaggio
    Ecco degli esempi con jQuery e AJAX (ho cercato di adattarlo al tuo contesto), per la pagina in cui è presente il "pulsante 1":
    Codice HTML:
    ...
    <img src="on.png" alt="on" id="immagine_pulsante">
    ...
    
    <!-- Includi la libreria jQuery per poterla usare! -->
    <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
    
    <script>
    // Imposta il "colore" corretto in base ai dati ricevuti
    function updateButton (data) {
        var pulsante = $('#immagine_pulsante');
    
        if (data.satus.pulsante1 == "on") {
            pulsante.attr('src', 'on.png');
            pulsante.attr('alt', 'on');
        }
        else {
            pulsante.attr('src', 'off.png');
            pulsante.attr('alt', 'off');
        }
    }
    
    $(function() {
        // Associa una chiamata AJAX al click sull'immagine
        $('#immagine_pulsante').click(function () {        
            $.post("controller.php", {pulsante: "pulsante1"}, updateButton);
        });
    });
    </script>
    Mentre la pagina controller.php che elabora la richiesta e serve i risultati:
    Codice PHP:
    header('Content-type: application/json');

    // Se è stato premuto un pulsante/richiesto un cambiamento dello stato condiviso...
    if (isset($_POST['pulsante'])) {
    $pulsante = $_POST['pulsante'];

    // vari controlli su file/database/quello che è per leggere o modificare lo stato dei pulsanti...
    $pulsante1 = "on";
    $pulsante2 = "off";

    echo
    json_encode(array(
    "pulsante1" => $pulsante1,
    "pulsante2" => $pulsante2
    ));
    }

    // Altrimenti, mostra semplicemente lo stato attuale senza intervenire attivamente
    else {
    // Lettura da file/database/quello che è dello stato attuale
    $pulsante1 = "on";
    $pulsante2 = "off";

    echo
    json_encode(array(
    "pulsante1" => $pulsante1,
    "pulsante2" => $pulsante2
    ));
    }

    La parte AJAX vera e propria è:
    Codice:
    // Associa una chiamata AJAX al click sull'immagine
    $('#immagine_pulsante').click(function () {        
        $.post("controller.php", {pulsante: "pulsante1"}, updateButton);
    });
    in cui, tramite JavaScript (jQuery), si indica che ogni volta che l'oggetto con id immagine_pulsante viene cliccato, deve essere effettuata una chiamata AJAX vero la pagina controller.php per modificare lo stato condiviso (quindi la richiesta è di tipo POST), indicando che il pulsante premuto è il pulsante1. La pagina controller.php risponderà comunicando il nuovo stato, che sarà passato alla funzione updateButton.
    updateButton imposta semplicemente il colore corretto all'immagine in base alla risposta ricevuta, modificandola in on.png se il pulsante 1 deve essere attivo, oppure in off.png altrimenti.

    La pagina controller.php riceve le richieste POST (e GET, ma su questo sorvoliamo per ora), fa i suoi controlli sul file, sulla base di dati, o su quello che intendi usare, e "decide" se è il caso di modificare lo stato o meno. In ogni caso, prepara un vettore in questa forma:
    Codice PHP:
    [ "pulsante1" => "on", "pulsante2" => "off"]
    lo converte in JSON e lo restituisce. Nel codice di esempio ho scritto
    Codice PHP:
    $pulsante1 = "on";
    $pulsante2 = "off";
    ma è sottointeso che l'impostazione dei valori "on" e "off" dipenda dal contenuto del file su cui lavori!
    Grazie davvero per il mega codice, però non mi funziona, inizialmente l'ho adattato alla mia pagina, quindi ho aggiunto alcuni elementi php e la pubblicazione dell immagine tramite
    echo " "."<div id='immagine_pulsante' img src="on.png" />"." ";
    questo codice,ma non andava, allora ho provato un semplice copia incolla col codice da te datomi
    <img src="on.png" alt="on" id="immagine_pulsante">
    ma l'immagine non cambia,

  10. #10
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Grazie davvero per il mega codice, però non mi funziona,
    Ho cercato di tirare ad indovinare sulla struttura della pagina, sugli elementi che contiene e gli altri dettagli. Non sono stupito che non funzioni out of the box .

    ma l'immagine non cambia,
    Le possibili cause sono diverse:
    La console degli errori riporta qualche problema?
    L'evento associato al click dell'immagine viene attivato correttamente?
    La pagina controller.php è raggiunta dalla richiesta AJAX?
    La stessa pagina risponde correttamente alle richieste?
    La funzione di callback di AJAX viene chiamata (al momento giusto)?

  11. #11
    inucane non è connesso Utente giovane
    Data registrazione
    21-08-2007
    Messaggi
    36

    Predefinito

    Citazione Originalmente inviato da mzanella Visualizza messaggio
    Ho cercato di tirare ad indovinare sulla struttura della pagina, sugli elementi che contiene e gli altri dettagli. Non sono stupito che non funzioni out of the box .


    Le possibili cause sono diverse:
    La console degli errori riporta qualche problema?
    L'evento associato al click dell'immagine viene attivato correttamente?
    La pagina controller.php è raggiunta dalla richiesta AJAX?
    La stessa pagina risponde correttamente alle richieste?
    La funzione di callback di AJAX viene chiamata (al momento giusto)?
    aihme sono costretto a rispondere non ne ho idea,

  12. #12
    inucane non è connesso Utente giovane
    Data registrazione
    21-08-2007
    Messaggi
    36

    Predefinito

    Citazione Originalmente inviato da inucane Visualizza messaggio
    aihme sono costretto a rispondere non ne ho idea,
    non preoccuparti e grazie davvero per l'aiuto, casomai dato che ho rinunciato almeno per ora a questo volevo che al click su un bottone mi richiamasse una funzione php come potrei fare ? l'idea è
    -clicco sul bottone
    -richiamo la funzione php

    inoltre c'è un codice per rendere non usabile un bottone e/o cambiargli testo ?


    la funzione php che vorrei richiamare è
    $fh = fopen("pos.txt", "w");
    fwrite($fh, "0");
    fclose($fh);
    il codice che per ora uso è


    <?php
    function ciao() {

    $asd = "ciao";


    }

    ?>
    <html>

    <!-- Includi la libreria jQuery per poterla usare! -->
    <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>


    <head>
    <meta charset="utf-8" />
    <script type="text/javascript" src="js/jquery-1.3.2.min.js"></script>
    <script type="text/javascript" src="js/tabs.js"></script>

    <!--[if lt IE 8]>
    <div style=' clear: both; text-align:center; position: relative;'>
    <a href="http://windows.microsoft.com/en-US/internet-explorer/products/ie/home?ocid=ie6_countdown_bannercode">
    <img src="http://storage.ie6countdown.com/assets/100/images/banners/warning_bar_0000_us.jpg" border="0" height="42" width="820" alt="You are using an outdated browser. For a faster, safer browsing experience, upgrade for free today." />
    </a>
    </div>
    <![endif]-->
    <!--[if lt IE 9]>
    <script type="text/javascript" src="js/html5.js"></script>
    <link rel="stylesheet" type="text/css" media="screen" href="css/ie.css">
    <![endif]-->
    </script>
    </head>

    <!numeri e roba varia">

    <div class="iframess"><center>
    <?php
    $nomefil="pos.txt";
    $apr=fopen($nomefil,"r");
    $legg=fread($apr,filesize($nomefil));
    fclose($apr);
    //$var3 = array_reverse( file("pos.txt") ) ;
    $var3=file("pos.txt");//estraggo l'array dal file .txt
    @fclose($var);//chiudo il file .txt
    //$i=count($var2);//conto gli elementi nell'array
    //for($a=0; $a<=$i; $a++){//uso il ciclo for per guardare nell'array
    //Equilibrio

    if ($var3[0] == 1)

    //recupero la variabile globale var1 di tipo POST
    $var1=$_POST['var1'];
    if ($var1!=null){//Attiviamo PHP solo se il form è stato cliccato
    ?> ciaoo<?
    if ($var3[0] == 0)
    echo " "."<img src="off.png" />"." ";

    //forea<>ch($var2 as $numero)
    //{
    //}
    //echo $var2[$a];//scrivo tutti gli elementi dell'array, ma potevo eseguire qualunque altra operazione con le variabili!!!
    //}//fine ciclo for
    }?><input type="submit" name="var1" value="Vai"><script

    });</script>
    </body>
    </html>
    Ultima modifica di inucane : 03-01-2017 alle ore 11.47.11

  13. #13
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    questo volevo che al click su un bottone mi richiamasse una funzione php come potrei fare ?
    Semplicemente, non puoi .
    Quando usato per il web, PHP genera una pagina, agisce unicamente prima che l'utente la visualizzi. Quindi non c'è modo di rispondere ad un evento come il click col mouse. In termini "tecnici", PHP è un linguaggio lato-server, poiché lavora nel server senza che il client ne sia a conoscenza.

    L'opposto vale per JavaScript, che agisce lato-client: con JavaScript non puoi, ad esempio, creare file nel server come con PHP, ma puoi facilmente rispondere ad eventi come il click del mouse.

    AJAX serve esattamente per far incontrare queste due cose: con JavaScript fai partire una chiamata che attiverà uno script PHP.

    Quindi, per "chiamare una funzione PHP al click del mouse", il procedimento è sempre quello:
    1. usando JavaScript (preferibilmente jQuery) associ una funzione al click su di un elmento
    2. la funzione effettuerà una chiamata AJAX verso una pagina PHP (come la pagina controller.php di prima), eventualmente passandole i parametri necessari
    3. la pagina PHP invocherà la funzione desiderata, ed eventualmente restituirà un risultato
    4. una volta ricevuta l'eventuale risposta, con JavaScript potrai eventualmente modificare la pagina, ad esempio rendendo un pulsante non cliccabile


    inoltre c'è un codice per rendere non usabile un bottone e/o cambiargli testo ?
    Puoi aggiungere l'attributo disabled al pulsante, ad esempio tramite JavaScript/jQuery:
    Codice:
    $('#id_pulsante').attr('disabled', true);
    Per cambiarne il testo, invece:
    Codice:
    $('#id_pulsante').html("Nuovo testo");
    -oppure-
    $('#id_pulsante').attr('value', "Nuovo testo");
    il codice che per ora uso è
    ...da riscrivere. Patri da questo, cura indentazione e nomi delle variabili quando usi PHP:
    Codice HTML:
    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="utf-8">
    
      <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
      <script type="text/javascript" src="js/tabs.js"></script>
    
      <!--[if lt IE 9]>
      <script type="text/javascript" src="js/html5.js"></script>
      <link rel="stylesheet" type="text/css" media="screen" href="css/ie.css">
      <![endif]-->
    </head>
    
    <body>
      <div class="iframess">
        <center>
          <img src="off.png" alt="off" id="immagine_pulsante">
        </center>
      </div>
    
      <script type="text/javascript">
      $(function () {
        // jQuery e chiamate AJAX vanno qui.
      });
      </script>
    </body>
    </html>
    inucane likes this.

  14. #14
    inucane non è connesso Utente giovane
    Data registrazione
    21-08-2007
    Messaggi
    36

    Predefinito

    non penso di aver capito molto se nonc che devo fare una pagina php con i miei codici per scrivere il txt
    e non capisco in quella attuale dove mettere i codici php per il controllo del txt che decreta come agire e l'ajax che intendi sarebbe quello di prima ?

    in poche parole quello che volevo fare era ho un txt con un valore 0 - 1. quando e 0 visualizzo il pulsante verde o un bottone che dice "Vai", se ci clicco mi deve scrivere sullo stesso txt il valore 1, nella pagina adesso vedrò o il bottone rosso oppure il pulsante con la scritta ferma e non posso interagire, finchè qualcun altro con una pagina opposta a questa cambi il valore del file txt in 0

  15. #15
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    non capisco in quella attuale dove mettere i codici php per il controllo del txt che decreta come agire
    Infatti non ci va. Pensa alla pagina attuale come al cliente di un negozio, alla pagina PHP (quella chiamata controller.php) come al negoziante e al file di testo come ad un magazzino.
    Il cliente chiede al negoziante "dammi lo stato del pulsate", sarà il negoziante a sapere dove andare nel magazzino per recuperare l'informazione, e alla fine la presenterà impacchettata al cliente.
    Non è il cliente a cercare nel magazzino con i codici PHP ;)

    ajax che intendi sarebbe quello di prima
    Sì, sempre lui.

  16. #16
    inucane non è connesso Utente giovane
    Data registrazione
    21-08-2007
    Messaggi
    36

    Predefinito

    Citazione Originalmente inviato da mzanella Visualizza messaggio
    Infatti non ci va. Pensa alla pagina attuale come al cliente di un negozio, alla pagina PHP (quella chiamata controller.php) come al negoziante e al file di testo come ad un magazzino.
    Il cliente chiede al negoziante "dammi lo stato del pulsate", sarà il negoziante a sapere dove andare nel magazzino per recuperare l'informazione, e alla fine la presenterà impacchettata al cliente.
    Non è il cliente a cercare nel magazzino con i codici PHP ;)

    Sì, sempre lui.
    ci sto impazzendo non capendo più nulla, lo so che chiedo tanto, ma potresti farmi l'esempio utilizzando la lettura e la scrittura sul dil pos.txt ? che usi un immagine o i bottini è indifferente... ma ti prego aiutami sto impazzendo

  17. #17
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    basta un po' di copia-e-incolla degli ultimi messaggi del forum... Ad ogni modo questo è l'esempio completo, funziona semplicemente copiando i file nella stessa cartella:

    controller.php
    Nota: per implementare la lettura/scrittura su file ho aggiunto funzioni di supporto, oltre a quelle già mostrate nei primi messaggi
    Codice PHP:
    <?php
    // Risultato nel formato JSON
    header('Content-type: application/json');

    // Legge lo stato condiviso e lo restituisce come vettore associativo
    function read_status() {
    $filename = "pos.txt";
    if (!
    file_exists($filename) || !is_readable($filename)) {
    touch($filename);
    }

    $status = file_get_contents($filename);
    if (
    stripos($status, "on") === 0) {
    return array(
    'pulsante1' => "on",
    'pulsante2' => "off"
    );
    } else {
    return array(
    'pulsante1' => "off",
    'pulsante2' => "on"
    );
    }
    }

    // Scrive lo stato condiviso
    function write_status($status) {
    $filename = "pos.txt";

    file_put_contents($filename, $status['pulsante1']);
    }

    // Inverte lo stato, restituendone una copia
    function switch_status($status) {
    return array(
    'pulsante1' => $status['pulsante2'],
    'pulsante2' => $status['pulsante1']
    );
    }



    // Se è stato premuto un pulsante/richiesto un cambiamento dello stato condiviso...
    if (isset($_POST['pulsante'])) {
    $pulsante = $_POST['pulsante'];

    // Legge lo stato condiviso
    $status = read_status();

    // Se il pulsante premuto era abilitato, inverte lo stato
    if ($status[$pulsante] === "on") {
    $status = switch_status($status);
    write_status($status);
    }

    // Restituisce lo stato condiviso
    echo json_encode($status);
    }

    // Altrimenti, mostra semplicemente lo stato attuale senza intervenire attivamente
    else {
    echo
    json_encode(read_status());
    }
    pulsante1.html
    Nota: ho aggiunto il codice per rilevare periodicamente modifiche nello stato condiviso ed aggiornare il "colore" del pulsante, nel caso sia premuto in un'altra pagina
    Codice HTML:
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Esempio Stato Condiviso</title>
    
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
    </head>
    
    <body>
        <div class="container">
            <div class="page-header">
                <h1>Esempio Stato Condiviso <small>Sarebbe bastato fare copia-e-incolla del codice nel forum</small></h1>
            </div>
    
            <h2>Pulsante 1</h2>
            <img src="on.png" alt="on" id="immagine_pulsante">
        </div>
    
    
        <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
        <script type="text/javascript">
        // Imposta il "colore" corretto in base ai dati ricevuti
        function updateButton (data) {
            var pulsante = $('#immagine_pulsante');
    
            if (data.pulsante1 == "on") {
                pulsante.attr('src', 'on.png');
                pulsante.attr('alt', 'on');
            }
            else {
                pulsante.attr('src', 'off.png');
                pulsante.attr('alt', 'off');
            }
        }
    
        $(function() {
            $('#immagine_pulsante').click(function () {        
                $.post("controller.php", {pulsante: "pulsante1"}, updateButton);
            });
    
            // Legge periodicamente lo stato per rilevare modifiche ed aggiornare il pulsante
            setInterval(function () {
                $.get("controller.php", updateButton);
            }, 1000);
        });
        </script>
    </body>
    </html>
    pulsante2.html
    Nota: identica a pulsante1.html, cambiano appunto il "nome" del pulsante ed i relativi codici
    Codice HTML:
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Esempio Stato Condiviso</title>
    
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
    </head>
    
    <body>
        <div class="container">
            <div class="page-header">
                <h1>Esempio Stato Condiviso <small>Sarebbe bastato fare copia-e-incolla del codice nel forum</small></h1>
            </div>
    
            <h2>Pulsante 2</h2>
            <img src="on.png" alt="on" id="immagine_pulsante">
        </div>
    
    
        <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
        <script type="text/javascript">
        // Imposta il "colore" corretto in base ai dati ricevuti
        function updateButton (data) {
            var pulsante = $('#immagine_pulsante');
    
            if (data.pulsante2 == "on") {
                pulsante.attr('src', 'on.png');
                pulsante.attr('alt', 'on');
            }
            else {
                pulsante.attr('src', 'off.png');
                pulsante.attr('alt', 'off');
            }
        }
    
        $(function() {
            $('#immagine_pulsante').click(function () {        
                $.post("controller.php", {pulsante: "pulsante2"}, updateButton);
            });
    
            // Legge periodicamente lo stato per rilevare modifiche ed aggiornare il pulsante
            setInterval(function () {
                $.get("controller.php", updateButton);
            }, 1000);
        });
        </script>
    </body>
    </html>
    Il punto debole resta sempre il fatto che lo stato condiviso è memorizzato in un file di testo "qualunque", senza meccanismi di lock.
    inucane likes this.

  18. #18
    inucane non è connesso Utente giovane
    Data registrazione
    21-08-2007
    Messaggi
    36

    Predefinito

    Citazione Originalmente inviato da mzanella Visualizza messaggio
    basta un po' di copia-e-incolla degli ultimi messaggi del forum... Ad ogni modo questo è l'esempio completo, funziona semplicemente copiando i file nella stessa cartella:

    controller.php
    Nota: per implementare la lettura/scrittura su file ho aggiunto funzioni di supporto, oltre a quelle già mostrate nei primi messaggi
    Codice PHP:
    <?php
    // Risultato nel formato JSON
    header('Content-type: application/json');

    // Legge lo stato condiviso e lo restituisce come vettore associativo
    function read_status() {
    $filename = "pos.txt";
    if (!
    file_exists($filename) || !is_readable($filename)) {
    touch($filename);
    }

    $status = file_get_contents($filename);
    if (
    stripos($status, "on") === 0) {
    return array(
    'pulsante1' => "on",
    'pulsante2' => "off"
    );
    } else {
    return array(
    'pulsante1' => "off",
    'pulsante2' => "on"
    );
    }
    }

    // Scrive lo stato condiviso
    function write_status($status) {
    $filename = "pos.txt";

    file_put_contents($filename, $status['pulsante1']);
    }

    // Inverte lo stato, restituendone una copia
    function switch_status($status) {
    return array(
    'pulsante1' => $status['pulsante2'],
    'pulsante2' => $status['pulsante1']
    );
    }



    // Se è stato premuto un pulsante/richiesto un cambiamento dello stato condiviso...
    if (isset($_POST['pulsante'])) {
    $pulsante = $_POST['pulsante'];

    // Legge lo stato condiviso
    $status = read_status();

    // Se il pulsante premuto era abilitato, inverte lo stato
    if ($status[$pulsante] === "on") {
    $status = switch_status($status);
    write_status($status);
    }

    // Restituisce lo stato condiviso
    echo json_encode($status);
    }

    // Altrimenti, mostra semplicemente lo stato attuale senza intervenire attivamente
    else {
    echo
    json_encode(read_status());
    }
    pulsante1.html
    Nota: ho aggiunto il codice per rilevare periodicamente modifiche nello stato condiviso ed aggiornare il "colore" del pulsante, nel caso sia premuto in un'altra pagina
    Codice HTML:
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Esempio Stato Condiviso</title>
    
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
    </head>
    
    <body>
        <div class="container">
            <div class="page-header">
                <h1>Esempio Stato Condiviso <small>Sarebbe bastato fare copia-e-incolla del codice nel forum</small></h1>
            </div>
    
            <h2>Pulsante 1</h2>
            <img src="on.png" alt="on" id="immagine_pulsante">
        </div>
    
    
        <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
        <script type="text/javascript">
        // Imposta il "colore" corretto in base ai dati ricevuti
        function updateButton (data) {
            var pulsante = $('#immagine_pulsante');
    
            if (data.pulsante1 == "on") {
                pulsante.attr('src', 'on.png');
                pulsante.attr('alt', 'on');
            }
            else {
                pulsante.attr('src', 'off.png');
                pulsante.attr('alt', 'off');
            }
        }
    
        $(function() {
            $('#immagine_pulsante').click(function () {        
                $.post("controller.php", {pulsante: "pulsante1"}, updateButton);
            });
    
            // Legge periodicamente lo stato per rilevare modifiche ed aggiornare il pulsante
            setInterval(function () {
                $.get("controller.php", updateButton);
            }, 1000);
        });
        </script>
    </body>
    </html>
    pulsante2.html
    Nota: identica a pulsante1.html, cambiano appunto il "nome" del pulsante ed i relativi codici
    Codice HTML:
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Esempio Stato Condiviso</title>
    
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
    </head>
    
    <body>
        <div class="container">
            <div class="page-header">
                <h1>Esempio Stato Condiviso <small>Sarebbe bastato fare copia-e-incolla del codice nel forum</small></h1>
            </div>
    
            <h2>Pulsante 2</h2>
            <img src="on.png" alt="on" id="immagine_pulsante">
        </div>
    
    
        <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
        <script type="text/javascript">
        // Imposta il "colore" corretto in base ai dati ricevuti
        function updateButton (data) {
            var pulsante = $('#immagine_pulsante');
    
            if (data.pulsante2 == "on") {
                pulsante.attr('src', 'on.png');
                pulsante.attr('alt', 'on');
            }
            else {
                pulsante.attr('src', 'off.png');
                pulsante.attr('alt', 'off');
            }
        }
    
        $(function() {
            $('#immagine_pulsante').click(function () {        
                $.post("controller.php", {pulsante: "pulsante2"}, updateButton);
            });
    
            // Legge periodicamente lo stato per rilevare modifiche ed aggiornare il pulsante
            setInterval(function () {
                $.get("controller.php", updateButton);
            }, 1000);
        });
        </script>
    </body>
    </html>
    Il punto debole resta sempre il fatto che lo stato condiviso è memorizzato in un file di testo "qualunque", senza meccanismi di lock.
    grazie di cuore per la pazienza che hai, il meccanismo di sicurezza non mi interessa, comunque questo codice mi odia T.T ciò è anche con un semplice copia e incolla non funziona.... in tutte e due le finestre il pulsante appare verde e diventa subito rosso.... senza possibili interazioni. ma perchè ? penso che non legga il txt ma non capisco. T.T ti prego ti offriro un caffe ma aiutami cosa non va ?
    Ultima modifica di inucane : 05-01-2017 alle ore 12.21.38

  19. #19
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    I permessi di lettura e scrittura del file pos.txt sono corretti? Se hai dubbi, cancellalo (controller.php lo creerà automticamente).

    Questi sono gli stessi file copiati in una cartella nel mio spazio: controller.php, pulsante1.html e pulsante2.html, come puoi vedere lì funzionano.
    inucane likes this.

  20. #20
    inucane non è connesso Utente giovane
    Data registrazione
    21-08-2007
    Messaggi
    36

    Predefinito

    Citazione Originalmente inviato da mzanella Visualizza messaggio
    I permessi di lettura e scrittura del file pos.txt sono corretti? Se hai dubbi, cancellalo (controller.php lo creerà automticamente).

    Questi sono gli stessi file copiati in una cartella nel mio spazio: controller.php, pulsante1.html e pulsante2.html, come puoi vedere lì funzionano.
    Grandissimo e grazie, di dove sei ? oppure dammi il numero della tua postepay ti offro un caffè.
    grazie!!!!!!
    Ultima modifica di inucane : 05-01-2017 alle ore 16.05.59

  21. #21
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Probabilmente sono i permessi scrittura della cartella, dovresti modificarli.

    Edit: funziona quindi? Bene! Contrariamente a quanto fanno gli altri programmatori non bevo caffè, quindi non preoccuparti ;)
    Ultima modifica di mzanella : 05-01-2017 alle ore 17.14.08

  22. #22
    inucane non è connesso Utente giovane
    Data registrazione
    21-08-2007
    Messaggi
    36

    Predefinito

    Citazione Originalmente inviato da mzanella Visualizza messaggio
    Probabilmente sono i permessi scrittura della cartella, dovresti modificarli.

    Edit: funziona quindi? Bene! Contrariamente a quanto fanno gli altri programmatori non bevo caffè, quindi non preoccuparti ;)
    Grazie davvero!

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •