• Moderatore

    PHP + Web Service + jQuery ajax

    Ciao ragazzi,
    da qualche giorno sbatto la testa per cercare di replicare con PHP una tecnica che di solito uso in asp.NET.

    Con C# spesso strutturo il codice dividendo la parte di interfaccia utente (html + jquery), dal codice che si frappone tra essa e il database.
    Faccio questa operazione passando per un web service che contiene tutte le funzioni richiamate da ajax.
    In pratica la logica di solito è la seguente

    • La pagina .aspx effettua con jquery una chiamata ajax che chiama uno specifico metodo di un web service (.asmx).
    • il metodo del web service esegue i controlli, crea le classi che si interfacciano con il db ecc. ed infine risponde (in json o xml) il risultato alla pagina chiamante.

    Come dicevo all'inizio, è da qualche tempo che mi sono incaponito a voler riprodurre la stessa cosa con PHP.
    Lo vorrei fare per due motivi: centralizzare in un unico file tutte le funzioni chiamate tramite ajax e perchè sono semplicemente molto curioso di capirci qualcosa.

    Da uno studio che ho già fatto ho letto di nusoap e librerie del genere per creare web service in php.

    Quello che non ho provato a fare pechè non capisco bene come farlo, è chiamare uno specifico metodo di un web service creato con php.

    Ad esempio negli asmx mi basta aggiungere alla fine dell'url nella chiamata ajax uno "/nomeMetodo" e marcare quest'ultimo come [WebMethod] nel .cs associato all'asmx.

    In php la cosa funzionerebbe alla stessa maniera?
    Quale sarà il file che in .NET mi corrisponde all'asmx?

    Ho trovato sul web molto riguardante i web service in php, molto per realizzare questa tecnica con .NET (asmx) e jQuery, ma nulla che integri in un solo esempio/tutorial/articolo jQuery, php e i web service (anche se con librerie diverse da nusoap).

    Qualcuno di voi saprebbe per caso darmi qualcosa da leggere per approfondire l'argomento?

    Spero di essermi spiegato decentemente e mi scuso se quel che ho scritto dovesse risultare ostico da capire. Non è facile spiegarsi su questa cosa.

    Un saluto a tutti
    Shad


  • User Attivo

    Ciao Shad, effettivamente non mi è molto chiaro, non capisco di cosa necessiti e perchè.

    Ogni volta che devo implementare ajax in qualche software web based in php, faccio così:

    Creo una classe specifica in PHP (per esempio la chiami ajaxApi class), in modo da prendere in carico tutte le chiamate Ajax. Nella pagina ajax.php, genero l'oggetto della classe precedentemente accennata e in base alla richiesta, effettuo le operazioni.

    esempio:

    ajax.php?action=delete&id=34

    La classe capisce che deve eseguire l'azione di delete sull'id 34. Fai quello che devi fare in php e generi un'eventuale output (xml, html, pinco pallo).

    Onestamente non so cosa sia asmx, ma se non ho capito male ha la stessa funzione del file che precedentemente abbiamo chiamato ajax.php.


  • Moderatore

    @Bazarop said:

    ajax.php?action=delete&id=34

    La classe capisce che deve eseguire l'azione di delete sull'id 34.

    Ciao Bazarop,
    grazie per la risposta.

    Credo che hai inteso il senso di quello che voglio fare anche se volevo cercare di capire come farlo con i web service.
    Detto questo però il tuo metodo con la classe può tranquillamente sostituire la mia idea nella soluzione del problema.

    Quello che però vorrei capire nella parte citata è proprio come fai a usare quel "delete".
    Nel senso che ho capito che bisogna passare l'azione, quello che non mi è chiaro è come faccio ad eseguirla visto che sto passando un parametro (quindi una stringa) e non un metodo inteso come una vera e propria azione.

    Fammi sapere e grazie ancora per l'aiuto.
    Shad


  • User Attivo

    Ok, ti faccio un esempio pratico con tanto di codice di un mio software.

    In gioco abbiamo:

    ajax.php : Pagina che viene chiamata via Ajax.
    usersControl-class.php : classe che gestisce gli utenti. Crea, modifica, assegna privilegi, cancella, etc...

    Supponiamo che io mi trovi in un pannello di amministrazione di un'applicazione web based e davanti mi trovo l'elenco dei miei dipendenti (gli utenti).

    Decido di cancellare l'utente con id 23 e tramite ajax chiamo: ajax.php?request=usersControl&action=delete&id=23

    In pratica sto dicendo alla pagina Ajax.php che voglio accedere alla classe userControl ed eseguire l'azione di delete sull'id 23

    Ma come fa ajax.php a fare questo? Così:

    [PHP]<?php
    /*

    @author: Andrea Dell'Orco http://www.adostudio.it/
    @copyright: Comune di Cremona http://www.comune.cremona.it/

    */
    require_once ("../config.php");
    require_once ("../classes/db-class.php");
    require_once ("../classes/core-class.php");
    [..]
    require_once ("classes/usersControl-class.php");
    [..]

    [..]

    switch ($_GET['request']) {

    case "usersControl" :
    	$ajax = new usersControl();
    	break;
    
    case "labs" :
    	$ajax = new labs();
    	break;
    	
    case "paths" :
    	$ajax = new paths();
    	break;
    [..]
    

    }
    ?>[/PHP]

    Capisce che sto cercando di accedere alla classe userConrol e allora crea un'istanza di tale classe. Sarà compito della classe capire cosa voglio fare.

    La classe userControl, funziona così:
    [PHP]<?php
    /*

    @author: Andrea Dell'Orco http://www.adostudio.it/
    @copyright: Comune di Cremona http://www.comune.cremona.it/

    */

    class usersControl extends core {

    //CONSTRUTTORE - Inizializza la classe e comprende cosa c'e da fare
    function __construct() {
    
    	switch ($_GET['action']) {
    
    		case "addUser" :
    			$this -> doForm();
    			break;
    
    		case "insertUser" :
    			echo $this -> insert();
    			break;
    
    		case "delete" :
    			echo $this -> delete();
    			break;
    
    		case "edit" :
    			echo $this -> edit();
    			break;
    
    		default :
    			$this -> show();
    			break;
    	}
    
    }
    

    [..]
    /*---------------------------------------------------------------------

    • Metodo delete-----------------------------------------------------

    • Cancella l'utente ------------------------------------------------

    • --------------------------------------------------------------------*/

      function delete() {
      $id = $this -> injStr($_GET['id']);
      //esegue le operazioni di DELETE
      [..]
      return $output;
      }
      [..]
      [/PHP]

    Come vedi, sarà compito della classe userControl, tramite il metodo DELETE eliminare l'utente. Ovviamente è necesario inserire controlli di sicurezza che ho omesso qui (per semplificare e per problemi di copyright :P)
    Puoi tranquillamente inoltre generare qualunque tipo di output.

    Spero di essere stato abbastanza chiaro.
    Un saluto


  • Moderatore

    Grazie Bazarop, sei stato chiarissimo. 🙂


  • Moderatore

    Ciao Bazarop,
    ho usato questa mattinata per studiare con più calma il problema e l'ho risolto con un metodo, a mio modesto parere, davver interessante.
    Te lo riporto in modo che magari è utile anche a te e ne possiamo discutere insieme.

    Ho innanzitutto creato un file php che usa una interessantissima funzione di PHP che non conoscevo, call_user_func_array.
    Ecco il file che ho creato per fare una prova:

    [php]$funzione = $_GET['f'];

    call_user_func_array($_GET['f'], $_POST);

    function funzioneProva($a, $b, $c) {
    echo "$a $b $c";
    }[/php]Come vedi recupera il nome della funzione da chiamare in GET e i parametri da passare in POST.
    Questo perchè ho creato poi una funzione jQuery che passa il nome della funzione accodato al file php che chiamo e i parametri con il normale metodo. Avrei potuto anche passare tutto tra i parametri ovviamente.
    Ecco il file js:

    $.ajax({
                url: 'ajax/caller.php?f=funzioneProva',
                type: 'POST',
                data: { p1: 11, p2: 'shad', p3: 'altro testo' },
                success: riuscito,
                error: fallito
            });
    ```Nella funzione "riuscito" leggo tranquillamente quello che viene scritto in funzioneProva.
    Bisogna solo avere l'accortenza di mettere i parametri nell'ordine in cui vogliamo vengano passati alla funzione.
    
    Cosa ne pensi? :)