---
title: "Démarrage rapide"
description: "Construisez une page Produits minimale en cinq minutes — contrôleur, vue, entrée de navigation."
---

À la fin de cette page, vous aurez une page `/produits` fonctionnelle rendue par Smarty, alimentée par un contrôleur et listée dans le panneau latéral.

## 1. Générer un contrôleur
```bash
./nibiru -c products
```
Cela crée deux fichiers :
```
application/controller/productsController.php
application/view/templates/products.tpl
```
## 2. Connecter le contrôleur

Ouvrez `productsController.php` et remplacez le corps par :
```php
<?php
namespace Nibiru;
use Nibiru\Adapter\Controller;

class productsController extends Controller
{
    public function pageAction()
    {
        View::assign([
            'title'    => 'Products — Nibiru',
            'products' => [
                ['id' => 1, 'name' => 'Marduk Gold Plating', 'price' => 99.0],
                ['id' => 2, 'name' => 'Tiamat Hull Sealant', 'price' => 49.0],
                ['id' => 3, 'name' => 'Anu Stardust Polish', 'price' => 19.5],
            ],
            'css' => Config::getInstance()->getConfig()[View::NIBIRU_SETTINGS]['smarty.css'],
            'js'  => Config::getInstance()->getConfig()[View::NIBIRU_SETTINGS]['smarty.js'],
        ]);
    }

    public function navigationAction()
    {
        JsonNavigation::getInstance()->loadJsonNavigationArray();
    }
}
```
Deux méthodes sont conventionnelles et **appelées toujours** par le [dispatcheur](/core/dispatcher/):

- `navigationAction()` — remplit le menu de navigation global.
- `pageAction()` — rend la page elle-même.

Tout ce qui correspond à `?_action=foo` appellera en outre une méthode `fooAction()` entre eux.

## 3. Écrire la vue

Ouvrez `application/view/templates/products.tpl`:
```smarty
{include 'shared/header.tpl'}
<body>
{include file="navigation.tpl"}

<main class="container">
  <h1>{$title}</h1>

  <table class="table">
    <thead>
      <tr><th>#</th><th>Name</th><th>Price</th></tr>
    </thead>
    <tbody>
      {foreach $products as $p}
        <tr>
          <td>{$p.id}</td>
          <td><a href="/products/detail/{$p.id}">{$p.name|escape}</a></td>
          <td>{$p.price|string_format:"%.2f"} €</td>
        </tr>
      {/foreach}
    </tbody>
  </table>
</main>

{include 'shared/footer.tpl'}
</body>
```
Les variables transmises à `View::assign()` apparaissent sous la forme `{$variable}` dans Smarty.

## 4. Ajouter une entrée de navigation

Modifiez `application/settings/config/navigation/main.json` et ajoutez :
```json
{
  "label": "Products",
  "href":  "/products",
  "icon":  "shopping-bag"
}
```
La navigation est chargée par `JsonNavigation` et rendue par `navigation.tpl`.

## 5. Exécutez-le

Si vous avez le serveur intégré de PHP à portée de main :
```bash
APPLICATION_ENV=development php -S localhost:8080 -t .
```
Visitez <http://localhost:8080/products/>. Vous devriez voir vos trois produits avec le thème cosmique de votre CSS.

## Ajouter une page détaillée

Dans le même contrôleur :
```php
public function detailAction()
{
    $id = (int) ($_REQUEST['id'] ?? 0);
    View::assign([
        'title' => "Product #$id",
        'id'    => $id,
    ]);
}
```
Le `Router` comprend déjà `/produits/détail/42` et `/produits/marduk-gold-plating/42` (forme d'URL SEO — `id` et `slug` sont automatiquement remplis dans `$_REQUEST`).

Créez `application/view/templates/products/detail.tpl` avec n'importe quel balisage que vous souhaitez, et vous avez une application à deux pages.

## Où aller ensuite ?

- [Architecture (MMVC)](/core/architecture/) — comment tous les éléments fonctionnent ensemble.
- [Modules](/core/modules/) — quand passer d'un contrôleur et des traits à un vrai module.
- [Base de données & Migrations](/core/database/) — connecter la page à une table `products` réelle.
