ilbronza / crud
:crud_manager
This package is auto-updated.
Last update: 2026-07-30 09:08:00 UTC
README
This is where your description should go. Take a look at contributing.md to see a to do list.
Installation
Before install media library (https://github.com/spatie/laravel-medialibrary)
Before install spatie permissions (https://github.com/spatie/laravel-medialibrary)
Before install activity log (https://spatie.be/docs/laravel-activitylog/v4/introduction) USE php artisan vendor:publish to publish activity-log migrations and config. Installation is bugged
Via Composer
$ composer require ilbronza/crud
$ php artisan notifications:table $ php artisan migrate $ php artisan vendor:publish --tag=crud-migrations $ php artisan migrate
on config/media-library.php
'media_model' => IlBronza\CRUD\Models\Media::class, 'path_generator' => IlBronza\CRUD\Helpers\MediaPathGenerator::class,
on app.js and then run npm
require('./ilBronza.crud.js');
Usage
Broadcast delle modifiche CRUD
Il broadcast è opzionale e pubblica sul canale privato configurato un evento
crud.model.changed con questo payload:
{
"model": "App\\Models\\Order",
"key": 42,
"text": "Order updated",
"action": "updated",
"origin": {
"browserTabId": "5a91610f-29f5-48ec-bb66-bdf46b3a12a3",
"tableId": "orders"
}
}
origin è opzionale. Quando una modifica proviene da una DataTable, il
browser invia X-IB-Datatable-Browser-Tab-Id e
X-IB-Datatable-Table-Id; l'evento li cattura alla costruzione, prima di
un'eventuale coda, e li ripubblica come metadati di correlazione. Non usare
questi valori per autorizzazione o autenticazione.
Per action: "created", il client usa key (la chiave primaria effettiva,
non necessariamente un intero) per decidere se recuperare la riga e
aggiungerla alla propria tabella. Questo evita di definire nel package un
formato di riga comune a CRUD e DataTables.
Il canale per App\Models\Order è
channel.crud-events.models.order. Abilitare CRUD_BROADCAST_ENABLED=true e
autorizzare i canali privati in routes/channels.php dell'applicazione:
Broadcast::channel('channel.crud-events.models.{modelClass}', fn ($user) => $user !== null);
Con Laravel Echo il listener è:
Echo.private('channel.crud-events.models.order') .listen('.crud.model.changed', (event) => { console.log(event.model, event.key, event.text); });
Il testo libero si personalizza nel controller CRUD; restituire null evita
l'invio per quella specifica azione. Le creazioni sono intercettate dai model
base, quindi vengono inviate anche quando avvengono fuori da un controller CRUD:
class Order extends BaseModel {}
public function getCrudBroadcastText(Model $model, string $action): ?string { return "Ordine {$model->getKey()} {$action}"; }
Il prefisso è configurabile con CRUD_BROADCAST_CHANNEL; per usare una
convenzione diversa, sovrascrivere getCrudBroadcastChannel().
Gli invii standard del controller sono effettuati dopo update (anche inline
editor), delete, force-delete e archive. I model che estendono BaseModel o
BasePivotModel emettono created indipendentemente dal controller che li ha
generati. Anche touch() conserva il comportamento Eloquent e, se aggiorna il
timestamp, emette un evento updated sul canale del model. Per disabilitarlo
su un model specifico, sovrascrivere getCrudTouchedBroadcastText() e
restituire null.
Ogni canale effettivamente usato viene registrato una sola volta in
crud__channels (name, timestamp). Per creare la tabella, pubblicare e
applicare le migration del package:
php artisan vendor:publish --tag=crud-migrations php artisan migrate
Le azioni custom possono inviare direttamente un testo libero:
$this->broadcastCrudMessage($order, 'Il pagamento è stato confermato', 'paymentConfirmed');
Batch field read (ib-editor-read-batch)
Oltre al read singolo (ib-editor-read + field), la route di update accetta una lettura cumulativa di più campi in una sola richiesta. Viene usata dal coordinatore batch di FormField (vedi readme di ilbronza/formfield).
Richiesta (PUT via _method sulla stessa route di update):
ib-editor-read-batch: true
fields[]: total_cost
fields[]: total_revenue
Risposta:
{
"success": true,
"fetch-fields-batch": true,
"values": { "total_cost": 123.45, "total_revenue": 456.78 },
"model-id": "..."
}
Il flusso è gestito da:
CrudRequestHelper::isEditorBatchReadRequest()— riconosce il flagCRUDUpdateEditorBatchReadTrait::returnFieldsFromEditor()— legge ogni campo da$model->{$field}e ritorna la mappavalues
Il trait è incluso automaticamente da CRUDUpdateTrait; il read singolo returnFieldFromEditor resta invariato.
Relazioni
creare un getter con i possibili valori di relazione in un select
public function getPossiblePaymenttypesValuesArray() : array { return Paymenttype::getProjectClassName()::all()->pluck('name', 'id')->toArray(); }
RelationshipsManager
Gestisce il display delle relazioni in una pagina di dettaglio, tipicamente Show o Edit
Dichiarazione
<?php class QuotationRelationManager Extends RelationshipsManager { public function getAllRelationsParameters() : array { return [ 'show' => [ 'relations' => [ # dichiarazione complessa, dove vengono specificati parametri aggiuntivi oltre al controller 'quotationrows' => [ 'controller' => config('products.models.quotationrow.controllers.index'), 'elementGetterMethod' => 'getQuotationrowsForShowRelation', #alternativo a fieldsGroups 'fieldsGroupsParametersFile' => config('products.models.quotationrow.fieldsGroupsFiles.byQuotation'), #alternativo a fieldsGroupsParametersFile 'fieldsGroups' => [ 'base' => [ 'translationPrefix' => 'operators::fields', 'fields' => [ 'mySelfPrimary' => 'primary', 'mySelfEdit' => 'links.edit', 'contracttype.name' => 'flat', 'internal_approval_rating' => 'flat', 'level' => 'flat', 'cost_company_day' => 'flat', 'cost_gross_day' => 'flat', 'cost_neat_day' => 'flat', 'mySelfDelete' => 'links.delete' ] ] ] ], # dichiarazione semplice in cui si specifica solo il controller di Show 'project' => config('products.models.project.controllers.show'), # dichiarazione semplice in cui si specifica solo il controller di Index, che si occupa # di impostare i fieldsgroup tramite il suo metodo "getRelatedFieldsArray" 'dossiers' => config('filecabinet.models.dossier.controllers.index'), ] ] ]; } }``` ## Change log Please see the [changelog](changelog.md) for more information on what has changed recently. ## Testing ``` bash $ composer test
Contributing
Please see contributing.md for details and a todolist.
Security
If you discover any security related issues, please email author email instead of using the issue tracker.
Credits
License
license. Please see the license file for more information.