Plusieurs widgets sur une seule page
Montez deux grilles Xcrud indépendantes ou plus, côte à côte, sur une seule page avec Xcrud::get_instance().
get_instance() n'est pas un véritable singleton
Malgré son nom (conservé pour la rétrocompatibilité avec le propre get_instance() de l'ancien xCrud), chaque appel à Xcrud::get_instance() renvoie une instance flambant neuve, configurée indépendamment - jamais une instance partagée. C'est ce qui rend sûr le montage de plusieurs widgets sur une même page : configurer table()/les colonnes/les options du second widget ne se répercute jamais sur le premier.
Exemple : deux grilles sur une page
Chaque widget a besoin de son propre table() et, surtout, de sa propre valeur route() unique - la route est ce que le widget côté client utilise pour adresser ses propres appels AJAX, si bien que deux widgets partageant une même route entreraient en collision :
$xcrud1 = Xcrud::get_instance();
$xcrud1->table('orders');
$xcrud1->route('multi-orders');
$xcrud1->title('Orders');
$xcrud1->columns('orderNumber,orderDate,status,customerNumber');
$xcrud2 = Xcrud::get_instance();
$xcrud2->table('payments');
$xcrud2->route('multi-payments');
$xcrud2->title('Payments');
$xcrud2->columns('customerNumber,checkNumber,paymentDate,amount');
$xcrud3 = Xcrud::get_instance();
$xcrud3->table('customers');
$xcrud3->route('multi-customers');
$xcrud3->title('Customers');
?><main>
<section>
<h2>Orders</h2>
<?php echo $xcrud1->render(); ?>
</section>
<section>
<h2>Payments</h2>
<?php echo $xcrud2->render(); ?>
</section>
<section>
<h2>Customers</h2>
<?php echo $xcrud3->render(); ?>
</section>
</main>
Une page montant plusieurs widgets de cette façon produit son propre document HTML complet (plutôt que de simplement configurer un $xcrud pour l'habillage automatique du routeur) - la même forme que pages/multi.php et pages/admin.php utilisent déjà. Une caractéristique mineure et sans conséquence d'appeler ->render() plus d'une fois sur une page : les balises <link>/<script> CSS/JS du thème propres à chaque appel sont émises à nouveau - les navigateurs dédupliquent correctement un src/href identique, c'est juste un peu de balisage redondant.
Pourquoi cela compte
Avant que ce comportement ne soit corrigé, get_instance() renvoyait le même objet à chaque fois, si bien qu'un second appel à ->table() modifiait cette même instance déjà configurée par le premier widget - non seulement en changeant la table ciblée, mais en laissant également attaché tout autre réglage déjà accumulé (columns(), highlight(), etc.) de la première configuration. Le fait que chaque appel produise une instance neuve est ce qui permet à des widgets indépendants de coexister en toute sécurité sur une même page.