Skip to content

Commit 9cd065b

Browse files
authored
Merge pull request #6 from manusreload/1.2.8
1.2.8
2 parents 943c4fe + d44875c commit 9cd065b

17 files changed

+243
-61
lines changed

README.md

Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
# GLFramework
2+
## GestionLan PHP Framework
3+
4+
5+
- [GLFramework](#glframework)
6+
- [GestionLan PHP Framework](#gestionlan-php-framework)
7+
- [Tecnología utilizada en el desarrollo.](#tecnología-utilizada-en-el-desarrollo)
8+
- [Creación de una aplicación.](#creación-de-una-aplicación)
9+
- [Archivo "config.yml"](#archivo-configyml)
10+
- [Listado de los módulos internos](#listado-de-los-módulos-internos)
11+
- [Controlador](#controlador)
12+
- [Vista](#vista)
13+
- [Modelo](#modelo)
14+
- [Ejemplo de Modelo:](#ejemplo-de-modelo)
15+
16+
En este documento se explica el funcionamiento y como utilizar este conjunto de funciones para realizar software.
17+
18+
19+
### Tecnología utilizada en el desarrollo.
20+
21+
Para que este framework funcione es necesario que se ejecute bajo un entorno PHP. El framework tiene varias rutas de entrada, y en función de lo que se desee hacer se utilizan unas u otras. Bajo PHP se han utilizado varias librerías gestionadas por "composer". Entre otras destacan:
22+
23+
- Twig: Se utiliza en el renderizado de las vistas.
24+
- Yaml: Para los archivos de configuración.
25+
- AltoRouter: Para el enrutamiento de las peticiones.
26+
27+
El framework también incluye un sistema de módulos, que junto con los eventos permiten redefinir partes de lo que ya se ha creado. Estos módulos tienen que ser habilitados por la propia aplicación en su archivo de configuración.
28+
29+
### Creación de una aplicación.
30+
31+
Para comenzar a crear una aplicación es necesario tener instalado "composer" (https://getcomposer.org/). Nos vamos al repositorio del código fuente (https://gitlab.com/gestionlan/framework) y nos descargamos la carpeta "example"
32+
33+
34+
### Archivo "config.yml"
35+
36+
Manual del formato Yaml: http://symfony.com/doc/current/components/yaml/yaml_format.html
37+
En este archivo se define la configuración de la aplicación.
38+
39+
40+
```yaml
41+
app:
42+
basepath: [Ruta base de la aplicación:/beta,]
43+
index: [Nombre del archivo de inicio:index,home]
44+
name: [Nombre de la aplicación:Demo]
45+
banner: [Banner de la aplicación:/img/banner.png]
46+
favicon: [Icono de navegador:/images/logo.jpg]
47+
48+
controllers: [Directorio de los controladores:pages,controller]
49+
model: [Directorio de los modelos:model]
50+
views: [Directorio de las vistas:views]
51+
upload: [Directorio de subida de archivos:uploads]
52+
53+
54+
routes: [Rutas especiales a controladores]
55+
- [NombreClaseControlador]: [[URL de destino], [METODO:GET|POST,GET,POST]]
56+
- MyNameSpace\home: ["/home/example/[i:id]", GET]
57+
- home: ["/home/example/[i:id]", GET]
58+
- sub_home: ["/home/sub/example/[i:id]"]
59+
60+
database: [Configuración de la base de datos]
61+
hostname: 127.0.0.1
62+
username: root
63+
password:
64+
database: dbdemo
65+
modules: [Módulos activos para la aplicación]
66+
internal: [Modulos internos de framework]
67+
- admin
68+
- group_permissions
69+
modules: [Modulos de la aplicación, se encuentran en la carpeta modules]
70+
71+
```
72+
73+
74+
#### Listado de los módulos internos
75+
76+
- admin: Conjunto de utilidades para la administración interna de la aplicación.
77+
- group_permissions: Añade la posibilidad de asignar páginas por grupos de usuarios
78+
79+
80+
### Controlador
81+
82+
Para definir un controlador es necesario crear un archivo que siga un cierto patrón. Crearemos un archivo sobre una de las carpetas que hemos definido como controlador en el archivo de configuración. En este archivo vamos a definir una clase con el siguiente nombre: `[< nombre directorio >_]< nombre del archivo >` y extenderá a la clase Controller o a alguna de sus descendientes como puede ser AuthController. Podemos situarla con un espacio de nombres, el framework se encarga de detectar estos matices.
83+
84+
### Vista
85+
86+
La vista se programa con plantillas Twig, y existen algunas variables globales a las cuales se pueden acceder en las plantillas.
87+
88+
- `this` Es el controlador que se esta ejecutando. Se pueden acceder a todas las propiedades públicas con `{{ this.public_var }}`
89+
- `config` Es un array con la configuración del framework, se puede acceder como: `{{ config.app.name }}`
90+
- `_GET` Array con las varibles de petición $_GET
91+
- `_POST` Array con las varibles de petición $_POST
92+
- `_REQUEST` Array con las varibles de petición $_REQUEST
93+
- `render` Objeto que contiene el motor de renderizado para las vistas Twig.
94+
- `manager` Objeto de la clase ModuleManager. Ser puede utilizar para ver si hay módulos activos: `{% if manager.exists("admin") %}`
95+
96+
97+
### Modelo
98+
99+
Aquí se define como se tratan los datos de la base de datos. Las columnas se definen en una lista, en la que se indica el índice y los campos de la tabla. También se define el nombre de la tabla.
100+
101+
#### Ejemplo de Modelo:
102+
103+
```php
104+
class User extends Model
105+
{
106+
var $id;
107+
var $user_name;
108+
var $password;
109+
var $privilegios;
110+
var $nombre;
111+
var $email;
112+
var $admin;
113+
protected $table_name = "user";
114+
protected $definition = array(
115+
'index' => 'id',
116+
'fields' => array(
117+
'user_name' => "varchar(20)",
118+
'password' => "varchar(200)",
119+
'privilegios' => "text",
120+
'admin' => "int(11)",
121+
'nombre' => "text",
122+
'email' => "text",
123+
)
124+
);
125+
public function getByUserPassword($user, $password)
126+
{
127+
return $this->db->select_first("SELECT * FROM {$this->table_name} WHERE user_name = '$user' AND password = '$password'");
128+
}
129+
public function encrypt($pass)
130+
{
131+
return md5($pass);
132+
}
133+
public function getPages()
134+
{
135+
$pages = new Page();
136+
$userPages = new UserPage();
137+
$sql = "SELECT * FROM " . $userPages->getTableName() . " as up
138+
LEFT JOIN {$pages->getTableName()} as p ON up.id_page = p.id
139+
WHERE up.id_user = " . $this->id;
140+
return $this->db->select($sql);
141+
}
142+
}
143+
144+
```
145+
146+
147+
Para comprobar los cambios en las tablas, acceda a http://example.com/install.php Allí se indican los cambio que se van a realizar en la base de datos. Pulse en el enlace de abajo para realizar estos cambios en la base de datos.

composer.json

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@
2020
"bin": ["bin/gl"],
2121
"require": {
2222
"twig/twig": "~1.0",
23-
"symfony/yaml": "^3.0",
23+
"symfony/yaml": "~6.1",
2424
"altorouter/altorouter": "2.0.1",
25-
"phpmailer/phpmailer": "~5.2",
25+
"phpmailer/phpmailer": "~6.5",
2626
"wikimedia/composer-merge-plugin": "v2.0.0",
2727
"nuovo/spreadsheet-reader": "*",
2828
"tijsverkoyen/css-to-inline-styles": "^1.5",
@@ -37,13 +37,18 @@
3737
"symfony/translation": "*"
3838
},
3939
"require-dev": {
40-
"phpunit/phpunit": "9.5.4"
40+
"phpunit/phpunit": "^9.5"
4141
},
4242
"extra": {
4343
"merge-plugin": {
4444
"include": [
4545
"modules/*/composer.json"
4646
]
4747
}
48+
},
49+
"config": {
50+
"allow-plugins": {
51+
"wikimedia/composer-merge-plugin": true
52+
}
4853
}
4954
}

docu/Actualizar PHP8.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# Actualizar framework a la version PHP8
2+
3+
1º Eliminar el archivo `composer.lock` para que se pueda instalar las dependencias sin restricciones.
4+
5+
2º Instalar la última version del framework (https://github.com/manusreload/GLFramework/tags)
6+
7+
```bash
8+
composer require gestionlan/framework "~1.2.8.x-dev"
9+
```
10+
11+
3º Comprobar que los paquetes de nuestro proyecto están en la última versión.
12+
13+

documentación.odt

-23.5 KB
Binary file not shown.

modules/debugbar/src/Collectors/ControllerCollector.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ public function getVariables()
9292
} else if(is_string($value)) {
9393
$array[$item->name] = $value;
9494
} else {
95-
$array[$item->name] = (string) ($value);
95+
$array[$item->name] = (string) ('object');
9696
}
9797
}
9898
}

src/Bootstrap.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
*/
3939
class Bootstrap
4040
{
41-
public static $VERSION = '0.2.7';
41+
public static $VERSION = '1.2.8';
4242
private static $singelton;
4343
private static $errorLevel = 0;
4444
/**
@@ -550,7 +550,7 @@ public function log($message, $level = 1, $nl = true)
550550
/**
551551
* TODO
552552
*/
553-
function fatal_handler($errno, $errstr, $errfile, $errline, $errorContext)
553+
function fatal_handler($errno, $errstr = null, $errfile = null, $errline = null, $errorContext = null)
554554
{
555555

556556
if(!$errno) {
@@ -570,7 +570,7 @@ function fatal_handler($errno, $errstr, $errfile, $errline, $errorContext)
570570
}
571571
}
572572
if ($errno) {
573-
573+
error_log(("$errno $errstr at $errfile:$errline"));
574574
if ($errno === E_ERROR) {
575575
Log::getInstance()->error($errstr . " " . $errfile . " " . $errline);
576576
if (isset($this->config['app']['ignore_errors'])) {
@@ -581,7 +581,7 @@ function fatal_handler($errno, $errstr, $errfile, $errline, $errorContext)
581581

582582
if (isset($this->config['app']['debug']) && $this->config['app']['debug']) {
583583
error_log(("ERROR: $errstr at $errfile:$errfile ($errno)"));
584-
($this->format_error($errno, $errstr, $errfile, $errline));
584+
echo ($this->format_error($errno, $errstr, $errfile, $errline));
585585
}
586586
}
587587
}

src/DBStructure.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -535,7 +535,7 @@ public function getAddKey($table, $index) {
535535

536536

537537
public function getDropKey($table, $index) {
538-
return "ALTER TABLE `$table` DROP INDEX `{$index['field']}`";
538+
return "ALTER TABLE `$table` DROP INDEX `{$index}`";
539539
}
540540

541541
public function getAddUnique($table, $field)

src/DatabaseManager.php

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,11 @@ class DatabaseManager
6161

6262
private $config;
6363

64+
private $enableTimerLog = false;
65+
66+
private $timers = [];
67+
68+
6469
/**
6570
* DBConnection constructor.
6671
*
@@ -76,6 +81,8 @@ public function __construct($config = null)
7681
'before' init the framework!");
7782

7883
$this->config = $config;
84+
$this->enableTimerLog = isset($this->config['database']) && isset($this->config['database']['profiler'])
85+
? $this->config['database']['profiler'] : false ;
7986
// $this->connect();
8087
}
8188

@@ -165,31 +172,8 @@ public function connect()
165172
throw new \Exception(sprintf('Can not establish connection to database! {host=%s, user=%s, database=%s} Error: %s',
166173
$config['database']['hostname'], $config['database']['username'], $config['database']['database'], $err));
167174
}
168-
175+
169176
return false;
170-
171-
// if (!$this->connection) {
172-
//
173-
// if ($conn->connect()
174-
// ) {
175-
// if ($conn->select_database($config['database']['database'])) {
176-
// $this->connection = $conn;
177-
// self::$selected = true;
178-
// $this->createCache();
179-
////
180-
//// if (!defined("GL_INSTALL") || !GL_INSTALL) {
181-
//// $this->checkDatabaseStructure();
182-
//// }
183-
// return true;
184-
// }
185-
// return false;
186-
// } else {
187-
// $err =$conn->getLastError();
188-
// throw new \Exception(sprintf('Can not establish connection to database! {host=%s, user=%s, database=%s} Error: %s',
189-
// $config['database']['hostname'], $config['database']['username'], $config['database']['database'], $err));
190-
// }
191-
// }
192-
// return true;
193177
}
194178

195179
public function connectAndSelect() {
@@ -291,10 +275,22 @@ public function select($query, $args = array(), $cache = null, $duration = null)
291275
if ($this->pre_cache($result, $cache)) {
292276
return $result;
293277
}
278+
$timer = null;
279+
if($this->enableTimerLog) {
280+
$timer = ['start' => microtime(true), 'query' => $query, 'args' => $args];
281+
}
294282

295283
Profiler::start('query', 'database');
296284
$result = $this->connection->select($query, $args, true);
297285
Profiler::stop('query');
286+
287+
if($this->enableTimerLog) {
288+
$timer['end'] = microtime(true);
289+
$timer['duration'] = $timer['end'] - $timer['start'];
290+
$timer['results'] = count($result);
291+
$this->timers[] = $timer;
292+
}
293+
298294
return $this->cache($result, $cache, $duration);
299295
}
300296
throw new \Exception('Database connection is not open!');
@@ -496,4 +492,8 @@ public function sql_to_int($col_name)
496492
public function date_style() {
497493
return "Y-m-d";
498494
}
495+
496+
public function getTimers() {
497+
return $this->timers;
498+
}
499499
}

0 commit comments

Comments
 (0)