Action personnalisée
Une action permet d’effectuer une requête sur une entrée CRUD. Par défaut, NexoPOS est livré avec des actions « modifier » et « supprimer » qui s’appliquent directement à la ligne sélectionnée. Cela vous montrera comment créer une action personnalisée sur une entrée CRUD.
Enregistrer le filtre personnalisé
<?php
namespace Modules\YourModule\Providers;
use App\Classes\Hook;
use App\Services\CrudEntry;
use App\Crud\OrderCrud;
class ServiceProvider
{
public function register()
{
Hook::addFilter( OrderCrud::method( 'setActions' ), [ $this, 'customAction' ]);
}
}
Expliquons ce qui se passe ci-dessus. Tout d’abord, nous allons enregistrer notre filtre auprès du fournisseur de services de notre module. Nous avons importé 3 classes (Hook, CrudEntry et OrderCrud).
Dans cet exemple, nous essayons d’ajouter une nouvelle action à une entrée CRUD de la table des commandes. Nous ajoutons ensuite un filtre à l’aide de la méthode « addFilter », qui placera le rappel dans la méthode « setActions » de la classe OrderCrud.
Ainsi, chaque fois que la méthode « setActions » est appelée, le rappel « customAction » est déclenché avec, en tant que paramètre unique, une instance de « CrudEntry ».
Ajouter une action à l’instance CrudEntry
Maintenant, nous allons nous concentrer sur la méthode de rappel, c’est là que nous allons injecter notre action. Notez que nous pouvons injecter plus d’une action à la fois. Voici comment définir une action :
<?php
namespace Modules\YourModule\Providers;
use App\Classes\Hook;
use App\Services\CrudEntry;
use App\Crud\OrderCrud;
class ServiceProvider
{
public function regiser()
{
Hook::addFilter( OrderCrud::method( 'setActions' ), [ $this, 'customAction' ]);
}
public function customAction( CrudEntry $crudEntry )
{
$crudEntry->action(
label: 'Email to Customer',
identifier: 'email',
type: 'GET',
url: url( '/api/your/slug/' . $crudEntry->id )
);
return $entry;
}
}
Notez qu’ici, notre action aura comme identifiant « email » et comme libellé « Email au client » (visible par l’utilisateur). Lorsqu’elle est cliquée, une requête GET (asynchrone) sera effectuée vers l’URL fournie dans le paramètre « url ».
Si vous souhaitez demander à l’utilisateur de confirmer son action, vous pouvez ajouter une nouvelle entrée à ce tableau nommée « confirm », comme ceci :
<?php
namespace Modules\YourModule\Providers;
use App\Classes\Hook;
use App\Services\CrudEntry;
use App\Crud\OrderCrud;
class ServiceProvider
{
public function regiser()
{
Hook::addFilter( OrderCrud::method( 'setActions' ), [ $this, 'customAction' ]);
}
public function customAction( CrudEntry $crudEntry )
{
$crudEntry->action(
label: 'Email to Customer',
type: 'GET',
url: url( '/api/your/slug/' . $crudEntry->id ),
confirm: [
'message' => 'Would you like to send this as an email?'
]
);
return $entry;
}
}
Pour les requêtes asynchrones, seuls « GET » et « DELETE » sont pris en charge. Si vous souhaitez que l’utilisateur accède à une autre page après avoir cliqué sur l’action, utilisez le type « GOTO » au lieu de « GET », comme ceci :
<?php
namespace Modules\YourModule\Providers;
use App\Classes\Hook;
use App\Services\CrudEntry;
use App\Crud\OrderCrud;
class ServiceProvider
{
public function regiser()
{
Hook::addFilter( OrderCrud::method( 'setActions' ), [ $this, 'customAction' ]);
}
public function customAction( CrudEntry $crudEntry )
{
$crudEntry->action(
lable: 'Email to customer',
type: 'GOTO',
url: url( '/api/your/slug/' . $crudEntry->id ),
confirm: [
'message' => 'Would you like to send this as an email?'
]
);
return $entry;
}
}
En cliquant sur une action, l’utilisateur sera redirigé vers la page indiquée par la clé « url ».
Exécution de requêtes asynchrones
Par défaut, les requêtes GET et DELETE effectueront une requête asynchrone. Toutefois, l’une des exigences est d’ajouter un message de confirmation. Cela doit empêcher l’utilisateur final de déclencher une action par erreur.
<?php
namespace Modules\YourModule\Providers;
use App\Classes\Hook;
use App\Services\CrudEntry;
use App\Crud\OrderCrud;
class ServiceProvider
{
public function regiser()
{
Hook::addFilter( OrderCrud::method( 'setActions' ), [ $this, 'customAction' ]);
}
public function customAction( CrudEntry $crudEntry )
{
$crudEntry->action(
label: 'Refresh Product',
type: 'GET',
url: url( '/api/your/slug/' . $crudEntry->id ),
confirm: [
'message' => 'Would you like to refresh the products ?'
]
);
return $entry;
}
}