Portfolio
Go to file
Thommy Bucaille 56f22c1b58 Fixe Lang::get for empty null in params + Add optionnal dynamic methods for models getXyAttribute and SetXyAttribute to allow modifie the manner who properties are get/set dyanmically 2024-02-10 14:53:26 +01:00
.vscode First commit 2022-03-06 22:37:01 +01:00
public remove old site 2023-12-10 04:34:40 +01:00
src Fixe Lang::get for empty null in params + Add optionnal dynamic methods for models getXyAttribute and SetXyAttribute to allow modifie the manner who properties are get/set dyanmically 2024-02-10 14:53:26 +01:00
storage/documents add file discord api 2023-12-12 00:33:48 +01:00
.DS_Store remove old site 2023-12-10 04:34:40 +01:00
.env.exemple Add mailer + mailTemplate + ENV management + apply ENV in configs/ 2023-12-15 04:09:12 +01:00
.gitignore Add mailer + mailTemplate + ENV management + apply ENV in configs/ 2023-12-15 04:09:12 +01:00
README.md remove old site 2023-12-10 04:34:40 +01:00
autoload.php remove old site 2023-12-10 04:34:40 +01:00
cli.php remove old site 2023-12-10 04:34:40 +01:00
composer.json Add mailer + mailTemplate + ENV management + apply ENV in configs/ 2023-12-15 04:09:12 +01:00
index.php remove old site 2023-12-10 04:34:40 +01:00
tinker.php remove old site 2023-12-10 04:34:40 +01:00

README.md

Table des matières

  1. Intro
  2. Gérer les configs
  3. Pour appeler une config dans le code
  4. Créer une route
  5. Créer un controller
  6. Créer une vue
  7. Créer une langue
  8. Gérer les langues
  9. Créer un model
  10. Intéragir avec la base de donnée
  11. Utiliser les Models pour intéragir avec la base de donnée
  12. Intéragir avec le cache
  13. Helpers
  14. Auth classe
  15. Helper classe
  16. Les schedules (Tâche planifiée)
  17. Les commandes
  18. Les actions
  19. Raffraichir un modal après X secondes

Intro

Fait CTRL+CLIQUE sur un élément de la table des matières pour y accéder directement

Gérer les configs

Aller dans le fichier /src/Configs Tu peux éditer tout les fichiers .php pour modifier les configs

Pour appeler une config dans le code

use Core\Config;

Config::get('app.name'); // Pour le fichier "app.php" et la clé "name"

Créer une route

Aller dans le fichier /src/routes.php Ajouter le code suivant

Router::get('/home', 'HomeController', 'index');

Le premier paramètre est l'url, le deuxième est le nom du controller et le troisième est le nom de la méthode du controller.

Créer un controller

Aller dans le dossier /src/Controllers Créer un fichier HomeController.php Ajouter le code suivant

namespace Controllers;
use Core\BaseController;
use Core\Lang;
use Core\View;

class HomeController extends BaseController{

    public function index() {
        return View::render('home');
    }

}

Créer une vue

Aller dans le dossier /src/Views Créer un fichier home.php Ajouter le code suivant par exemple en utilisant le layout par défaut via le système de View

use Core\Lang;
use Core\View;

// On définit le layout à utiliser
View::layout("layouts.app");
// On définit le titre de la page (afficher dans le layout à l'emplacement "title")
View::set('title', Lang::get('home'));


View::start("content");
    <h1><?= Lang::get('welcome'); ?></h1>
    <h2>Contenu de la page d'acceuil (afficher dans le layout à l'emplacement "content")</h2>
    <p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Voluptatum, voluptates reiciendis at possimus fugit corporis et pariatur enim nulla maxime incidunt dolorum facilis fuga explicabo officiis blanditiis vero, cupiditate quas.e</p>
View::end();

Tout ce qui est dans un View::set('key', 'value') ou dans le View::start("content") et View::end()

sont affichable ensuite par exemple dans le layout, en appelant la fonction View::yield('content') par exemple (le nom du container) Tu peux aussi include une autre vue en appelant la fonction View::include('home') par exemple (le nom de la vue) Si besoin tu peux lui envoyer des variables en deuxième paramètre de la fonction View::include('home', ['user' => $user]) par exemple et tu pourra directement utiliser $user dans la vue importé

Créer une langue

Aller dans le dossier /src/Langs Créer un fichier fr.php Ajouter le code suivant

return [
    'home' => 'Accueil',
];

Gérer les langues

Pour afficher des textes traduit dans les vues, il faut utiliser la fonction Lang::get('home') par exemple. Pour changer la langue, il faut modifier la variable "lang" dans le fichier /src/Configs/app.php Exemple


echo Lang::get('home'); // Affiche "Accueil" si la langue est "fr" et "Home" si la langue est "en"

Créer un model

Aller dans le dossier /src/Models Créer un fichier User.php Ajouter le code suivant

namespace Models;

use Core\Database;
use Core\BaseModel;

class User extends BaseModel {

    // La version permet de déclencher une mise à jour de la table en appelant la fonction update_1_0_1 par exemple
    protected $version = '1.0.1';

    // ...
    // D'autres champs ici sont optionnel car défini automatiquement. Comme le nom de la table (users), la clé primaire (id)
    // Ils sont automatiquement défini en fonction du nom de la classe (User). La clé elle est "id" par défaut
    protected $table = 'users'; // Si tu veux changer le nom de la table
    protected $primaryKey = 'id'; // Si tu veux changer la clé primaire
    protected $timestamps = true; // Si tu veux des champs "created_at" et "updated_at" dans ta table, sinon false
    // Il n'est donc même pas obligé de créer ces variables si tu ne veux pas les changer (et en vrai tu ne devrais pas en avoir besoin)
    // ... 

    // La méthode install permet de définir les champs de la table
    public function install($fields) {

        $fields = array_merge($fields, [
            [
                'name' => 'username',
                'type' => 'varchar',
                'length' => 255,
                'null' => false
            ],
            [
                'name' => 'password',
                'type' => 'varchar',
                'length' => 255,
                'null' => false
            ],
            [
                'name' => 'email',
                'type' => 'varchar',
                'length' => 255,
                'null' => false
            ],
            [
                'name' => 'last_online',
                'type' => 'datetime',
                'null' => true
            ]
        ]);

        parent::install($fields);
    }

    // La méthode update permet de mettre à jour la table
    public function update_1_0_1() {
        // Add last_online column
        $db = Database::getInstance();
        $db->exec('ALTER TABLE users ADD last_online DATETIME NULL');
    }
    
}

Intéragir avec la base de donnée

Tu peux utiliser la classe Database pour intéragir avec la base de donnée

use Core\Database;

$db = Database::getInstance();
$query = $db->prepare('SELECT * FROM users WHERE id = :id');
$query->execute(['id' => 1]);
$user = $query->fetch();

Utiliser les Models pour intéragir avec la base de donnée

La est la puissance de mon Framework, tu as des aides. En définissant le model comme en haut, sa ne permet pas juste de créer la table automatiquement. Non. Sa permet carrément de faire des requêtes SANS écrire de requêtes SQL. Simplement en utilisant le Model.

use Models\User;

// Récupérer un seul utilisateur par son ID
$user = User::where('id', '=', 1)->first();
// La variable vaut null s'il n'existe pas

// Plus simple par ID
Planet::find(1); // Récupérer la planète avec l'id 1

// Récupérer tout les utilisateurs
$users = User::get();

// Faire un trie
$users = User::orderBy('username', 'ASC')->get();

// Exemple avec plein de trucs
$users = User::where('username', 'LIKE', '%admin%')->orderBy('username', 'ASC')->limit(10)->get();

// Récupérer le nombre d'utilisateurs
$usersCount = User::count(); // Ex: 10
$userCount = User::where('username', 'LIKE', '%admin%')->count(); // Ex: 2


// Méthodes de tries/selection
$user = User::where('id', '=', '1') // id = 1
    ->orWhere('username', '=', 'admin') // OU username = admin
    ->orderBy('username', 'DESC') // Trier par username DESC
    ->limit(0, 10) // recupérer de 0 à 10
    ->groupBy('username') // Grouper par username
    ->join('posts', 'posts.user_id', '=', 'users.id'); // Faire un join avec la table posts (tu en aura peut-être pas trop besoin tkt mdr)


// Méthodes de récupération
$user->get(); // Récupérer tout les utilisateurs
$user->first(); // Récupérer le premier utilisateur (trie ASC)
$user->last(); // Récupérer le dernier utilisateur (trie DESC)
$user->paginate(10); // Récupérer les utilisateurs par page (10 par page)

// Intéraction avec un utilisateur
$user = User::where('id', '=', 1)->first();
$user->username = 'admin';
$user->save(); // Sauvegarder les modifications
$user->delete(); // Supprimer l'utilisateur

// Créer un utilisateur
$user = new User();
$user->username = 'admin';
$user->password = 'admin';
$user->email = 'admin@domain.tld';
$user->save(); // Sauvegarder l'utilisateur


// Tu peux update ou insérer autrement

// Update
User::where("id", "=", 1)->update([
    'username' => 'admin',
    'password' => 'admin',
]),

// Insérer directement
User::insert([
    'username' => 'admin',
    'password' => 'admin',
]);


// Et voilà. C'est valable pour TOUT les models que tu vas créer. Tu peux faire tout sa avec n'importe quel model.

Intéragir avec le cache

Tu peux utiliser la classe Cache pour intéragir avec le cache

use Core\Cache;

// Récupérer une valeur
Cache::get('key', null); // null est la valeur par défaut si la clé n'existe pas

// Définir une valeur
Cache::set('key', 'value', 60); // 60 est le temps en secondes avant que la valeur expire. 0 = jamais

// Tu peux passer n'importe quel type de variable en valeur (tableau, objet, string, int, float, etc...)

Helpers

Certaines classes contiennent des méthodes qui peuvent t'aider. Par exemple dans les controllers tu peux utiliser la méthode redirect() pour rediriger l'utilisateur.

namespace Controllers;

use Core\BaseController;
class HomeController extends BaseController{

    public function index() {

        // Rediriger l'utilisateur vers la page d'acceuil
        return $this->redirect('/home');

        // Rediriger en arrière
        return $this->back();

        // Renvoyer du json
        return $this->json([
            'success' => true,
            'message' => 'Hello World'
        ]);

        // Autoriser seulement si on est connecté ?
        $this->authOnly();

        // Autoriser seulement si on est pas connecté ?
        $this->guestOnly();


        // Tu as aussi accès à la classe Request pour certaines choses, comme ajouter un message flash qui s'affichera sur la prochaine page
        $this->request()->flash('success', 'Hello World');
        $this->request()->flash('error', 'Hello World');
        //... Puis ensuite tu redirige genre sur l'accueil et le message s'affichera

        // Tu peux aussi récupérer des données de la requête $_GET, $_POST
        $this->request()->get('username'); // Récupérer le paramètre "username" de la requête $_GET
        $this->request()->post('username'); // Récupérer le paramètre "username" de la requête $_POST

        // Gérer les cookies $_COOKIE
        $this->request()->cookie('username'); // Récupérer le cookie "username"
        $this->request()->setCookie('username', 'admin', 60); // Définir le cookie "username" avec la valeur "admin" et qui expire dans 60 secondes
        $this->request()->deleteCookie('username'); // Supprimer le cookie "username"
        $this->request()->hasCookie('username'); // Vérifier si le cookie "username" existe

        // Récupérer les paramètres de la variable $_SESSION
        $this->request()->session(); // Récupérer tout les paramètres de la variable $_SESSION
        $this->request()->session('username'); // Récupérer le paramètre "username" de la variable $_SESSION
        $this->request()->session('username', 'admin'); // Définir le paramètre "username" de la variable $_SESSION avec la valeur "admin"


    }

}

Après tu peux fouiller certaines classes dans Core/ pour voir les méthodes disponibles.

Auth classe

Tu peux utiliser la classe Auth pour gérer l'authentification

use Core\Auth;

// Vérifier si l'utilisateur est connecté
Auth::check(); // Retourne true si l'utilisateur est connecté
if(Auth::check()) {
    // L'utilisateur est connecté
}

// Récupérer l'utilisateur connecté
$user = Auth::user(); // Retourne l'utilisateur connecté ou null si personne n'est connecté

// Connecter un utilisateur
Auth::login($user);

// Déconnecter un utilisateur
Auth::logout();

Helper classe

Tu peux utiliser la classe Helper pour utiliser des fonctions utiles

use Core\Helper;

// Générer une chaine aléatoire
Helper::randomString(10); // Retourne une chaine aléatoire de 10 caractères

// Créer un slug à partir d'une chaine
Helper::slugify('Hello World'); // Retourne "hello-world"

// Debuguer du code pour voir ce qu'il contient
Helper::dump($user); // Affiche le contenu de la variable $user
Helper::dd($user); // Affiche le contenu de la variable $user et STOP le reste du script (die() la page)

Les schedules (Tâche planifiée)

Tu peux créer des tâches planifiées qui s'exécuteront automatiquement à une certaine heure. Pour cela, edit le fichier src/schedules.php

use Core\Schedule;

// Exemple de tâche planifiée qui s'exécute tout les jours à 00h00
Scheduler::schedule('test', '0 0 * * *', 'HomeController', 'index'); // Run every day at midnight

Les commandes

Via la console tu peux accéder à des commandes. Pour en créer une il suffit de créer un fichier dans le dossier src/Commands Copie une commande existante et modifie comme tu veux.

php cli.php

php cli.php schedule
php cli.php tinker

Les actions

Tu peux créer des actions qui s'exécuteront automatiquement au clique ou si c'est un input/textarea, au changement de valeur Pour cela, sur un bouton, un a, un input, textarea, select... Ajoute l'attribut data-action-name='upgrade' data-action-params='bedroom' par exemple

<button data-action-name='upgrade' data-action-params='bedroom'>Upgrade</button>

Le paramètre params peut avoir soit un valeur simple comme là, soit un tableau, soit un objet.

<button data-action-name='upgrade' data-action-params='["bedroom", "kitchen"]'>Upgrade</button>
<button data-action-name='upgrade' data-action-params='{"bedroom": 1, "kitchen": 2}'>Upgrade</button>

Aussi, tu peux mettre en params #id-input ou .class-input pour récupérer la valeur d'un input ou textarea ou select

<input type="text" id="username" value="admin">
<button data-action-name='upgrade' data-action-params='#username'>Upgrade</button>

Pareil si les valeurs sont en objet ou tableau

<input type="text" id="username" value="admin">
<input type="text" id="password" value="admin">
<button data-action-name='upgrade' data-action-params='{"username": "#username", "password": "#password"}'>Upgrade</button>

Ensuite, dans le GameController par exemple, tu peux créer une méthode actionUpgrade($city, $params) qui sera appelé automatiquement

private function actionUpgrade($city, $params) {
    // Do action
}

A savoir, lorsqu un data-action est appelé, le modal est ensuite automatiquement raffraichi en JS


Exemple concret
```html
<button data-action-name='upgrade' data-action-params='bedroom'>Upgrade</button>
private function actionUpgrade($city, $params) {
    // Là le $params contient donc "bedroom"

    $city->{$params} += 1;
    $city->save();

    return $this->json([
        'success' => true,
    ]);
}

Exemple en objet

<button data-action-name='upgrade' data-action-params='{"type": "bedroom", "level": 1}'>Upgrade</button>
private function actionUpgrade($city, $params) {
    // Là le $params contient donc ["type" => "bedroom", "level" => 1]

    $city->{$params['type']} += $params['level'];
    $city->save();

    return $this->json([
        'success' => true,
    ]);
}

Je t'ai créer un exemple dans le modal homeQuarter pour upgrade

Raffraichir un modal après X secondes

Tu peux raffraichir un modal après X secondes (enfin en millisecondes)

<div class="modal" data-reload-after="5000">
    <div class="modal-content">
        <h1>Modal</h1>
    </div>
</div>

Tu peux faire cette logique si par exemple ya un truc en construction et que tu veux raffraichir le modal après X secondes pour voir le résultat
```html
<div class="modal" <?= $isInProgress ? 'data-reload-after="5000"' : '' ?>>
    <div class="modal-content">
        <h1>Modal</h1>
    </div>
</div>