[PHP] Single Page Application MVC

nixiam

Nuovo Utente
14 Ago 2017
11
0
1
36
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:

Antonio De Marco

Utente Attivo
28 Lug 2015
60
4
8
ademarco.it
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à
 

nixiam

Nuovo Utente
14 Ago 2017
11
0
1
36
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.
 

Antonio De Marco

Utente Attivo
28 Lug 2015
60
4
8
ademarco.it
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
 

nixiam

Nuovo Utente
14 Ago 2017
11
0
1
36
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?
 

Antonio De Marco

Utente Attivo
28 Lug 2015
60
4
8
ademarco.it
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)
 

nixiam

Nuovo Utente
14 Ago 2017
11
0
1
36
Quindi l'unico modo di salvare un'informazione tra un caricamento ed un altro e usare cookie e sessioni?

Grazie
 

Antonio De Marco

Utente Attivo
28 Lug 2015
60
4
8
ademarco.it
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
Autore Titolo Forum Risposte Data
N [PHP] Architettura Single Page Application PHP 0
F Cerco Hosting con VECCHIE versioni di php Hosting 0
Cosina Captcha php PHP 1
S passare un valore da un form a un file .php con metodo post PHP 4
N php msyql PHP 6
N php problemi a visualizzare video PHP 3
A menu a tendina php PHP 1
D protezione cartelle: blocco visualizzazione/scaricamento contenuto, ma abilitazione utilizzo dati da parte di file .php presenti sul sito Web Server 1
F Php date_diff PHP 1
K [PHP] Aggiungere caratteri ad una stringa in base alla lunghezza della stessa PHP 2
C Wp-admin a file php WordPress 5
Lino80 [Retribuito] Cerco programmatore php per modifica/inserimento funzione/valori da un plugin importer wordpress Offerte e Richieste di Lavoro e/o Collaborazione 0
csi Inviare file jpg in locale alla stampante con php PHP 0
M Passaggio variabili array php su un tasto jq PHP 3
E Php aggiornamento tabella PHP 9
G phpmailer e php 8.1 con estensione mysqli PHP 6
M Invio dati database via email php PHP 0
K [php] Problema con inner join PHP 4
K [php]form invio dati PHP 0
P Codifica caratteri speciali mysql php PHP 0
K [PHP] Problema con variabili concatenate. PHP 1
E Stampante termica escpos-php PHP 6
JeiMax Modifica codice php personalizzato PHP 2
G Come modificare un pdf in php PHP 1
U Link a doppio file PHP PHP 0
E PHP & jQuery PHP 8
N Passare array da php a javascript PHP 5
F Applicazione PHP/MySQL per prenotazioni: limitare il numero massimo di posti prenotabili PHP 20
L tipo boolean non funzionante su mariadb (mysql). E codice php 7.4. PHP 0
U PHP creare un file excel dopo ricerca nel DB PHP 0
M PHP/MySQL - Estrarre valori min e max di ogni gruppo PHP 5
F Php e fatturazione elettronica PHP 0
P lanciare script asp (o php) da jquery Javascript 1
Couting95 inserire dati da un file di testo in una tabella in php PHP 1
P Data scraping in PHP non funziona PHP 4
C Calcoli matematici in php PHP 5
F Scrivere dei dati in word con php PHP 0
D PHP leggere cartella di Windows PHP 1
I dominio aruba versione php server linux Domini 3
G Colorare menu select attraverso ricerca php PHP 0
L PHP motore di ricerca nel sito PHP 1
S PHP e Mysqli PHP 0
Y Stampare da php su un foglio A6 attraverso una stampante esterna PHP 1
M Visulizzare immagine con php PHP 8
G [PHP] Creare script di prenotazione con controllo disponibilità. PHP 7
G leggere file txt e stampare con php il contenuto a video PHP 7
F Ricreare struttura php+mysql su Xampp Apache 0
Z PHP.INI - STMP per invio email con PHP Server Dedicati e VPS 0
M Array associativi php su 2 campi mysql PHP 10
G Invio form con PHP PHP 3

Discussioni simili