Gyural 1

Installazione

È necessario un ambiente di tipo Apache, MySQL, PHP

Gli unici passi necessari per eseguire gyural sono

  • Configurazione di apache affinché ci sia un virtualhost (example.com/test test.example.com)
  • PHP sia almeno versione 5
  • Configurare il file /sys/version.json tutte le opzioni possibili sono presenti in quel file

Per testare che tutto abbia funzionato lancia il virtualhost e via.


version.json

È un vettore di oggetti in JSON, si possono creare più configurazioni per switchare velocemente tra una versione di produzione e una di test.

{
	"working":{
		"ErrorApp":"error",
		"IndexApp":"index",
		"siteName":"Gyural",
		"uri":"http://localhost:8888",
		"uploadPath":"upl/",
		"mysql":"mysql://root:root@localhost/lemonade",
		"supportMail":"info@gyural.federicoq.com",
		"mail":"help@gyural.federicoq.com",
		"ssl": 0,
		"dev": 0,
		"version": 1,
		"online": 1
	}
}


Meccanismi di funzionamento

Il funzionamento di gyural è sintetizzabile con la "processione" di tutte le richieste effettuate dall'utente verso index.php

index.php crea un ambiente atto a gestire la richiesta, nel migliore dei modi possibili

<?php

# 1.0.0 # 28/8/2012
# federicoq

// Gyural

error_reporting(0);

define('gyu', true);

include 'config.php';
include absolute . 'funcs/gyu.php';

try {
	
	gyu_autoload();
	checkDevelop();
	
	LoadClass('standardObject');
	LoadClass('users');

	defined('dbLink') ? $databaseDriver = ParseDatabase(dbLink, $dbLink_pattern) : null;
	
	session_start();
	
	Route($page);

	is_object(Database()) ? Login() : die('Did you hear the explosion?');
	
	include application . $page;
	
	if(is_object(Database()))
		Database()->close();
	
} catch (Exception $e) {
	__error($e);
}

?>
	


FUNCS

Sono la cosa più utile che c'è. Con le funzioni si ha la possibilità di creare interfacce di accesso e helper per applicazioni o parti di esse.

Si può dire che Gyural tutto viene eseguito grazie a una sua stessa FUNC.

Strutturalmente, per funzionare le FUNCS devono rispondere a questi requisiti

  1. Essere scritti con la sintassi: function repository__name()
  2. Essere all'interno di:
    • /funcs/third/repository.php
    • oppure: /app/repository/_/func.php scelta consigliata!

Gyural (/funcs/gyural.php)

Shipped, e indispensabili per l'esecuzione.

Senza questo piccolo set di FUNCS non è possibile eseguire gyural.

Documenterò solo le funzioni che vengono poi utilizzate dallo sviluppatore...

function Functions($respository, $forceGlobal = 0)

Carica la $repository e la rende pronta per essere richiamata dalle app.

Ricorda che le FUNC LOCALI hanno la precedenza su quelle GLOBALI nel caso di: 1/app/news/_/func.php e di 2/funcs/third/news.php la 1 sarà quella richiamata.

function CallFunction($respository, $func, $args)

Richiama la FUNC repository__func($args)

Se $repository non è ancora mai stata richiamata con Functions($repository); è lei che provvede ad effettuarlo.

function LoadClass($lib, $istance = false, $args = null)

Richiama la LIB $lib ed è ingrado di istanziarla immediatamente, o semplicemente renderla disponibile in caso di richiesta.

Ricorda che le LIB LOCALI hanno la precedenza su quelle GLOBALI nel caso di: 1/app/news/_/news.lib.php e di 2/libs/news.lib.php la 1 sarà quella richiamata.

function isGyu()

Verifica se per caso l'applicazione viene richiamata all'esterno dell'ecosistema gyural.

function isSsl()

Verifica se c'è in corso una connessione SSL protetta con gyural.

function isMobile()

Verifica se il navigatore è mobile


Database (/funcs/autoload/database.php)

Shipped, gyural ha già un set di funzioni per interagire con il database (mysql per ora)

function FetchObject($oggetto, $alwayArray = 0, $classe = 'standardObject')

È la funzione che userai di più se lavorerai con MySQL
La funzione restituisce un vettore di oggetti, contenente il risultato dell'oggetto MySQLgyu.lib.php
Si può personalizzare la richiesta specificando se restituire sempre un vettore (anche in caso di un solo risultato) e
Scegliando il tipo di LIBS da associare ad ogni elemento del risultato.

function Database()

Questa funzione permette di richiamare AL VOLO l'oggetto DATABASE.
All'interno della funzione Database() è presente un intero oggetto MySQLgyu.lib pronto a rispondere alle richieste!
Lavora spesso in coppia con FetchObject();

print_r(FetchObject(Database()->query("SELECT * FROM `news`")));
// E si avrà la stampa di tutti i record di `news`

function CreateQuery($tipo, $tabella, $campi, $identifier)

La funzione permette di pre-confezionare una query pronta da far eseguire al MySQLgyu.lib.php
Raramente usata, le query di SELECT, INSERT, UPDATE e DELETE vengono solitamente fatte dall'istanza della LIB stessa.

function ParseDatabase($path, $pattern)

Noia, di sistema, controlla che la stringa sia fatta bene

function MysqlConnect($server, $username, $password, $database)

Noia, di sistema, si collega al db


Data/Time (/funcs/autoload/date.php)

Shipped, ci sono un po' di funzioncine, niente di ché in realtà.. andrebbero arricchite e sistemate...

function date2unix($data)

Trasforma una data del formato europeo gg/mm/AA hh:ii:ss in unixepoch.. accetta qualunque separatore, l'importante che "i numeri non si tocchino"

function seconds2Days($seconds)

Trasforma in Giorni i secondi... 86400 = 1


Multilingua (/funcs/autoload/lang.php)

Shipped, questa non la documento... è in fase di restauro, è appiccicaticcia... :)


Sicurezza (/funcs/autoload/security.php) e (/funcs/autoload/methods.php)

Shipped

Gyural basa la sua sicurezza sulle tipologie di accesso che si fanno alle applicazioni e dal livello di accesso dell'utente.

La prima parte che vedremo è quella sulla tipologia di accesso.

Tipologie di accesso (methods)

La tipologia di metodo d'accesso che una determinata applicazione accetta è stabilito all'interno dell'app stessa. è la funzione che deve subito seguire isGyu(); nella stesura dell'app.

function MethodAjax()

Accetta SOLAMENTE richiesta di tipo AJAX.

function MethodStandard()

Accetta ogni tipologia di richiesta.

function MethodApplication()

Accetta solamente chiamate dall'interno di altre APP. (attenzione alla ricorsione però: evitate di richiamare un'app all'interno di se stessa.)

function Application($app, $hideOtherApplication = null, $app_data = null)

Questa funzione permette di richiamare un'applicazione all'interno di un'altra.
con $hideOtherApplication si può inibire l'esecuzione di APP all'interno dell'app che richiami
con $app_data si può possono passare informazioni all'app. la quale potrà gestire col vettore/variabile/oggetto $app_data;


Livello di accesso (security)

Affinchè i livelli di accesso funzionino è necessario che sia mantenuta l'architettura del database di gyural con la presenza della tabella "users" e "rights"

Brevemente, all'interno della tabella users c'è una colonna "groupID" che rappresenta il gruppo d'appartenenza dell'utente

All'interno di rights c'è invece il livello di accesso ad una specifica app da parte di ogni singolo gruppo

function Right($m, $ifBad = null)

Va richiamata questa funzione prima di qualunque accesso/modifica/render
Si stabilisce il livello minimo $m necessario affinché l'applicazione possa essere esguita
Ricordiamo che l'utente sloggato ha di default livello 0 per ogni app.
Con la wild-card * è sufficiente che l'utente sia loggato.

function i_can($what, $level)

La funzione restituisce true o false in base alla possibilità o meno dell'utente loggato di eseguire l'app $what con il livello $level

function Login()

La funzione controlla ed eventualmente tenta una procedura di login da parte dell'utente.

function Logged()

La funzione restituisce true o false in base al corrente stato di logged da parte dell'utente che l'esegue.

function Me()

Restituisce l'oggetto users.lib.php dell'utente attualmente loggato.


Variabili utenti (/funcs/autoload/vars.php)

Shipped, banali ma utilissima.

Per funzionare deve essere preservata la tabella variables all'interno del database.

La funzione permette di salvare all'interno del database una serie di variabili riservate all'utente.. utile in caso di salvataggio di impostazioni per il sito, preferenze nella visualizzazione... immaginiamoli come dei cookie ma che risiedono sul database, invece che sul pc dell'utente.

function get_var($key, $user = NULL, $complex = NULL)

function set_var($key, $value, $user = NULL)

function del_var($key, $user = NULL)

Se omesso l'attributo USER verrà in automatico passato quello dell'utente loggato.




APPS

Qui succede tutto! Qui andiamo a creare le nostre app, quindi il nostro sito, il nostro social, il nostro qualunque-cosa!

Architettura

Le APP, per esistere devono avere una cartella all'interno della cartella /app.
Ogni APP può avere al suo interno un set di FUNCS e una LIB. Affinché ciò avvenga l'app deve avere una subfolder dal nome: /app/_ e al suo interno i due file che stabiliscono le FUNC e la LIB.
per esempio:

Applicazione news

  • /app
    • /news
      • /_
        • /func.php
        • /news.lib.php
      • index.php
      • read.php
      • edit.php

Ogni applicazione è richiamata dall'utente finale tramite l'indirizzo: http://example.com/news
Una chiamata secca all'APP verrà convertita in una chiamata per /news/index

Ogni applicazione può avere infinite sotto-applicazioni banalmente "pagine". Il percorso dell'app è fedele a quella della pagina, salvo la presenza di alcune variabili.

  • /news → /app/news/index.php
  • /news/read → /app/news/read.php
  • /news/read/id:1 → /app/news/read.php?id=1
  • /news/id:1/read → /app/news/read.php?id=1
  • /id:1/lang:en/news/read/:i-love-you → /app/news/read.php?id=1&lang=en&=i-love-you

Le variabili possono essere in qualunque parte dell'url, ma occhio a google, cerca di rispettare sempre la stessa sintassi.

esempio di applicazione semplice: /news/index.php

	isGyu();
	MethodStandard();
	Right('*');

	// L'app sarà eseguibile da chiunque è loggato. Ed è accettata qualunque forma di chiamata

	$news = LoadClass('news', 1)->filter(
		array('visibile', 1),
		'ORDER BY `data` DESC'
	);

	print_r($news);
		

All'interno dell'app è possibile richiamare altre applicazioni.. nell'esempio banale di un sito internet...

	isGyu();
	MethodStandard();
	Right('*');

	// L'app sarà eseguibile da chiunque è loggato. Ed è accettata qualunque forma di chiamata

	$news = LoadClass('news', 1)->filter(
		array('visibile', 1),
		'ORDER BY `data` DESC'
	);

	Application('generali/header');
	Application('generali/footer');

	// Abbiamo richiamato due applicazioni, 'generali/header' e 'generali/footer' questo ci 
	// permette di assemblare parti di app diverse all'interno della stessa..
		

ed è possibile anche stampare dell'html al suo interno...

	isGyu();
	MethodStandard();
	Right('*');

	// L'app sarà eseguibile da chiunque è loggato. Ed è accettata qualunque forma di chiamata

	$news = LoadClass('news', 1)->filter(
		array('visibile', 1),
		'ORDER BY `data` DESC'
	);

	Application('generali/header');

	foreach($news as $notizia)
		echo '<h1>'.$notizia->getAttr('title').'</h1>';

	Application('generali/footer');

		

Dall'interno di un'app è possibile effettuare qualunque cosa!



LIBS

Le librerie sono la cosa più importante, nel caso di una webapplication, o di un sito dinamico, o comunque un qualcosa che lavori con dei dati..

E in gyural sono molto flessibili e molto carine!

Architettura

Per funzionare devono:

  1. Risiedere o all'interno di /nomeApp/_/nomeApp.lib.php o in /libs/nomeApp.lib.php
  2. Iniziare con il commento ### GYURAL ###
  3. Estendere la libreria standardObject

standardObject

È la libreria perfetta per giocare con i dati!

Nasce per dialogare con MySQLgyu.lib.php sotto le mentite spoglie di Database()

Offre una serie di metodi/attributi che permettono di gestire *senza perder tempo* gli oggetti

Proprietà

$gyu_table

Specifica a quale tabella del database fa capo l'oggetto viene utilizzata per i metodi put/hang/delete

$gyu_id viene utilizzato per il metodo get()

Specifica quale campo della tabella rappresenta univocamente il record.

- eredita al suo interno alcune proprietà che gli vengono iniettate da MySQLgyu -

  • $gyu_last (true:false) -> primo elemento di una serie
  • $gyu_first (true:false) -> ultimo elemento di una serie

Metodi

public function filter(…)

Permette di ottenere un gruppo di oggetti che rispondono ai criteri del filtro.
il metodo accetta infiniti attributi e nelle forme di Array() o String.
Gli Array() rappresentano i criteri che matchano le richieste:

  • Array('chiave', 'valore') => 'chiave' = 'valore'
  • Array('chiave', '!=', 'valore') => 'chiave' != 'valore'
  • Array('chiave', 'LIKE', 'valore') => 'chiave' LIKE '%valore%'
  • (sono accettati tutti gli operatori mysql)
Le stringhe invece, rappresentano dettagli in più per ordinare il gruppo di risultati
  • ONE => ottiene un solo elemento, il primo
  • ORDER BY... => la classica order mysql
  • LIMIT... => ecc..
Tutti gli attributi verranno accodati così come vengono incontrati... tranne per la *magic-string* "ONE"

public function get($index)

Permette di perfezionare in automatico una query di SELECT di un singolo elemento usando il $gyu_id come campo di riferimento. Restituisce un oggetto della stessa classe del chiamante.

public function getAttr($name)

Get the $name attr from the object. { try to call getName(); }

public function setAttr($key, $vValue)

Set the $key attribute with the $vValue value { try to call setKey($value); }

public function render($name)

Render the $name from the object { try to call rendername(); }

public function format($template, $externalVars)

$categorie[0]->format('<li>{{name}} e {{madre}}</li>');
Permette di ottenere una stringa con l'oggetto formattato.. {{name}} corrisponde ad una chiamata del tipo getAttr('name') ed è possibile anche accedere ad eventuali attributi di oggetti risposta del getAttr();

public function notNull($what)

Verifica se un'attributo è nullo (false, 0, null, array(0))

public function refill($vArray = null)

Refill the object with the $vArray values.

public function hang($vArray = null)

$object->hang() ==> prepare the query to insert the object in the database.

public function hangExecute($vArray = null)

$object->hangExecute() ==> execute the query, prepared by ->hang();

public function put($vArray = null, $id = null)

$object->put() ==> prepare the query to update the object in the database.

public function putExecute($vArray = null, $id = null)

$object->putExecute() ==> execute the query, prepared by ->put();

public function delete($id = null)

$object->delete() ==> prepare the query to delete the object in the database.

public function deleteExecute($id = null)

$object->deleteExecute() ==> execute the query, prepared by ->delete();


MySQLgyu

Questa LIB viene utilizzata dallo sviluppatore unicamente per il suo metodo Query(); che restituisce un oggetto da poter elaborare con gyural.

Viene quasi esclusivamente usata tramite Database() e vi è una sola istanza in esecuzione per ogni gyural


Users

È la libreria standard di gestione dell'utente.

Non ha metodi particolari, non ha nulla di particolare ma viene utilizzata dalle FUNC standard, ad esempio tramite Me()

È consigliata l'estensione o la sovrascrittura mediante uso di /users/_/users.lib.php



Addons

- Documentazione Mancante -

Gyural 1.0 © 2012 Mandarinoadv