Inicio
NexoPOS

Acción personalizada

Una acción ayuda a realizar una solicitud en una entrada CRUD. De forma predeterminada, NexoPOS incluye las acciones «editar» y «eliminar», que operan directamente sobre la fila seleccionada. Esto te mostrará cómo crear una acción personalizada en una entrada CRUD.

Registrar filtro personalizado

<?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' ]);
    }
}

Vamos a explicar qué está pasando arriba. En primer lugar, registraremos nuestro filtro con el proveedor de servicios de nuestro módulo. Hemos importado 3 clases (Hook, CrudEntry y OrderCrud).

En este ejemplo, intentamos agregar una nueva acción a una entrada CRUD en la tabla de pedidos. Luego agregamos un filtro usando el método "addFilter", que colocará el callback en el método "setActions" de la clase OrderCrud.

Así que cada vez que se llama al método «setActions», se activa la devolución de llamada «customAction» con como parámetro único una instancia de «CrudEntry».

Agregar acción a la instancia de CrudEntry

Ahora, nos centraremos en el método de devolución de llamada, ya que ahí es donde inyectaremos nuestra acción. Ten en cuenta que podemos inyectar más de una acción a la vez. Aquí está cómo definir una acción:

<?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;
    }
}

Tenga en cuenta que aquí, nuestra acción tendrá como identificador “email” y como etiqueta “Email to Customer” (visible para el usuario). Al hacer clic, se realizará una solicitud GET (asíncrona) a la URL proporcionada en el parámetro “url”.

En caso de que quieras que el usuario confirme su acción, puedes agregar una nueva entrada a ese arreglo llamada "confirm" de esta manera:

<?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;
    }
}

Para solicitudes asincrónicas, solo se admiten "GET" y "DELETE". Si desea que el usuario aterrice en una página diferente después de hacer clic en la acción, usará el tipo "GOTO" en lugar de "GET", así:

<?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;
    }
}

Al hacer clic en una acción, el usuario será redirigido a la página indicada en la clave «url».

Realizando solicitudes asíncronas

De forma predeterminada, las solicitudes GET y DELETE realizarán una solicitud asincrónica. Sin embargo, uno de los requisitos es agregar un mensaje de confirmación. Esto debería evitar que el usuario final active una acción por error.

<?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;
    }
}