[PHP] Single Page Application MVC

  • Creatore Discussione Creatore Discussione nixiam
  • Data di inizio Data di inizio

nixiam

Nuovo Utente
14 Ago 2017
11
0
1
37
Buongiorno a tutti,
intanto vorrei porre i miei complimenti per il sito, trovo sempre articoli molto utili :)

Sono a chiedere un vostro aiuto per un gestionale che sto sviluppando (... cercando di sviluppare).

L'idea di fondo è un avere un sito web con url statico es. www.miaapp.it/app/ dove viene caricato lo script principale index.php. Questo script gestisce tutte le richieste utente con una struttura a moduli che vengono "renderizzati" alla richiesta dell'utente, ognuno tramite un Dialog jquery all'interno della schermata principale.

La struttura è del tipo:
Codice:
- index.php
- resources/
- moduli/
        - main_page/
                - model
                - controller
                - view
        - login/
                - model
                - controller
                - view
        - contabilità/
                - model
                - controller
                - view
        - automezzi/
                - model
                - controller
                - view
        - agenda/
                - model
                - controller
                - view

La prima volta che viene avviata l'app, non essendoci alcuna richiesta viene istanziato il modulo main_page che invia come view l'applicazione principale con solo un menu a disposizione.
Alla volontà di inserire per esempio una nuova contabilità, tramite selezione dal menù viene inviata una richiesta POST ad index.php che rileva la richiesta, istanza una nuova classe Contabilità integrando il relativo modulo che restituisce in output la view tramite un Dialog Jquery. Il tutto all'interno della pagina principale. Alla chiusura del dialog, i suoi script e stili vengono eliminati con lui in modo da pulire il DOM.

Fino a qui nessun problema.

Il problema nasce quando, dall'interno del Dialog contabilità, invio una richiesta POST ad index (ad esempio di salvataggio nel db). Ciò che vorrei è che index utilizzasse l'istanza di Contabilità che ha creato il Dialog, ma non ci riesco.

Vi riassumo quale dovrebbe essere il processo a cui ho pensato:

1) Primo avvio -> nessuna richiesta - Avvio pagina principale con solo il menù
2) Da menù richiedo nuovo inserimento contabilità -> index istanza una nuova classe Contabilità -> Contabilità risponde con la view
3) Dal dialog contabilità è richiesta una verifica nel db -> index riceve la richiesta -> passa la richiesta all'istanza Contabilità che ha generato il dialog -> la classe elabora la richiesta -> restituisce l'output ad index -> index restituisce la view o l'echo del caso
ecc...

Il mio problema è con il punto 3: non riesco a far elaborare la richiesta proveniente dalla view dall'istanza della classe che ha creato la finestra su cui sto lavorando, infatti per salvare la contabilità inserita devo istanziare nuovamente la classe Contabilità (vedi codice sotto), ma non vorrei...

Riuscite a darmi qualche suggerimento? sono alle prime armi con php... :D

Grazie a tutti


Vi riporto la bozza del codice di index.php. Se notate, per gestire il caso di "$_POST['cmd'] == "Salva_Contabilita" sono costretto ad istanziare nuovamente la classe Contabilità perchè, ad ogni richiesta $.post con Jquery l'oggetto obj precedentemente creato non è disponibile.

Ho provato anche a salvare l'oggetto nell'array $_SESSION ma viene restituito l'errore di serializzazione di PDO presente nella classe Contabilita con cui accedo al db.

PHP:
if(isset($_POST['cmd'])){
    if($_POST['cmd'] == "Ricerca"){
        $obj = new Search();
    }elseif($_POST['cmd'] == "Modifica_password"){
        $opt = array(    "width" => 400,
                        "height" => 250,
                        "position" => '{ my: "center", at: "center", of: "#left-pane" }',
                        "draggable" => "true",
                        "modal" => "false",
                        "resizable" => "false",
                        "closeOnEscape" => "false");
        $obj = new Change_Password($opt);
    }elseif($_POST['cmd'] == "Scheda_veicolo"){
        $obj = new Vehicle();
    }elseif($_POST['cmd'] == "Nuova_Contabilita"){
        $obj = new Contabilita();
    }elseif($_POST['cmd'] == "Disconnetti"){
        $obj = new Login();
    }elseif($_POST['cmd'] == "Report_produzione"){
        $opt = array(    "width" => 700,
                        "height" => 500,
                        "position" => '{ my: "center", at: "center", of: "#left-pane" }',
                        "draggable" => "true",
                        "modal" => "false",
                        "resizable" => "true",
                        "closeOnEscape" => "false");
        $obj = new Report($opt);
    }elseif ($_POST['cmd'] == "Salva_Contabilita") {
        $obj = new Contabilita();
        $result = $obj->VerificaEsistenzaID($_POST['obj']['id_int']);
        if($result->rowCount() > 0){
            echo "Errore: Il db contiene già un intervento con questo Id";
        }else{
            $result = $obj->InserisciAnagrafica($_POST['obj']);
            if($result){
                echo json_encode($_POST['obj']);
                //echo "Intervento salvato nel db";
            }else{
                echo "Errore: Errore nel salvataggio dell'intervento nel db";
            }
       
        }
        exit();
    }
    else{
        exit();
    }
    echo $obj->Render($_POST['cmd']."_".$_POST['count']);
    exit();
}
echo Main_Page::Render();
exit();
 
Ultima modifica:
Ti propongo questa soluzione, perchè non dichiari VerificaEsistenzaID come statico ? In questo modo non creeresti l'oggetto e se ci fai caso non è imperativo creare l'oggetto per sapere se effettivamente esiste (come magari conoscere un determinato attributo di un oggetto che richiede per forza l'esistenza dello stesso). Lo stesso dicasi per InserisciAnagrafica che potresti farlo statico per lo stesso motivo.
Per quanto riguarda il dialog lo lasci così come è, passi i dati via post alla index, e poi questi vengono inviati alla classe Contabilità
 
Ciao,
intanto ti ringrazio della risposta :)

Avevo pensato infatti di creare tutte queste classi come statiche (o i vari metodi come statici) ma la mia idea di fondo era che ogni dialog dovesse essere un'istanza di una relativa classe: ad esempio il dialog contabilità fosse un'istanza della classe Contabilità. Questo non solo per un fatto concettuale, ma avrei anche la possibilità di invocare 2 dialog contabilità contemporaneamente ma facendoli rimanere indipendenti l'uno dall'altro. Se rendessi le classi statiche o solo alcuni dei relativi metodi/attributi statici, dovrei pensare un ad modo per tenere separati i dati che ogni dialog invia.

Forse interpreto male io il concetto di OOP?

Approfitto per una seconda domanda inerente al discorso:

E' normale che ad ogni chiamata $.post al controller index .php questo non "si ricordi" delle variabili già create e nemmeno degli include_once? Ad esempio se provo con:

PHP:
<?php
// inizio file index.php

$included_files = get_included_files();
foreach ($included_files as $filename) {
    echo "file incluso: $filename <br>";
}

require_once 'system/define_path.php';

$classes = new FilesystemIterator('system/classes');
foreach($classes as $file)
{
   $class_file = "system/classes/" . $file->getFilename();
   if (isset($_GET["d"]) && $_GET["d"]){ echo "class: $class_file <br>"; }
   require_once $class_file;
}

alla prima chiamata ad index.php viene riportato:
Codice:
file incluso: E:\xampp\htdocs\mia\gestionale\index.php
e mi torna in quanto tutti i "require_once" sono inseriti dopo il costrutto "$included_files = get_included_files();".
Ma alla prima chiama che $.post faccio mi viene sempre riproposto quella sola dicitura, escludendo tutti gli include_once che ci sono sotto. E' normale?

Grazie mille... sono alle prime armi.
 
La mia proposta era semplicemente per la modifica di quelle funzioni che possono essere dichiarate statiche, naturalmente non sto come poi tu voglia gestire tramite le classi i vari dialog anche se un'idea più o meno l'ho avuta. Penso che comunque non sia un problema tenere separati i dati di ogni dialog, dipende dal risultato finale alla fine anche perchè dipende da cosa intendi anche per
ma avrei anche la possibilità di invocare 2 dialog contabilità contemporaneamente ma facendoli rimanere indipendenti l'uno dall'altro
.
Per la seconda domanda non ho ben capito il problema ma ti do comunque una risposta per ciò che penso tu chieda. Non vedi i file inclusi oltre \index.php perchè il ciclo che si occupa di reperire tutti i file inclusi non è successivo all'inclusione dei restanti file.
In sintesi prova a mettere il ciclo di lettura
Codice:
$included_files = get_included_files();
foreach ($included_files as $filename) {
    echo "file incluso: $filename <br>";
}
a fine pagina e dovresti avere il resoconto di tutti i file inclusi
 
Ciao,
Il costrutto get_included_files() l'ho messo appositamente all'inizio per vedere se, dopo aver caricato la pagina la prima volta, alla successiva chiamata Post alla stessa pagina fossero già stati memorizzati gli include_once invocati al primo caricamento della pagina, ma questo non avviene.

A cosa serve include_once se ad ogni chiamata vengono inclusi nuovamente i files?
 
Beh certo perchè ogni volta che carichi una pagina in php viene eseguito/rieseguito. L'interpretazione dell'include_once è errata ovvero il file non è incluso una sola volta per tutta la vita del sito, quando la pagina index.php viene caricata con un include_once("a.php") questo garantirà che se in un altra script (presente nella index) ci dovesse essere una re-inclusione di a.php questo non avverrebbe.
Codice:
<?php
include_once 'a.php';        //In questo file viene stampato solo "ciao mondo"
include_once 'a.php';        //Non sarà incluso a seguito di una precedente inclusione
?>
Il risultato è: "ciao mondo" (una sola volta perchè il secondo include non riesegue il file).
Per maggiori esempi o dettagli ti rimando alla documentazione dell'include:
http://php.net/manual/en/function.include-once.php
http://php.net/manual/en/function.require-once.php (Questa è una variante che blocca l'esecuzione della pagina se il file richiesto manca a differenza dell'include che proseguirebbe segnalandoti il warning)
 
Quindi l'unico modo di salvare un'informazione tra un caricamento ed un altro e usare cookie e sessioni?

Grazie
 
Se volessimo essere molto minimal si però considera che se ci atteniamo al termine di "salvare" puoi anche considerare il passaggio di informazioni tramite $_GET un salvataggio, tipo $_GET["pagina"] per memorizzare il numero di pagina. Anche il salvataggio in un db può soddisfare la tua frase. (Non dico che sono adeguati era solo per ricordarti altri metodi di salvataggio, quale usare poi sta a te):)
 

Discussioni simili