Skip to content

Surcharger une vue ​

Changer l'apparence d'une page — front ou back-office — sans éditer le cœur ni le thème : c'est la cascade de vues Laravel, et c'est sans configuration.

Le principe ​

Les vues du front sont publiées sous le namespace frontend::. Celles du back-office (back.*) sont livrées par le cœur comme un emplacement de vues secondaire. Dans les deux cas, Laravel résout d'abord une vue de même chemin dans votre application. Il suffit donc de la recréer sous resources/views/ (voir la doc Laravel pour les vues à namespace).

Surcharger une vue du front ​

Le frontend expose ses vues sous frontend::. Déposez la vôtre au même chemin sous resources/views/vendor/frontend/ :

resources/views/vendor/frontend/products/show.blade.php   ← remplace la fiche produit
resources/views/vendor/frontend/layouts/front.blade.php   ← remplace le layout

Surcharger une vue du back-office ​

Les vues back.* du cœur n'ont pas de namespace. Recréez leur chemin directement sous resources/views/, sans passer par vendor/ :

resources/views/back/products/edit.blade.php             ← remplace l'écran d'édition produit
resources/views/back/products/sections/stock.blade.php   ← remplace la seule section « stock »

Gardez la charpente

L'écran d'édition produit n'écrit pas ses onglets en dur : il rend <x-back.form-layout screen="back.products.edit" :context="[…]"/>, et ses onglets et sections viennent du FormLayoutRegistry. Si vous recréez edit.blade.php, conservez cet appel. Sans lui, les onglets et sections apportés par les packages disparaissent de l'écran.

Surcharger sans tout réécrire ​

Recréer une vue entière vous fait perdre ses futures évolutions. Préférez, quand c'est possible :

  • un hook de vue (ViewHookRegistry) pour ajouter un onglet ou une section sans toucher au reste. C'est non destructif et compatible avec les mises à jour ;
  • la charpente des écrans de fiche (FormLayoutRegistry) pour déplacer une section du cœur vers un autre onglet (moveSection()), la réordonner, ou lui substituer votre propre vue en réenregistrant sa clé ;
  • la surcharge ciblée d'un composant ou d'une section plutôt que de la page complète ;
  • pour un listing, le DatatableExtensionRegistry (une colonne) ou le BulkActionRegistry (une action groupée), déclarés sous l'id du listing (products, categories…), sans forker la datatable.

Réenregistrer une section sous une clé existante remplace sa déclaration. Votre vue prend alors la place de celle du cœur, et le reste de l'écran continue de suivre les mises à jour :

php
use Slab\Framework\Core\View\Contracts\FormLayoutRegistry;

$this->app->booted(function () {
    $layout = $this->app->make(FormLayoutRegistry::class);

    // Même clé « stock » : votre vue remplace celle du cœur, dans le même onglet.
    $layout->section('back.products.edit', 'stock', 'mon-package::products.stock', 'general', priority: 50);
});

Le remplacement porte sur toute la déclaration, pas seulement sur la vue. Si la section d'origine avait une condition (when) ou se rangeait dans la colonne étroite (aside: true, comme les blocs en marge de back.orders.show), reprenez ces arguments. Sinon, votre section s'affiche dans tous les cas, et dans la colonne principale. moveSection(), en revanche, conserve la condition, la priorité et la colonne de la section qu'il déplace.

TIP

Rien ne garantit l'ordre dans lequel les providers s'enregistrent. Passez donc par booted() dès que vous touchez à une déclaration du cœur : vous passez ainsi après lui, et c'est votre version qui est retenue.

Et les view-models ? ​

Les composants front à classe (<x-front.cart>, <x-front.cart.totals>…) se remplacent par le conteneur :

php
$this->app->bind(
    \Slab\Frontend\View\Components\Front\Cart\Totals::class,
    App\View\Components\Front\Cart\MesTotaux::class,
);

Voir aussi ​