ilbronza/crud

:crud_manager

Maintainers

Package info

github.com/ilBronza/CRUDController

Homepage

pkg:composer/ilbronza/crud

Transparency log

Statistics

Installs: 300

Dependents: 1

Suggesters: 0

Stars: 1

Open Issues: 0

2.1 2024-03-14 14:54 UTC

This package is auto-updated.

Last update: 2026-07-30 09:08:00 UTC


README

Latest Version on Packagist Total Downloads Build Status StyleCI

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 flag
  • CRUDUpdateEditorBatchReadTrait::returnFieldsFromEditor() — legge ogni campo da $model->{$field} e ritorna la mappa values

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.