Miglioramenti API e documentazione
Modifica della struttura delle risposte JSON dell'API.
This commit is contained in:
parent
530ceaabf4
commit
a97fac4cba
14
README.md
14
README.md
|
@ -131,20 +131,6 @@ Siamo presenti su [Facebook](https://www.facebook.com/openstamanager), e il nost
|
||||||
|
|
||||||
Per poter contribuire, si consiglia di seguire le indicazioni descritte all'interno della [documentazione ufficiale](https://devcode-it.github.io/openstamanager/contribuire.html).
|
Per poter contribuire, si consiglia di seguire le indicazioni descritte all'interno della [documentazione ufficiale](https://devcode-it.github.io/openstamanager/contribuire.html).
|
||||||
|
|
||||||
Le impostazione di base per il codice sono disponibili attraverso [editor config](https://github.com/devcode-it/openstamanager/blob/master/.editorconfig) per l'utilizzo semplificato negli editor più comuni.
|
|
||||||
Maggiori informazioni sulla configurazione e sul plugin sono disponibili nel sito <http://editorconfig.org>.
|
|
||||||
|
|
||||||
Per eseguire i test del progetto è necessario seguire le seguenti istruzioni (https://codeception.com/docs/modules/WebDriver):
|
|
||||||
- Scaricare (Selenium Server)[https://docs.seleniumhq.org/download/] e salvarlo come `selenium-server-standalone.jar`
|
|
||||||
- Scaricare (ChromeDriver)[https://sites.google.com/a/chromium.org/chromedriver/getting-started]
|
|
||||||
- Su Windows, aggiungere l'eseguibile al PATH
|
|
||||||
- Configurare localmente Codeception nel file `codeception.yml`
|
|
||||||
- Eseguire su shell differenti i seguenti comandi:
|
|
||||||
```bash
|
|
||||||
npm run tests-server
|
|
||||||
npm run tests-OSM
|
|
||||||
```
|
|
||||||
|
|
||||||
## Sviluppatori
|
## Sviluppatori
|
||||||
|
|
||||||
- **Fabio Lovato**, il fondatore ([loviuz](https://github.com/loviuz))
|
- **Fabio Lovato**, il fondatore ([loviuz](https://github.com/loviuz))
|
||||||
|
|
|
@ -28,7 +28,7 @@ $element['edit_file'] = !empty($php) ? $php : $html;
|
||||||
|
|
||||||
$upload_dir = DOCROOT.'/'.Uploads::getDirectory($id_module, $id_plugin);
|
$upload_dir = DOCROOT.'/'.Uploads::getDirectory($id_module, $id_plugin);
|
||||||
|
|
||||||
//$dbo->query('START TRANSACTION');
|
$database->beginTransaction();
|
||||||
|
|
||||||
// GESTIONE UPLOAD
|
// GESTIONE UPLOAD
|
||||||
if (filter('op') == 'link_file' || filter('op') == 'unlink_file') {
|
if (filter('op') == 'link_file' || filter('op') == 'unlink_file') {
|
||||||
|
@ -242,4 +242,4 @@ if (Modules::getPermission($id_module) == 'rw') {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//$dbo->query('COMMIT');
|
$database->commitTransaction();
|
||||||
|
|
|
@ -36,48 +36,50 @@ try {
|
||||||
switch ($method) {
|
switch ($method) {
|
||||||
// Richiesta PUT (modifica elementi)
|
// Richiesta PUT (modifica elementi)
|
||||||
case 'PUT':
|
case 'PUT':
|
||||||
$result = $api->update($request);
|
$response = $api->update($request);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// Richiesta POST (creazione elementi)
|
// Richiesta POST (creazione elementi)
|
||||||
case 'POST':
|
case 'POST':
|
||||||
$result = $api->create($request);
|
$response = $api->create($request);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// Richiesta GET (ottenimento elementi)
|
// Richiesta GET (ottenimento elementi)
|
||||||
case 'GET':
|
case 'GET':
|
||||||
// Risorsa specificata
|
// Risorsa specificata
|
||||||
if (count($request) > 1) {
|
if (count($request) > 1) {
|
||||||
$result = $api->retrieve($request);
|
$response = $api->retrieve($request);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Risorsa non specificata (lista delle risorse disponibili)
|
// Risorsa non specificata (lista delle risorse disponibili)
|
||||||
else {
|
else {
|
||||||
$result = API::response(API::getResources()['retrieve']);
|
$response = API::response([
|
||||||
|
'resources' => array_keys(API::getResources()['retrieve']),
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// Richiesta DELETE (eliminazione elementi)
|
// Richiesta DELETE (eliminazione elementi)
|
||||||
case 'DELETE':
|
case 'DELETE':
|
||||||
$result = $api->delete($request);
|
$response = $api->delete($request);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} catch (InvalidArgumentException $e) {
|
} catch (InvalidArgumentException $e) {
|
||||||
$result = API::error('unauthorized');
|
$response = API::error('unauthorized');
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
// Log dell'errore
|
// Log dell'errore
|
||||||
$logger = logger();
|
$logger = logger();
|
||||||
$logger->addRecord(\Monolog\Logger::ERROR, $e);
|
$logger->addRecord(\Monolog\Logger::ERROR, $e);
|
||||||
|
|
||||||
$result = API::error('serverError');
|
$response = API::error('serverError');
|
||||||
}
|
}
|
||||||
|
|
||||||
// Richiesta OPTIONS (controllo da parte del dispositivo)
|
// Richiesta OPTIONS (controllo da parte del dispositivo)
|
||||||
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
|
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
|
||||||
$result = API::error('ok');
|
$response = API::error('ok');
|
||||||
}
|
}
|
||||||
|
|
||||||
json_decode($result);
|
json_decode($response);
|
||||||
|
|
||||||
// Impostazioni di Content-Type e Charset Header
|
// Impostazioni di Content-Type e Charset Header
|
||||||
if (json_last_error() == JSON_ERROR_NONE) {
|
if (json_last_error() == JSON_ERROR_NONE) {
|
||||||
|
@ -87,4 +89,4 @@ if (json_last_error() == JSON_ERROR_NONE) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Stampa dei risultati
|
// Stampa dei risultati
|
||||||
echo $result;
|
echo $response;
|
||||||
|
|
13
docs/API.md
13
docs/API.md
|
@ -44,7 +44,7 @@ Nel caso, a seguito dell'installazione di OpenSTAManager, venisse aggiornato il
|
||||||
|
|
||||||
## Standard di comunicazione
|
## Standard di comunicazione
|
||||||
|
|
||||||
Il funzionamento dell'API si basa fondamentalmente sull'utilizzo di una chiave di accesso, ospitata all'interno della tabella `zz_tokens` del database del progetto, univoca per ogni istanza dell'utente.
|
Il funzionamento dell'API si basa fondamentalmente sull'utilizzo di una chiave di accesso univoca per ogni dispositivo, ospitata all'interno della tabella `zz_tokens` del database del progetto.
|
||||||
|
|
||||||
Ogni richiesta all'API deve contenere la chiave di accesso (campo `token`) e l'operazione richiesta (campo `resource`), inserendo questi elementi tra gli ulteriori contenuti che si intendono inviare.
|
Ogni richiesta all'API deve contenere la chiave di accesso (campo `token`) e l'operazione richiesta (campo `resource`), inserendo questi elementi tra gli ulteriori contenuti che si intendono inviare.
|
||||||
I contenuti della richiesta devono quindi essere convertiti in formato JSON ed inviati all'API secondo uno specifico schema:
|
I contenuti della richiesta devono quindi essere convertiti in formato JSON ed inviati all'API secondo uno specifico schema:
|
||||||
|
@ -87,14 +87,17 @@ In particolare, sono presenti i seguenti _status_:
|
||||||
|
|
||||||
### Lettura
|
### Lettura
|
||||||
|
|
||||||
Le richieste di lettura sono solitamente completate con l'invio di un numero predefinito di informazioni.
|
Le richieste di lettura sono solitamente completate con un numero predefinito di informazioni.
|
||||||
Per poter interpretare correttamente i dati, si devono ignorare gli indici numerici di primo livello (non rilevanti all'interno del formato) e sfruttare in particolare i seguenti campi generici:
|
Per poter interpretare correttamente i dati, si devono sfruttare in particolare i seguenti campi generici:
|
||||||
|
|
||||||
- `records`, rappresentante il numero totale dei record richiesti;
|
- `records`: elenco dei record presenti nella pagina richiesta (parametro `page`);
|
||||||
- `pages`, indicante il numero totale della pagine disponibili.
|
- `total-count`: numero totale dei record;
|
||||||
|
- `pages`: numero della pagine disponibili.
|
||||||
|
|
||||||
Si ricorda che l'API prevede la restituzione di un insieme di dati limitato rispetto alla richiesta effettuatua: per ottenere l'intero insieme di informazioni è necessario eseguire molteplici richieste consecutive basate sul campo `page`.
|
Si ricorda che l'API prevede la restituzione di un insieme di dati limitato rispetto alla richiesta effettuatua: per ottenere l'intero insieme di informazioni è necessario eseguire molteplici richieste consecutive basate sul campo `page`.
|
||||||
|
|
||||||
|
La lunghezza delle pagine dell'API viene definita dall'impostazione *Lunghezza pagine per API*, modificabile esclusivamente all'interno della tabella `zz_settings`.
|
||||||
|
|
||||||
## Personalizzazione
|
## Personalizzazione
|
||||||
|
|
||||||
L'API sfrutta una struttura modulare per poter funzionare in modo completo e garantire al tempo stesso il possibile ampliamento delle sue funzioni.
|
L'API sfrutta una struttura modulare per poter funzionare in modo completo e garantire al tempo stesso il possibile ampliamento delle sue funzioni.
|
||||||
|
|
|
@ -59,7 +59,7 @@ E' possibile effettuare la migrazione da una qualsiasi versione 1.x alla nuova 2
|
||||||
- Copiare il file `config.inc.php`
|
- Copiare il file `config.inc.php`
|
||||||
- Copiare la cartella `files/`
|
- Copiare la cartella `files/`
|
||||||
- Copiare i contenuti della cartella `/modules/magazzino/articoli/images/` in `/files/articoli/`
|
- Copiare i contenuti della cartella `/modules/magazzino/articoli/images/` in `/files/articoli/`
|
||||||
- Copiare la cartella `templates/` (mantenendo però i file `pdfgen.php` e `pdfgen_variables.php` di della versione 2.0)
|
- Copiare la cartella `templates/` (mantenendo però i file `pdfgen.php` e `pdfgen_variables.php` della versione 2.0)
|
||||||
|
|
||||||
Dopo l'esecuzione di queste azioni, il gestionale renderà disponibile l'interfaccia di aggiornamento.
|
Dopo l'esecuzione di queste azioni, il gestionale renderà disponibile l'interfaccia di aggiornamento.
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,7 @@ currentMenu: contribuire
|
||||||
Sei interessato a contribuire allo sviluppo di OpenSTAManger? Ottimo, sei il benvenuto!
|
Sei interessato a contribuire allo sviluppo di OpenSTAManger? Ottimo, sei il benvenuto!
|
||||||
|
|
||||||
Siamo entusiasti di ogni nuova contribuzione che otteniamo dalla nostra community.
|
Siamo entusiasti di ogni nuova contribuzione che otteniamo dalla nostra community.
|
||||||
Ci sono molti modi per contribuire: segnalare bug, richiedere miglioramenti, scrivere tutorial, migliorare la documentazione...
|
Ci sono molti modi per contribuire: segnalare bug, richiedere miglioramenti, scrivere tutorial, migliorare la documentazione, ...
|
||||||
|
|
||||||
Non serve essere degli esperti programmatori per aiutarci! :smile_cat:
|
Non serve essere degli esperti programmatori per aiutarci! :smile_cat:
|
||||||
|
|
||||||
|
@ -69,3 +69,17 @@ Se sei in grado di risolvere uno dei bug segnalati oppure vuoi completare una nu
|
||||||
Siamo presenti su [Facebook](https://www.facebook.com/openstamanager), e il nostro forum ufficiale è disponibile all'indirizzo <http://www.openstamanager.com/forum/>.
|
Siamo presenti su [Facebook](https://www.facebook.com/openstamanager), e il nostro forum ufficiale è disponibile all'indirizzo <http://www.openstamanager.com/forum/>.
|
||||||
|
|
||||||
Cerchiamo di essere disponibili quanto possibile, ma non sempre riusciamo a rispondere tempestivamente.
|
Cerchiamo di essere disponibili quanto possibile, ma non sempre riusciamo a rispondere tempestivamente.
|
||||||
|
|
||||||
|
## Testing
|
||||||
|
|
||||||
|
Il progetto presenta, a partire dalla versione 2.4.2, un insieme di test per facilitare il controllo sul corretto funzionamento del gestionale.
|
||||||
|
|
||||||
|
Per eseguire i test è necessario seguire le seguenti istruzioni (https://codeception.com/docs/modules/WebDriver):
|
||||||
|
- Scaricare (Selenium Server)[https://docs.seleniumhq.org/download/] e salvarlo come `selenium-server-standalone.jar` nella cartella principale
|
||||||
|
- Scaricare (ChromeDriver)[https://sites.google.com/a/chromium.org/chromedriver/getting-started], rendendolo eseguibile da riga di comando (su Windows, aggiungerlo al PATH)
|
||||||
|
- Configurare localmente Codeception nel file `codeception.yml` con l'URL del web server locale
|
||||||
|
- Eseguire su shell differenti i seguenti comandi:
|
||||||
|
```bash
|
||||||
|
npm run tests-server # Avvia i server per i test di funzionamento grafico
|
||||||
|
npm run tests-OSM # Avvia i test
|
||||||
|
```
|
||||||
|
|
|
@ -8,7 +8,8 @@ currentMenu: moduli
|
||||||
>
|
>
|
||||||
> \-- <cite>[Wikipedia](https://it.wikipedia.org/wiki/Modulo#Informatica)</cite>
|
> \-- <cite>[Wikipedia](https://it.wikipedia.org/wiki/Modulo#Informatica)</cite>
|
||||||
|
|
||||||
All'interno del progetto, i moduli vengono genericamente definiti quali sistemi di gestione delle funzionalità del gestionale; proprio per questo, la loro struttura e composizione risulta spesso variabile e differenziata, presentando componenti uniche e talvolta complesse.
|
All'interno del progetto, i moduli vengono genericamente definiti quali sistemi di gestione delle funzionalità del gestionale; proprio per questo, la loro struttura e composizione risulta spesso variabile e differenziata.
|
||||||
|
|
||||||
Ogni modulo è composto da diverse sezioni, generalmente suddivise in:
|
Ogni modulo è composto da diverse sezioni, generalmente suddivise in:
|
||||||
|
|
||||||
- Nucleo;
|
- Nucleo;
|
||||||
|
@ -16,9 +17,9 @@ Ogni modulo è composto da diverse sezioni, generalmente suddivise in:
|
||||||
- [Widget](Widget.md);
|
- [Widget](Widget.md);
|
||||||
- [Plugin](Plugin.md).
|
- [Plugin](Plugin.md).
|
||||||
|
|
||||||
Inoltre, OpenSTAManager presenta una struttura nativamente preposta alla personalizzazione delle proprie funzioni, che rende il progetto ancora più complicato da comprendere a prima vista.
|
OpenSTAManager presenta inoltre una struttura nativamente predisposta alla personalizzazione delle funzioni principali, il che rende il progetto ancora più complicato da comprendere a prima vista.
|
||||||
|
|
||||||
Segue un'analisi della struttura fisica e logica del nucleo dei moduli supportati dal gestionale; per ulteriori informazioni e approfondimenti, si consiglia di osservare l'effettiva composizione dei moduli implementati in modo ufficiale.
|
Di seguito viene presentate le strutture principali più comuni supportate dal gestionale; per ulteriori approfondimenti, si consiglia di controllare il codice sorgente dei moduli ufficiali.
|
||||||
|
|
||||||
<!-- TOC depthFrom:2 depthTo:6 orderedList:false updateOnSave:true withLinks:true -->
|
<!-- TOC depthFrom:2 depthTo:6 orderedList:false updateOnSave:true withLinks:true -->
|
||||||
|
|
||||||
|
@ -48,28 +49,30 @@ Segue un'analisi della struttura fisica e logica del nucleo dei moduli supportat
|
||||||
|
|
||||||
## Struttura
|
## Struttura
|
||||||
|
|
||||||
La sezione fondamentale di un qualsiasi modulo all'interno di OpenSTAManager risulta presenta all'interno della cartella `modules`, che contiene tutti i file su cui si basano tutti i moduli per funzionare correttamente.
|
Il codice sorgente di ogni modulo di OpenSTAManager è all'interno di un percorso univoco all'interno della cartella **modules**.
|
||||||
In questo contensto, ogni modulo possiede una cartella univoca per gestire i propri contenuti in modo indipendente ma comunque sottoposto alla seguente struttura di base.
|
|
||||||
|
|
||||||
.
|
.
|
||||||
└── modulo
|
└── modules
|
||||||
├── actions.php
|
└── modulo
|
||||||
├── add.php
|
├── actions.php
|
||||||
├── controller_after.php
|
├── add.php
|
||||||
├── controller_before.php
|
├── controller_after.php
|
||||||
├── edit.php
|
├── controller_before.php
|
||||||
├── init.php
|
├── edit.php
|
||||||
└── modutil.php
|
├── init.php
|
||||||
|
└── modutil.php
|
||||||
|
|
||||||
Il gestionale supporta in modo nativo questa struttura, che può essere ampliata e personalizzata a necessità dagli sviluppatori: si consiglia pertanto di analizzare la struttuta dei moduli **Iva**, **Dashboard** e **Contratti** per esempi di diversa complessità e funzione.
|
Il gestionale supporta in modo nativo questa struttura, che può essere ampliata e personalizzata secondo le proprie necessità: si consiglia pertanto di analizzare i moduli **Iva**, **Dashboard** e **Contratti** per esempi di diversa complessità.
|
||||||
|
|
||||||
**Attenzione**: la presenza dei file sopra indicati non è strettamente necessaria per il funzionamento di un modulo (si veda **Movimenti**, presente esclusivamente a livello di database).
|
> **Attenzione**: la presenza dei file sopra indicati è necessaria esclusivamente per i *moduli fisici*, cioè moduli che presentano la necessità di interagire con il codice sorgente e modificare i dati del gestionale.
|
||||||
|
>
|
||||||
|
> Per moduli presenti esclusivamente a livello di database (per sempio, **Movimenti**), si veda la sezione [Database](#database).
|
||||||
|
|
||||||
### actions.php
|
### actions.php
|
||||||
|
|
||||||
Il file `actions.php` gestisce tutte le operazioni supportate dal modulo.
|
Il file `actions.php` gestisce tutte le operazioni supportate dal modulo.
|
||||||
|
|
||||||
In generale, le diverse operazioni vengono gestite attraverso attraverso una logica programmativa basata su casi (solitamente, il parametro `op` permette di identificare quale azione viene richiesta); il funzionamento a livello di programmazione può essere comunque sottoposto a scelte personali.
|
In generale, le diverse operazioni vengono gestite attraverso attraverso una logica basata su casi (solitamente, il parametro `op` permette di identificare quale azione viene richiesta); il funzionamento a livello di programmazione può essere comunque sottoposto a scelte personali.
|
||||||
|
|
||||||
L'unico requisito effettivo risulta relativo alle operazioni di creazione dei nuovi record, per cui deve essere definito all'interno della variabile `$id_record` l'identificativo del nuovo elemento.
|
L'unico requisito effettivo risulta relativo alle operazioni di creazione dei nuovi record, per cui deve essere definito all'interno della variabile `$id_record` l'identificativo del nuovo elemento.
|
||||||
Per osservare questo sistema, si consiglia di analizzare il relativo file del modulo **Iva**.
|
Per osservare questo sistema, si consiglia di analizzare il relativo file del modulo **Iva**.
|
||||||
|
@ -78,28 +81,32 @@ Per osservare questo sistema, si consiglia di analizzare il relativo file del mo
|
||||||
|
|
||||||
Il file `add.php` contiene il template HTML dedicato all'inserimento di nuovi elementi per il modulo, mentre `edit.php` contiene il template HTML dedicato alla modifica degli stessi.
|
Il file `add.php` contiene il template HTML dedicato all'inserimento di nuovi elementi per il modulo, mentre `edit.php` contiene il template HTML dedicato alla modifica degli stessi.
|
||||||
|
|
||||||
In base alla configurazione del modulo nel database, il file `edit.php` può assumere il ruolo di gestore della sezione principale dell'interno modulo, permettendo così la personalizzazione dei contenuti come si può notare per i moduli **Dashboard** e **Gestione componenti**.
|
In base alla configurazione del modulo nel database, il file `edit.php` può assumere il ruolo di gestore della sezione principale dell'interno modulo.
|
||||||
|
Esempi di questa gestione si possono osservare nei moduli **Dashboard** e **Gestione componenti** (si veda la sezione [zz_modules](#zzmodules)).
|
||||||
|
|
||||||
**Attenzione**: il progetto individua in automatico la presenza di questo file e agisce di conseguenza per permettere o meno l'inserimento di nuovi valori.
|
> **Attenzione**: il progetto individua in automatico la presenza del file `add.php` e agisce di conseguenza per permettere o meno l'inserimento di nuovi record.
|
||||||
|
|
||||||
### init.php
|
### init.php
|
||||||
|
|
||||||
Il file `init.php` si occupa di individuare le informazioni principali utili all'identificazione e alla modifica dei singoli elementi del modulo.
|
Il file `init.php` si occupa di individuare le informazioni principali utili all'identificazione e alla modifica dei singoli elementi del modulo.
|
||||||
In particolare, questi file sono solitamente composti da una query dedicata ad ottenere tutti i dati dell'elemento nella variabile `$records`, successivamente utilizzata dal gestore dei template per completare le informazioni degli input.
|
|
||||||
|
In particolare, questo file è solitamente composto da una query dedicata ad ottenere tutti i dati dell'elemento nella variabile `$record` (`$records` per versioni <= 2.4.1), successivamente utilizzata dal gestore dei template per completare le informazioni degli input.
|
||||||
|
|
||||||
### controller_after.php e controller_before.php
|
### controller_after.php e controller_before.php
|
||||||
|
|
||||||
Il file `controller_after.php` contiene le funzioni javaScript aggiuntive specifiche del modulo.
|
Il file `controller_before.php` contiene il template HTML da aggiungere all'inizio della pagina principale del modulo se questo è strutturato in modo tabellare.
|
||||||
|
|
||||||
|
Similmente, il file `controller_after.php` contiene il template HTML da aggiungere alla fine della pagina principale nelle stesse condizioni.
|
||||||
|
|
||||||
### modutil.php
|
### modutil.php
|
||||||
|
|
||||||
Il file `modutil.php` viene utilizzato per definire le funzioni PHP specifiche per il modulo, e permettere in questo modo uan gestione semplificata delle operazioni più comuni.
|
Il file `modutil.php` viene utilizzato per definire le funzioni PHP specifiche del modulo, e permettere in questo modo una gestione semplificata delle operazioni più comuni.
|
||||||
|
|
||||||
Si noti che un modulo non è necessariamente limitato all'utilizzo del proprio file `modutil.php`: come avviene per esempio in **Fatture** e **Interventi**, risulta possibile richiamare file di questa tipologia da altri moduli (in questo caso, da **Articoli** per la gestione delle movimentazioni di magazzino).
|
Si noti che un modulo non è necessariamente limitato all'utilizzo del proprio file `modutil.php`: come avviene per esempio in **Fatture** e **Interventi**, risulta possibile richiamare file di questa tipologia da altri moduli (in questo caso, da **Articoli** per la gestione delle movimentazioni di magazzino).
|
||||||
|
|
||||||
## Database
|
## Database
|
||||||
|
|
||||||
All'interno del database del progetto, le tabelle con il suffisso `zz` sono generalmente dedicate alla gestione delle funzioni di base del gestionale, finalizzate in particolare all'utilizzo dei moduli installati.
|
All'interno del database del progetto, le tabelle con il suffisso `zz` sono generalmente dedicate alla gestione delle funzioni di base del gestionale.
|
||||||
|
|
||||||
La gestione dei moduli avviene in questo senso grazie alle seguenti tabelle:
|
La gestione dei moduli avviene in questo senso grazie alle seguenti tabelle:
|
||||||
|
|
||||||
|
@ -113,8 +120,8 @@ La gestione dei moduli avviene in questo senso grazie alle seguenti tabelle:
|
||||||
|
|
||||||
La tabella `zz_modules` contiene tutte le informazioni dei diversi moduli installati nel gestionale in uso, con particolare riferimento a:
|
La tabella `zz_modules` contiene tutte le informazioni dei diversi moduli installati nel gestionale in uso, con particolare riferimento a:
|
||||||
|
|
||||||
- Nome (utilizzato a livello di programmazione) [`name`]
|
- Nome (utilizzato a livello di codice) [`name`]
|
||||||
- Titolo (visibile e personalizzabile) [`title`]
|
- Titolo (nome visibile e personalizzabile) [`title`]
|
||||||
- Percorso nel file system (partendo da `modules/`) [`directory`]
|
- Percorso nel file system (partendo da `modules/`) [`directory`]
|
||||||
- Icona [`icon`]
|
- Icona [`icon`]
|
||||||
- Posizione nella sidebar [`order`]
|
- Posizione nella sidebar [`order`]
|
||||||
|
@ -122,7 +129,8 @@ La tabella `zz_modules` contiene tutte le informazioni dei diversi moduli instal
|
||||||
- Query di default [`options`]
|
- Query di default [`options`]
|
||||||
- Query personalizzata [`options2`]
|
- Query personalizzata [`options2`]
|
||||||
|
|
||||||
Gli ultimi due attributi si rivelano di fondamentale importanza per garantire il corretto funzionamento del modulo, poiché descrivono il comportamento dello stesso per la generazione della schermata principale nativa di OpenSTAManager.
|
Gli ultimi due attributi si rivelano di fondamentale importanza per garantire il corretto funzionamento del modulo, poiché descrivono il comportamento dello stesso per la generazione della schermata principale nativa in OpenSTAManager.
|
||||||
|
|
||||||
Sono permessi i seguenti valori:
|
Sono permessi i seguenti valori:
|
||||||
|
|
||||||
- custom [Modulo con schermata principale personalizzata e definita nel file `edit.php`]
|
- custom [Modulo con schermata principale personalizzata e definita nel file `edit.php`]
|
||||||
|
@ -131,18 +139,18 @@ Sono permessi i seguenti valori:
|
||||||
- Oggetto JSON
|
- Oggetto JSON
|
||||||
|
|
||||||
```json
|
```json
|
||||||
{ "main_query": [ { "type": "table", "fields": "Nome, Descrizione", "query": "SELECT `id`, `nome` AS `Nome`, `descrizione` AS `Descrizione` FROM `tabella` HAVING 1=1 ORDER BY `nome`"} ]}
|
{ "main_query": [ { "type": "table", "fields": "Nome, Descrizione", "query": "SELECT `id`, `nome` AS `Nome`, `descrizione` AS `Descrizione` FROM `tabella` WHERE 2=2 HAVING 1=1 ORDER BY `nome`"} ]}
|
||||||
```
|
```
|
||||||
|
|
||||||
- Query SQL \[vedasi la tabella [zz_views](#zz_views-e-zz_group_view)]
|
- Query SQL \[vedasi la tabella [zz_views](#zz_views-e-zz_group_view)]
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
SELECT |select| FROM `tabella` HAVING 1=1
|
SELECT |select| FROM `tabella` WHERE 2=2 HAVING 1=1
|
||||||
```
|
```
|
||||||
|
|
||||||
### zz_permissions e zz_group_module
|
### zz_permissions e zz_group_module
|
||||||
|
|
||||||
La tabella `zz_permissions` contiene i permessi di accesso dei vari gruppi ai diversi moduli, mentre la tabella `zz_group_module` contiene le clausole DQL per permettere questo accesso.
|
La tabella `zz_permissions` contiene i permessi di accesso dei vari gruppi ai diversi moduli, mentre la tabella `zz_group_module` contiene le clausole SQL per eventualmente restringere questo accesso.
|
||||||
|
|
||||||
### zz_views e zz_group_view
|
### zz_views e zz_group_view
|
||||||
|
|
||||||
|
@ -150,13 +158,15 @@ Le tabelle `zz_views` e `zz_group_view` vengono utilizzate dal gestionale per la
|
||||||
|
|
||||||
### zz_plugins e zz_widgets
|
### zz_plugins e zz_widgets
|
||||||
|
|
||||||
La tabella `zz_plugins` contiene l'elenco di plugins relativi ai diversi moduli, mentre la tabella `zz_group_module` contiene l'elenco di widgets dei vari moduli.
|
La tabella `zz_plugins` contiene l'elenco di plugins relativi ai diversi moduli, mentre la tabella `zz_widgets` contiene l'elenco di widgets dei vari moduli.
|
||||||
|
|
||||||
## Consigli per lo sviluppo
|
## Consigli per lo sviluppo
|
||||||
|
|
||||||
### Progettazione
|
### Progettazione
|
||||||
|
|
||||||
Alla base dello sviluppo di ogni modulo vi è una fase di analisi indirizzata all'individuazione dettagliata delle funzionalità dello stesso e della struttura interna al database atta a sostenere queste funzioni. Siete dunque pregati di identificare chiaramente tutte le caratteristiche del Vostro nuovo modulo o delle Vostre modifiche prima di iniziare lo sviluppo vero e proprio (comunemente identificato con la scrittura del codice).
|
Alla base dello sviluppo di ogni modulo vi è una fase di analisi indirizzata all'individuazione dettagliata delle funzionalità dello stesso e della struttura interna al database atta a sostenere queste funzioni.
|
||||||
|
|
||||||
|
Siete dunque pregati di identificare chiaramente tutte le caratteristiche del Vostro nuovo modulo o delle Vostre modifiche prima di iniziare lo sviluppo vero e proprio (comunemente identificato con la scrittura del codice).
|
||||||
|
|
||||||
> E' bene trascurare le fasi di analisi e di progetto e precipitarsi all'implementazione allo scopo di guadagnare il tempo necessario per rimediare agli errori commessi per aver trascurato la fase di analisi e di progetto.
|
> E' bene trascurare le fasi di analisi e di progetto e precipitarsi all'implementazione allo scopo di guadagnare il tempo necessario per rimediare agli errori commessi per aver trascurato la fase di analisi e di progetto.
|
||||||
>
|
>
|
||||||
|
@ -164,11 +174,12 @@ Alla base dello sviluppo di ogni modulo vi è una fase di analisi indirizzata al
|
||||||
|
|
||||||
### Sviluppo
|
### Sviluppo
|
||||||
|
|
||||||
Lo sviluppo del codice deve seguire alcune direttive generali per la corretta interpretazione del codice all'interno del gestionale: ciò comporta una struttura di base fondata sui file precedentemente indicati nella sezione [Cartella `modules`](#Cartella_modules) ma ampliabile liberamente.
|
Lo sviluppo del codice deve seguire alcune direttive generali per la corretta interpretazione del codice all'interno del gestionale: ciò comporta una struttura di base fondata sui file precedentemente indicati nella sezione [Struttura](#struttura) ma ampliabile liberamente.
|
||||||
|
|
||||||
### Test
|
### Test
|
||||||
|
|
||||||
Prima di pubblicare un modulo si consiglia di effettuare svariati test in varie installazioni. Siete inoltre pregati di indicare i bug noti.
|
Prima di pubblicare un modulo si consiglia di effettuare svariati test in varie installazioni.
|
||||||
|
Siete inoltre pregati di indicare i bug noti.
|
||||||
|
|
||||||
> Se c’è una remota possibilità che qualcosa vada male, sicuramente ciò accadrà e produrrà il massimo danno.
|
> Se c’è una remota possibilità che qualcosa vada male, sicuramente ciò accadrà e produrrà il massimo danno.
|
||||||
>
|
>
|
||||||
|
@ -185,11 +196,11 @@ L'installazione di un modulo è completabile in modo automatico seguendo la segu
|
||||||
|
|
||||||
Si ricorda che per effettuare l'installazione è necessaria la presenza dell'estensione `php_zip` (per ulteriori informazioni guardare [qui](http://php.net/manual/it/zip.installation.php)).
|
Si ricorda che per effettuare l'installazione è necessaria la presenza dell'estensione `php_zip` (per ulteriori informazioni guardare [qui](http://php.net/manual/it/zip.installation.php)).
|
||||||
|
|
||||||
**Attenzione**: la procedura può essere completata anche a livello manuale, ma si consiglia di evitare tale sistema a meno che non si conosca approfonditamente il funzionamento complessivo e specifico del database del progetto.
|
> **Attenzione**: la procedura può essere completata anche a livello manuale, ma si consiglia di evitare tale sistema a meno che non si conosca approfonditamente il procedimento di installazione gestito da OpenSTAManager.
|
||||||
|
|
||||||
### Archivio ZIP
|
### Archivio ZIP
|
||||||
|
|
||||||
L'archivio scaricato deve contenere direttamente al proprio interno i contenuti del modulo da installare, organizzati secondo la seguente struttura:
|
L'archivio del modulo deve essere organizzato secondo la seguente struttura:
|
||||||
|
|
||||||
modulo.zip
|
modulo.zip
|
||||||
├── update
|
├── update
|
||||||
|
@ -202,11 +213,11 @@ Alcuni esempi sulla struttura dei moduli personalizzati sono disponibili nella r
|
||||||
|
|
||||||
#### update/VERSIONE.sql
|
#### update/VERSIONE.sql
|
||||||
|
|
||||||
Il file `VERSIONE.sql` (dove VERSIONE sta per la versione del modulo con `_`[underscore] al posto di `.`[punto]) contiene le operazioni di installazione del modulo a livello del database, comprendenti la creazione delle tabelle di base del modulo e l'inserimento di ulteriori dati nelle altre tabelle.
|
Il file `VERSIONE.sql` (dove VERSIONE sta per la versione del modulo con `_`[underscore] al posto di `.`[punto]) contiene le operazioni di installazione e aggiornamento del modulo a livello del database, comprendenti la creazione delle tabelle di base del modulo e l'inserimento di ulteriori dati nelle altre tabelle.
|
||||||
|
|
||||||
#### update/unistall.php
|
#### update/unistall.php
|
||||||
|
|
||||||
Il file `unistall.php` contiene le operazioni di disinstallazione del modulo a livello del database, comprendenti l'eliminazione delle tabelle non più necessarie e dei dati inutilizzati.
|
Il file `unistall.php` contiene le operazioni di disinstallazione del modulo a livello del database, e deve prevedere l'eliminazione delle tabelle non più necessarie e dei dati inutilizzati.
|
||||||
|
|
||||||
```php
|
```php
|
||||||
<?php
|
<?php
|
||||||
|
@ -215,7 +226,6 @@ include_once __DIR__.'/../../core.php';
|
||||||
|
|
||||||
$dbo->query("DROP TABLE `tabella`");
|
$dbo->query("DROP TABLE `tabella`");
|
||||||
|
|
||||||
?>
|
|
||||||
```
|
```
|
||||||
|
|
||||||
#### MODULE
|
#### MODULE
|
||||||
|
@ -224,17 +234,17 @@ Il file `MODULE` è infine il diretto responsabile dell'installazione del modulo
|
||||||
|
|
||||||
```ini
|
```ini
|
||||||
name = "Nome del modulo"
|
name = "Nome del modulo"
|
||||||
version = "Versione del modulo"
|
version = "Versione"
|
||||||
directory = "Cartella di installazione del modulo"
|
directory = "Cartella di installazione"
|
||||||
options = "Operazione da eseguire all'apertura del modulo"
|
options = "Operazione da eseguire all'apertura"
|
||||||
icon = "Icona del modulo (Font-Awesome)"
|
compatibility = "Versioni di compatibilità"
|
||||||
compatibility = "Compatibilità del modulo"
|
compatibility = "Compatibilità del modulo"
|
||||||
parent = "Genitore del modulo"
|
parent = "Genitore del modulo"
|
||||||
```
|
```
|
||||||
|
|
||||||
## Moduli di base
|
## Moduli di base
|
||||||
|
|
||||||
Nella versione base del gestionale sono presenti, all'interno della cartella `modules`, i seguenti moduli.
|
Nella versione base del gestionale sono presenti, all'interno della cartella **modules**, i seguenti moduli.
|
||||||
|
|
||||||
.
|
.
|
||||||
├── aggiornamenti
|
├── aggiornamenti
|
||||||
|
|
|
@ -6,7 +6,45 @@ currentMenu: plugin
|
||||||
|
|
||||||
<!-- TOC depthFrom:2 depthTo:6 orderedList:false updateOnSave:true withLinks:true -->
|
<!-- TOC depthFrom:2 depthTo:6 orderedList:false updateOnSave:true withLinks:true -->
|
||||||
|
|
||||||
|
- [Installazione](#installazione)
|
||||||
|
- [Archivio ZIP](#archivio-zip)
|
||||||
|
- [update](#update)
|
||||||
|
- [PLUGIN](#plugin)
|
||||||
|
|
||||||
<!-- /TOC -->
|
<!-- /TOC -->
|
||||||
|
|
||||||
Pagina in costruzione.
|
Pagina in costruzione.
|
||||||
|
|
||||||
|
## Installazione
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### Archivio ZIP
|
||||||
|
|
||||||
|
L'archivio del modulo deve essere organizzato secondo la seguente struttura:
|
||||||
|
|
||||||
|
modulo.zip
|
||||||
|
├── ... - File contententi il codice del modulo
|
||||||
|
└── PLUGIN
|
||||||
|
|
||||||
|
Alcuni esempi sulla struttura dei moduli personalizzati sono disponibili nella repository https://github.com/devcode-it/example (download effettuabile da [qui](http://openstamanager.com/download/plugin_di_esempio.zip)).
|
||||||
|
|
||||||
|
#### update
|
||||||
|
|
||||||
|
Contrariamente ai moduli, i plugin non supportano la modifica del database in fase di installazione e aggiornamento.
|
||||||
|
|
||||||
|
#### PLUGIN
|
||||||
|
|
||||||
|
Il file `PLUGIN` è infine il diretto responsabile dell'installazione del modulo poiché definisce tutti i valori caratteristici dello stesso; in caso di sua assenza la cartella compressa viene considerata non corretta.
|
||||||
|
|
||||||
|
```ini
|
||||||
|
name = "Nome del plugin"
|
||||||
|
version = "Versione"
|
||||||
|
directory = "Cartella di installazione"
|
||||||
|
options = "Operazione da eseguire all'apertura"
|
||||||
|
icon = "Icona (Font-Awesome)"
|
||||||
|
compatibility = "Versioni di compatibilità"
|
||||||
|
module_from = "Nome del modulo di origine"
|
||||||
|
module_to = "Nome del modulo di destinazione e visualizzazione"
|
||||||
|
position = "Tipo di modulo (valori disponibili: tab)"
|
||||||
|
```
|
||||||
|
|
|
@ -11,7 +11,7 @@ switch ($resource) {
|
||||||
if (!empty($datas)) {
|
if (!empty($datas)) {
|
||||||
foreach ($datas as $data) {
|
foreach ($datas as $data) {
|
||||||
if (!in_array($data['TABLE_NAME'], $excluded)) {
|
if (!in_array($data['TABLE_NAME'], $excluded)) {
|
||||||
$results[$data['TABLE_NAME']] = $dbo->fetchArray('SELECT * FROM '.$data['TABLE_NAME'].$custom_where);
|
$response[$data['TABLE_NAME']] = $dbo->fetchArray('SELECT * FROM '.$data['TABLE_NAME'].$custom_where);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -48,7 +48,7 @@ switch ($resource) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$results[$table_name] = $total;
|
$response[$table_name] = $total;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,11 +43,6 @@ switch ($resource) {
|
||||||
an_anagrafiche.deleted_at IS NULL AND
|
an_anagrafiche.deleted_at IS NULL AND
|
||||||
an_anagrafiche.idanagrafica IN (SELECT idanagrafica FROM an_tipianagrafiche_anagrafiche WHERE idtipoanagrafica = (SELECT idtipoanagrafica FROM an_tipianagrafiche WHERE descrizione = 'Cliente'))
|
an_anagrafiche.idanagrafica IN (SELECT idanagrafica FROM an_tipianagrafiche_anagrafiche WHERE idtipoanagrafica = (SELECT idtipoanagrafica FROM an_tipianagrafiche WHERE descrizione = 'Cliente'))
|
||||||
ORDER BY an_anagrafiche.ragione_sociale";
|
ORDER BY an_anagrafiche.ragione_sociale";
|
||||||
|
|
||||||
$results = $dbo->fetchArray($query.' LIMIT '.($page * $length).', '.$length);
|
|
||||||
|
|
||||||
$results['records'] = $database->fetchNum($query);
|
|
||||||
$results['pages'] = $results['records'] / $length;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// Elenco sedi per l'applicazione
|
// Elenco sedi per l'applicazione
|
||||||
|
|
|
@ -36,8 +36,8 @@ switch ($resource) {
|
||||||
'informazioniaggiuntive' => $data['informazioni_aggiuntive'],
|
'informazioniaggiuntive' => $data['informazioni_aggiuntive'],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$results['id'] = $dbo->lastInsertedID();
|
$response['id'] = $dbo->lastInsertedID();
|
||||||
$results['codice'] = $codice;
|
$response['codice'] = $codice;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -15,12 +15,11 @@ switch ($resource) {
|
||||||
|
|
||||||
$rs = $dbo->fetchArray($query);
|
$rs = $dbo->fetchArray($query);
|
||||||
|
|
||||||
$results = [];
|
$response['custom'] = '';
|
||||||
$results['custom'] = '';
|
|
||||||
|
|
||||||
$results['custom'] .= "BEGIN:VCALENDAR\n";
|
$response['custom'] .= "BEGIN:VCALENDAR\n";
|
||||||
$results['custom'] .= 'VERSION:'.Update::getVersion()."\n";
|
$response['custom'] .= 'VERSION:'.Update::getVersion()."\n";
|
||||||
$results['custom'] .= "PRODID:-// OpenSTAManager\n";
|
$response['custom'] .= "PRODID:-// OpenSTAManager\n";
|
||||||
|
|
||||||
foreach ($rs as $r) {
|
foreach ($rs as $r) {
|
||||||
$richiesta = str_replace("\r\n", "\n", $r['richiesta']);
|
$richiesta = str_replace("\r\n", "\n", $r['richiesta']);
|
||||||
|
@ -29,18 +28,18 @@ switch ($resource) {
|
||||||
|
|
||||||
$r['summary'] = str_replace("\r\n", "\n", $r['summary']);
|
$r['summary'] = str_replace("\r\n", "\n", $r['summary']);
|
||||||
|
|
||||||
$results['custom'] .= "BEGIN:VEVENT\n";
|
$response['custom'] .= "BEGIN:VEVENT\n";
|
||||||
$results['custom'] .= 'UID:'.$r['idriga']."\n";
|
$response['custom'] .= 'UID:'.$r['idriga']."\n";
|
||||||
$results['custom'] .= 'DTSTAMP:'.date('Ymd').'T'.date('His')."\n";
|
$response['custom'] .= 'DTSTAMP:'.date('Ymd').'T'.date('His')."\n";
|
||||||
//$results['custom'] .= 'ORGANIZER;CN='.$azienda.':MAILTO:'.$email."\n";
|
//$response['custom'] .= 'ORGANIZER;CN='.$azienda.':MAILTO:'.$email."\n";
|
||||||
$results['custom'] .= 'DTSTART:'.date('Ymd', strtotime($r['orario_inizio'])).'T'.date('His', strtotime($r['orario_inizio']))."\n";
|
$response['custom'] .= 'DTSTART:'.date('Ymd', strtotime($r['orario_inizio'])).'T'.date('His', strtotime($r['orario_inizio']))."\n";
|
||||||
$results['custom'] .= 'DTEND:'.date('Ymd', strtotime($r['orario_fine'])).'T'.date('His', strtotime($r['orario_fine']))."\n";
|
$response['custom'] .= 'DTEND:'.date('Ymd', strtotime($r['orario_fine'])).'T'.date('His', strtotime($r['orario_fine']))."\n";
|
||||||
$results['custom'] .= 'SUMMARY:'.html_entity_decode($r['summary'])."\n";
|
$response['custom'] .= 'SUMMARY:'.html_entity_decode($r['summary'])."\n";
|
||||||
$results['custom'] .= 'DESCRIPTION:'.html_entity_decode($richiesta, ENT_QUOTES, 'UTF-8')."\n";
|
$response['custom'] .= 'DESCRIPTION:'.html_entity_decode($richiesta, ENT_QUOTES, 'UTF-8')."\n";
|
||||||
$results['custom'] .= "END:VEVENT\n";
|
$response['custom'] .= "END:VEVENT\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
$results['custom'] .= "END:VCALENDAR\n";
|
$response['custom'] .= "END:VCALENDAR\n";
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -90,11 +89,6 @@ switch ($resource) {
|
||||||
':period_end' => $period_end,
|
':period_end' => $period_end,
|
||||||
];
|
];
|
||||||
|
|
||||||
$results = $dbo->fetchArray($query.' LIMIT '.($page * $length).', '.$length, $parameters);
|
|
||||||
|
|
||||||
$results['records'] = $database->fetchNum($query, $parameters);
|
|
||||||
$results['pages'] = $results['records'] / $length;
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// Elenco sessioni dell'intervento per l'applicazione
|
// Elenco sessioni dell'intervento per l'applicazione
|
||||||
|
@ -115,11 +109,6 @@ switch ($resource) {
|
||||||
$parameters[':id_tecnico'] = $user['idanagrafica'];
|
$parameters[':id_tecnico'] = $user['idanagrafica'];
|
||||||
}
|
}
|
||||||
|
|
||||||
$results = $dbo->fetchArray($query.' LIMIT '.($page * $length).', '.$length, $parameters);
|
|
||||||
|
|
||||||
$results['records'] = $database->fetchNum($query, $parameters);
|
|
||||||
$results['pages'] = $results['records'] / $length;
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,19 +8,19 @@ switch ($resource) {
|
||||||
$token = Auth::getInstance()->getToken();
|
$token = Auth::getInstance()->getToken();
|
||||||
|
|
||||||
// Informazioni da restituire tramite l'API
|
// Informazioni da restituire tramite l'API
|
||||||
$results = $dbo->fetchArray('SELECT `ragione_sociale`, `codice`, `piva`, `codice_fiscale`, `indirizzo`, `citta`, `provincia`, (SELECT `nome` FROM `an_nazioni` WHERE `an_nazioni`.`id` = `an_anagrafiche`.`id_nazione`) AS nazione, `telefono`, `fax`, `cellulare`, `an_anagrafiche`.`email` FROM `zz_users` LEFT JOIN `an_anagrafiche` ON `an_anagrafiche`.`idanagrafica` = `zz_users`.`idanagrafica` WHERE `id` = '.prepare($user['id_utente']))[0];
|
$response['user'] = $dbo->fetchArray('SELECT `ragione_sociale`, `codice`, `piva`, `codice_fiscale`, `indirizzo`, `citta`, `provincia`, (SELECT `nome` FROM `an_nazioni` WHERE `an_nazioni`.`id` = `an_anagrafiche`.`id_nazione`) AS nazione, `telefono`, `fax`, `cellulare`, `an_anagrafiche`.`email` FROM `zz_users` LEFT JOIN `an_anagrafiche` ON `an_anagrafiche`.`idanagrafica` = `zz_users`.`idanagrafica` WHERE `id` = '.prepare($user['id_utente']))[0];
|
||||||
|
|
||||||
$results['token'] = $token;
|
$response['token'] = $token;
|
||||||
|
|
||||||
$results['version'] = Update::getVersion();
|
$response['version'] = Update::getVersion();
|
||||||
} else {
|
} else {
|
||||||
$results = [
|
$response = [
|
||||||
'status' => API::getStatus()['unauthorized']['code'],
|
'status' => API::getStatus()['unauthorized']['code'],
|
||||||
];
|
];
|
||||||
|
|
||||||
// Se è in corso un brute-force, aggiunge il timeout
|
// Se è in corso un brute-force, aggiunge il timeout
|
||||||
if (Auth::isBrute()) {
|
if (Auth::isBrute()) {
|
||||||
$results['timeout'] = Auth::getBruteTimeout();
|
$response['timeout'] = Auth::getBruteTimeout();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -32,7 +32,7 @@ switch ($resource) {
|
||||||
// Cancellazione della chiave
|
// Cancellazione della chiave
|
||||||
$database->query('DELETE FROM `zz_tokens` WHERE `token` = '.prepare($request['token']).' AND `id_utente` = '.prepare($user['id_utente']));
|
$database->query('DELETE FROM `zz_tokens` WHERE `token` = '.prepare($request['token']).' AND `id_utente` = '.prepare($user['id_utente']));
|
||||||
} else {
|
} else {
|
||||||
$results = [
|
$response = [
|
||||||
'status' => API::getStatus()['unauthorized']['code'],
|
'status' => API::getStatus()['unauthorized']['code'],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
29
src/API.php
29
src/API.php
|
@ -1,5 +1,6 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Classe per la gestione delle API del progetto.
|
* Classe per la gestione delle API del progetto.
|
||||||
*
|
*
|
||||||
|
@ -66,6 +67,8 @@ class API extends \Util\Singleton
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$response = [];
|
||||||
|
|
||||||
$table = '';
|
$table = '';
|
||||||
$select = '*';
|
$select = '*';
|
||||||
$where = [];
|
$where = [];
|
||||||
|
@ -130,7 +133,7 @@ class API extends \Util\Singleton
|
||||||
}
|
}
|
||||||
|
|
||||||
// Generazione automatica delle query
|
// Generazione automatica delle query
|
||||||
if (empty($results) && !empty($table)) {
|
if (!empty($table)) {
|
||||||
// Date di interesse
|
// Date di interesse
|
||||||
if (!empty($request['upd'])) {
|
if (!empty($request['upd'])) {
|
||||||
$where['#updated_at'] = 'updated_at >= '.prepare($request['upd']);
|
$where['#updated_at'] = 'updated_at >= '.prepare($request['upd']);
|
||||||
|
@ -140,16 +143,14 @@ class API extends \Util\Singleton
|
||||||
}
|
}
|
||||||
|
|
||||||
// Query per ottenere le informazioni
|
// Query per ottenere le informazioni
|
||||||
$results = $database->select($table, $select, $where, $order, [$page * $length, $length]);
|
|
||||||
|
|
||||||
// Informazioni aggiuntive
|
|
||||||
$query = $database->select($table, $select, $where, $order, [], true);
|
$query = $database->select($table, $select, $where, $order, [], true);
|
||||||
$cont = $database->fetchArray('SELECT COUNT(*) as `records`, CEIL(COUNT(*) / '.$length.') as `pages` FROM ('.$query.') AS `count`');
|
|
||||||
if (!empty($cont)) {
|
|
||||||
$results['records'] = $cont[0]['records'];
|
|
||||||
$results['pages'] = $cont[0]['pages'];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$response['records'] = $database->fetchArray($query.' LIMIT '.($page * $length).', '.$length, $parameters);
|
||||||
|
$count = $database->fetchNum($query, $parameters);
|
||||||
|
|
||||||
|
$response['total-count'] = $count;
|
||||||
|
$response['pages'] = ceil($count / $length);
|
||||||
} catch (PDOException $e) {
|
} catch (PDOException $e) {
|
||||||
// Log dell'errore
|
// Log dell'errore
|
||||||
$logger = logger();
|
$logger = logger();
|
||||||
|
@ -158,7 +159,7 @@ class API extends \Util\Singleton
|
||||||
return self::error('internalError');
|
return self::error('internalError');
|
||||||
}
|
}
|
||||||
|
|
||||||
return self::response($results);
|
return self::response($response);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -207,7 +208,7 @@ class API extends \Util\Singleton
|
||||||
protected function fileRequest($request, $kind)
|
protected function fileRequest($request, $kind)
|
||||||
{
|
{
|
||||||
$user = Auth::user();
|
$user = Auth::user();
|
||||||
$results = [];
|
$response = [];
|
||||||
|
|
||||||
// Controllo sulla compatibilità dell'API
|
// Controllo sulla compatibilità dell'API
|
||||||
if (!self::isCompatible()) {
|
if (!self::isCompatible()) {
|
||||||
|
@ -227,15 +228,15 @@ class API extends \Util\Singleton
|
||||||
$database = Database::getConnection();
|
$database = Database::getConnection();
|
||||||
$dbo = $database;
|
$dbo = $database;
|
||||||
|
|
||||||
$database->query('START TRANSACTION');
|
$database->beginTransaction();
|
||||||
|
|
||||||
// Esecuzione delle operazioni
|
// Esecuzione delle operazioni
|
||||||
$filename = DOCROOT.'/modules/'.$resources[$resource].'/api/'.$kind.'.php';
|
$filename = DOCROOT.'/modules/'.$resources[$resource].'/api/'.$kind.'.php';
|
||||||
include $filename;
|
include $filename;
|
||||||
|
|
||||||
$database->query('COMMIT');
|
$database->commitTransaction();
|
||||||
|
|
||||||
return self::response($results);
|
return self::response($response);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -750,6 +750,16 @@ class Database extends Util\Singleton
|
||||||
return implode(' '.$cond.' ', $result);
|
return implode(' '.$cond.' ', $result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function beginTransaction()
|
||||||
|
{
|
||||||
|
Capsule::beginTransaction();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function commitTransaction()
|
||||||
|
{
|
||||||
|
Capsule::commit();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Esegue le query interne ad un file .sql.
|
* Esegue le query interne ad un file .sql.
|
||||||
*
|
*
|
||||||
|
|
Loading…
Reference in New Issue