/

Mehrere Widgets auf einer Seite

Zwei oder mehr unabhängige Xcrud-Grids nebeneinander auf einer einzigen Seite mit Xcrud::get_instance() einbinden.

get_instance() ist kein echtes Singleton

Trotz des Namens (aus Gründen der Abwärtskompatibilität mit dem get_instance() des alten xCrud beibehalten) liefert jeder Aufruf von Xcrud::get_instance() eine brandneue, unabhängig konfigurierte Instanz zurück - niemals eine geteilte. Das macht es sicher, mehrere Widgets auf einer Seite einzubinden: Die Konfiguration von table()/Spalten/Optionen des zweiten Widgets sickert nie in das erste zurück.

Beispiel: zwei Grids auf einer Seite

Jedes Widget braucht sein eigenes table() und, entscheidend, seinen eigenen eindeutigen route()-Wert - die Route ist das, worüber das clientseitige Widget seine eigenen AJAX-Aufrufe adressiert, sodass zwei Widgets mit derselben Route kollidieren würden:

$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>

Eine Seite, die auf diese Weise mehrere Widgets einbindet, erzeugt ihre eigene vollständige HTML-Ausgabe (statt nur ein $xcrud für das automatische Wrapping des Routers zu konfigurieren) - dieselbe Struktur, die pages/multi.php und pages/admin.php bereits verwenden. Eine kleine, harmlose Eigenheit beim mehrfachen Aufruf von ->render() auf einer Seite: Die eigenen Theme-CSS/JS-<link>/<script>-Tags jedes Aufrufs werden erneut ausgegeben - Browser deduplizieren ein identisches src/href problemlos, es ist nur etwas redundantes Markup.

Warum das wichtig ist

Bevor dieses Verhalten korrigiert wurde, lieferte get_instance() jedes Mal dasselbe Objekt zurück, sodass ein zweiter ->table()-Aufruf genau die Instanz veränderte, die das erste Widget bereits konfiguriert hatte - nicht nur die Tabelle wurde umgeschaltet, sondern auch jede andere bereits angesammelte Einstellung (columns(), highlight() und so weiter) aus der ersten Konfiguration blieb daran hängen. Dass jeder Aufruf eine frische Instanz liefert, ist es, was unabhängigen Widgets erlaubt, sicher auf einer Seite nebeneinander zu bestehen.